EEPROM芯片24C02的字节写时序和字节读时序

描述


24C02芯片介绍
EEPROM (Electrically Erasable Programmable read only memory),带电可擦可编程只读存储器——一种掉电后数据不丢失的存储芯片。

       24Cxx芯片是EEPROM芯片的一种,它是基于IIC总线的存储器件,遵循二线制协议,由于其具有接口方便,体积小,数据掉电不丢失等特点,在仪器仪表及工业自动化控制中得到大量的应用。24Cxx在电路的作用主要是在掉电的情况下保存数据。

       本文使用的是24C02芯片,总容量是2k个bit(256个字节)。这里芯片名称里的02代表着总容量。

       24C02芯片的引脚分布和具体的作用见下图:

IIC总线24C02 引脚图
引脚名称 说明
A0-A2 地址输入线
SDA 数据线
SCL 时钟线
WP 写保护
GND、VCC 提供电源


下图是本文中24C02和STM32的引脚连接图:

IIC总线引脚连接图

       从图中可以看出:A0、A1、A2都为0。

      对于并联在一条IIC总线上的每个IC都有唯一的地址。那么看一下从器件地址,可以看出对于不同大小的24Cxx,具有不同的从器件地址。由于24C02为2k容量,也就是说只需要参考图中第一行的内容:

IIC总线设备地址

根据图中的内容:如果是写24C02的时候,从器件地址为10100000(0xA0);读24C02的时候,从器件地址为10100001(0xA1)。

24C02芯片的时序图
这部分的内容应结合上文:I2C总线的数据传送的内容一起理解。

24C02字节写时序

IIC总线写时序


      对24C02芯片进行写字节操作的时候,步骤如下:

     (1) 开始位,后面紧跟从器件地址位(0xA0),等待应答,这是为了在IIC总线上确定24C02的从地址位置;
     (2) 确定操作24C02的地址,等待应答,也就是将字节写入到24C02中256个字节中的位置;
     (3) 确定需要写入24C02芯片的字节,等待应答,停止位。
24C02字节读时序

IIC总线读时序


对24C02芯片进行读字节操作的时候,步骤如下:

(1) 开始位,后面紧跟从器件地址位(0xA0),等待应答,这是为了在IIC总线上确定24C02的从地址位置;
(2) 确定操作24C02的地址,等待应答,也就是从24C02中256个字节中读取字节的位置;
(3) 再次开始位,后面紧跟从器件地址位(0xA1),等待应答;
(4) 获取从24C02芯片中读取的字节,发出非应答信号,停止位。

       进行数据传送时,在SCL为高电平期间,SDA线上电平必须保持稳定,只有SCL为低时,才允许SDA线上电平改变状态。并且每个字节传送时都是高位在前;
       对于应答信号,ACK=0时为有效应答位,说明从机已经成功接收到该字节,若为1则说明接受不成功;
       如果从机需要延迟下一个数据字节开始传送的时间,可以通过把SCL电平拉低并保持来强制主机进入等待状态;
       主机完成一次通信后还想继续占用总线在进行一次通信,而又不释放总线,就要利用重启动信号。它既作为前一次数据传输的结束,又作为后一次传输的开始;
       总线冲突时,按“低电平优先”的仲裁原则,把总线判给在数据线上先发送低电平的主器件;
       在特殊情况下,若需禁止所有发生在I2C总线上的通信,可采用封锁或关闭总线,具体操作为在总线上的任一器件将SCL锁定在低电平即可;
       SDA仲裁和SCL时钟同步处理过程没有先后关系,而是同时进行的。
       读取24C02芯片程序

#define AT24C01  127
#define AT24C02  255
#define AT24C04  511
#define AT24C08  1023
#define AT24C16  2047
#define AT24C32  4095
#define AT24C64     8191
#define AT24C128 16383
#define AT24C256 32767  
//Mini STM32开发板使用的是24c02,所以定义EE_TYPE为AT24C02
#define EE_TYPE AT24C02
//初始化IIC接口
void AT24CXX_Init(void)
{
IIC_Init();
}
//在AT24CXX指定地址读出一个数据
//ReadAddr:开始读数的地址  
//返回值  :读到的数据
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{      
u8 temp=0;                          
       IIC_Start();  
if(EE_TYPE>AT24C16)            //为了兼容24Cxx中其他的版本
{
 IIC_Send_Byte(0XA0);    //发送写命令
 IIC_Wait_Ack();
 IIC_Send_Byte(ReadAddr>>8);    //发送高地址
 IIC_Wait_Ack();   
}else      IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));   //发送器件地址0XA0,写数据   

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;
}
//在AT24CXX指定地址写入一个数据
//WriteAddr  :写入数据的目的地址    
//DataToWrite:要写入的数据
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));   //发送器件地址0XA0,写数据 
}  
IIC_Wait_Ack();    
       IIC_Send_Byte(WriteAddr%256);   //发送低地址
IIC_Wait_Ack();                    
IIC_Send_Byte(DataToWrite);     //发送字节          
IIC_Wait_Ack();            
       IIC_Stop();    //产生一个停止条件 
delay_ms(10);  
}
//在AT24CXX里面的指定地址开始写入长度为Len的数据
//该函数用于写入16bit或者32bit的数据.
//WriteAddr  :开始写入的地址  
//DataToWrite:数据数组首地址
//Len        :要写入数据的长度2,4
void AT24CXX_WriteLenByte(u16 WriteAddr,u32 DataToWrite,u8 Len)
{   
u8 t;
for(t=0;t>(8*t))&0xff);
}                
}

//在AT24CXX里面的指定地址开始读出长度为Len的数据
//该函数用于读出16bit或者32bit的数据.
//ReadAddr   :开始读出的地址 
//返回值     :数据
//Len        :要读出数据的长度2,4
u32 AT24CXX_ReadLenByte(u16 ReadAddr,u8 Len)
{   
u8 t;
u32 temp=0;
for(t=0;t
;t++)>;t++)>

  审核编辑:汤梓红
 
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分