STM32模擬IIC讀寫(xiě)AT24CXX
以前只用51做過(guò)AT24C02,后來(lái)才接觸到容量更大的型號(hào),發(fā)現(xiàn)了很多和以前的不一致的東西,現(xiàn)總結(jié)如下。
在上一篇博客中已經(jīng)寫(xiě)好了STM32用IO口模擬IIC的基本驅(qū)動(dòng)代碼,下面結(jié)合數(shù)據(jù)手冊(cè)用上一篇博客提到的函數(shù)編寫(xiě)AT24CXX全系列通用的驅(qū)動(dòng)代碼。
我們先來(lái)看AT24CXX的中文手冊(cè)。
這是寫(xiě)操作的步驟。
而上面提到的從器件的地址信息由下圖所示。
不同的容量的AT24CXX的從器件地址位是不同的。這在后面的基本的讀寫(xiě)函數(shù)的關(guān)于器件的不同就有所體現(xiàn)。
下面先初始化AT24CXX:
void AT24CXX_Init()
{
IIC_Init();
}
這里只需要初始化IIC總線即可。
下面寫(xiě)出AT24CXX基本的讀寫(xiě)函數(shù)
/*在AT24CXX的指定地址讀出一個(gè)數(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)理解處通過(guò)對(duì)于EE_TYPE宏定義的判斷,也就是對(duì)于型號(hào)的選擇,來(lái)實(shí)現(xiàn)了對(duì)于不同型號(hào)的驅(qū)動(dòng)。
同理,往指定地址寫(xiě)入一個(gè)數(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的延時(shí)
}
至此,就完成了基本驅(qū)動(dòng)代碼的編寫(xiě)。





