24C02芯片介绍EEPROM(电可擦可编程只读存储器),电可擦可编程只读存储器——,一种掉电不丢失数据的存储芯片。
24Cxx芯片是EEPROM芯片的一种。它是一种基于IIC总线的存储设备,遵循双线协议。由于其接口方便、体积小、断电不丢失数据等优点,在仪器仪表和工业自动化控制中得到了广泛的应用。24Cxx在电路中的作用主要是在掉电的情况下保存数据。
本文采用24C02芯片,总容量为2k bit(256字节)。这里芯片名称中的02代表总容量。
24C02芯片的引脚分布和具体功能见下图:
24C02引脚图引脚名称描述A0-A2地址输入线SDA数据线SCL时钟线WP写保护VCC GND提供电源下图是本文中24C02和STM32的引脚连接图:
引脚连接图从图中可以看出,A0和A1、A2都是0。
IIC总线上并联的每个IC都有一个唯一的地址。然后再看从设备地址,我们可以看到,对于不同大小的24Cxx,有不同的从设备地址。由于24C02的容量是2k,也就是说我们只需要参考图中第一行的内容:
设备地址以图中内容为准:如果写24C02,从设备地址为10100000(0xa 0);读取24C02时,从机地址为10100001(0xA1)。
24C02芯片的这部分时序图要结合上面的内容来理解:I2C总线的数据传输。
24C02字节写时序
写入时序向24C02芯片写入字节时,步骤如下:
(1)起始位,后接从设备地址位(0xA0),等待应答,以确定24C02在IIC总线上的从设备地址位置;(2)确定操作24C02的地址,等待回复,即将字节写入24C02中256字节的位置;(3)确定需要写入24C02芯片的字节,等待应答,停止该位。24C02字节读取时序
读取时序读取24C02芯片上的字节时,步骤如下:
(1)起始位,后接从设备地址位(0xA0),等待应答,以确定24C02在IIC总线上的从设备地址位置;(2)确定操作24C02的地址,等待回复,即从24C02中的256字节开始读取字节位置;(3)再次启动该位,之后是从机地址位(0xA1),等待应答;(4)获取从24C02芯片读取的字节,发出无响应信号,停止该位。
在数据传输期间,SDA线上的电平必须在SCL为高电平期间保持稳定,只有在SCL为低电平时才允许SDA线上的电平改变状态。并且每个字节首先以高位传输;对于应答信号,ACK=0为有效应答位,表示从机已经成功接收到该字节,如果为1,则表示接收不成功;如果从机需要延迟下一个数据字节的传输,可以通过拉低并保持SCL电平来强制主机进入等待状态;如果主机在完成一次通信后想要继续占用总线进行另一次通信而不释放总线,则需要使用重启信号。它不仅作为上一次数据传输的结束,也作为下一次传输的开始;当总线发生冲突时,根据“低电平优先”的仲裁原则,将总线判给数据线上先发送低电平的主器件;在特殊情况下,如果需要禁止I2C总线上的所有通信,可以封锁或关闭总线,具体操作是对总线上的任何设备锁定SCL为低电平。SDA仲裁和SCL时钟同步没有顺序关系,而是同时进行。读取24C02芯片程序
#定义AT24C01 127 #定义AT24C02 255 #定义AT24C04 511 #定义AT24C08 1023 #定义AT24C16 2047 #定义AT24C32 4095 #定义AT24C64 8191 #定义AT24C128 16383 #定义at24c 256 32767//迷你STM32开发板使用的是24c02,所以定义EE_TYPE为AT24C02 #定义EE_TYPE AT24C02//初始化IIC接口void at 24 XXX _ Init(void){ IIC _ Init();}//在AT24CXX指定地址读出一个数据//ReadAddr:开始读数的地址//返回值:读到的数据u8 at 24 cxx _ ReadOneByte(u16 read addr){ u8 temp=0;IIC _ Start();if(EE_TYPEAT24C16) //为了兼容24Cxx中其他的版本IIC发送字节(0xa 0);//发送写命令IIC _等待_确认();IIC _发送_字节(read addr 8);//发送高地址IIC _等待_确认();}否则IIC _发送_字节(0xa 0((read addr/256)8);//发送高地址} else { IIC _发送_字节(0xa 0((写addr/256)(8 * t))0x ff);} }//在AT24CXX里面的指定地址开始读出长度为低输入联网(低入门网络的缩写)的数据//该函数用于读出16位或者32位的数据. read addr//:开始读出的地址//返回值:数据//Len:要读出数据的长度2,4u 32 at 24 XXX _ ReadLenByte(u16 read addr,u8 Len){ u8t;u32温度=0;for(t=0;t;t);t)审核汤梓红