STM32模拟IIC读写AT24CXX

以前只用51做过AT24C02,后来才接触到容量更大的型号,发现了很多和以前的不一致的东西,现总结如下。

在上一篇博客中已经写好了STM32用IO口模拟IIC的基本驱动代码,下面结合数据手册用上一篇博客提到的函数编写AT24CXX全系列通用的驱动代码。

我们先来看AT24CXX的中文手册。

这是写操作的步骤。

而上面提到的从器件的地址信息由下图所示。

 

不同的容量的AT24CXX的从器件地址位是不同的。这在后面的基本的读写函数的关于器件的不同就有所体现。

下面先初始化AT24CXX:

void AT24CXX_Init()

{

      IIC_Init();

}

这里只需要初始化IIC总线即可。

 

下面写出AT24CXX基本的读写函数

/*在AT24CXX的指定地址读出一个数据*/

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);   //发送高地址
  IIC_Wait_Ack();  
 }else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));       //此处需重点理解

 IIC_Wait_Ack(); 
IIC_Send_Byte(ReadAddr%256);    //发送低地址
 IIC_Wait_Ack();    
 IIC_Start();       
 IIC_Send_Byte(0XA1);                //进入接收模式
 IIC_Wait_Ack();  
 temp=IIC_Read_Byte(0);     
 IIC_Stop();     
 return temp;

 

需要重点理解处通过对于EE_TYPE宏定义的判断,也就是对于型号的选择,来实现了对于不同型号的驱动。

同理,往指定地址写入一个数据的函数如下:

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的延时
}

至此,就完成了基本驱动代码的编写。

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页