STM32模擬IIC讀寫AT24CXX
以前只用51做過AT24C02,后來才接觸到容量更大的型號,發(fā)現(xiàn)了很多和以前的不一致的東西,現(xiàn)總結(jié)如下。
在上一篇博客中已經(jīng)寫好了STM32用IO口模擬IIC的基本驅(qū)動代碼,下面結(jié)合數(shù)據(jù)手冊用上一篇博客提到的函數(shù)編寫AT24CXX全系列通用的驅(qū)動代碼。
我們先來看AT24CXX的中文手冊。
這是寫操作的步驟。
而上面提到的從器件的地址信息由下圖所示。
不同的容量的AT24CXX的從器件地址位是不同的。這在后面的基本的讀寫函數(shù)的關(guān)于器件的不同就有所體現(xiàn)。
下面先初始化AT24CXX:
void AT24CXX_Init()
{
IIC_Init();
}
這里只需要初始化IIC總線即可。
下面寫出AT24CXX基本的讀寫函數(shù)
/*在AT24CXX的指定地址讀出一個數(shù)據(jù)*/
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{
u8 temp=0;
IIC_Start();
if(EE_TYPE>AT24C16)
{
IIC_Send_Byte(0XA0);
IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr>>8);//發(fā)送高地址
IIC_Wait_Ack();
}else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); //此處需重點(diǎn)理解
IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr%256);//發(fā)送低地址
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(0XA1);//進(jìn)入接收模式
IIC_Wait_Ack();
temp=IIC_Read_Byte(0);
IIC_Stop();
return temp;
需要重點(diǎn)理解處通過對于EE_TYPE宏定義的判斷,也就是對于型號的選擇,來實(shí)現(xiàn)了對于不同型號的驅(qū)動。
同理,往指定地址寫入一個數(shù)據(jù)的函數(shù)如下:
void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
{
IIC_Start();
if(EE_TYPE>AT24C16)
{
IIC_Send_Byte(0XA0);
IIC_Wait_Ack();
IIC_Send_Byte(WriteAddr>>8);
}else
{
IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));
}
IIC_Wait_Ack();
IIC_Send_Byte(WriteAddr%256);
IIC_Wait_Ack();
IIC_Send_Byte(DataToWrite);
IIC_Wait_Ack();
IIC_Stop();
delay_ms(10); //需注意,有10ms的延時
}
至此,就完成了基本驅(qū)動代碼的編寫。