AT24C02 E2PROM芯片详解
24C02是一个2K Bit的串行EEPROM存储器(掉电不丢失),内部含有256个字节。在24C02里面有一个8字节的页写缓冲器。
- A0,A1,A2:硬件地址引脚
- WP:写保护引脚,接高电平只读,接地允许读和写
- SCL和SDA:IIC总线
- VCC和GND: 电源线和地线
下图为芯片从地址:
以看出对于不同大小的24Cxx,具有不同的从器件地址。由于24C02为2k容量,也就是说只需要参考图中第一行的内容:
芯片的寻址:
AT24C设备地址为如下,前四位固定为1010,A2~A0为由管脚电平。AT24CXX EEPROM Board模块中默认为接地。A2~A0为000,最后一位表示读写操作。所以AT24Cxx的读地址为0xA1,写地址为0xA0。
也就是说如果是
写24C02的时候,从器件地址为10100000(0xA0);
读24C02的时候,从器件地址为10100001(0xA1)。
片内地址寻址:
芯片寻址可对内部256B中的任一个进行读/写操作,其寻址范围为00~FF,共256个寻址单位。
对应的修改 A2A1A0 三位数据即可
IIC 主设备/从设备:
通常我们为了方便把IIC设备分为主设备和从设备,基本上谁控制时钟线(即控制SCL的电平高低变换)谁就是主设备。
-
IIC主设备功能:主要产生时钟,产生起始信号和停止信号
-
IIC从设备功能:可编程的IIC地址检测,停止位检测
IIC的协议层
I2C 总线在传送数据过程*有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。
- 开始信号:SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。
- 结束信号:SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。
- 应答信号:接收数据的 IC 在接收到 8bit 数据后,向发送数据的 IC 发出特定的低电平脉冲,表示已收到数据。CPU 向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU 接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。
IIC 总线时序图:
起始条件:在SCL高电平期间,SDA由高到低的一个下降沿;
停止条件:在SCL高电平期间,SDA由低到高的一个上升沿;
IIC的数据有效性:
在SCL的高电平期间,SDA是不允许变化的;而只有在时钟线SCL的低电平期间,SDA才能够出现变化;
应答信号
每当主机向从机发送完一个字节的数据,主机总是需要等待从机给出一个应答信号,以确认从机是否成功接收到了数据,
应答信号:主机SCL拉高,读取从机SDA的电平,为低电平表示产生应答
在了解了IIC的基础知识之后。我们就对AT24C02进行操作讲解:
向AT24C02中写数据
操作时序:
- MCU先发送一个开始信号(START)启动总线
- 接着跟上首字节,发送器件写操作地址(DEVICE ADDRESS)+写数据(0xA0)
- 等待应答信号(ACK)
- 发送数据的存储地址。24C02一共有256个字节的存储空间,地址从0x00~0xFF,想把数据存储>在哪个位置,此刻写的就是哪个地址。
- 发送要存储的数据第一字节、第二字节、…注意在写数据的过程中,E2PROM每个字节都会>回应一个“应答位0”,老告诉我们写E2PROM数据成功,如果没有回应答位,说明写入不成功。
- 发送结束信号(STOP)停止总线
注意:
在写数据的过程中,每成功写入一个字节,E2PROM存储空间的地址就会自动加1,当加到0xFF后,再写一个字节,地址就会溢出又变成0x00。
写数据的时候需要注意,E2PROM是先写到缓冲区,然后再“搬运到”到掉电非易失区。所以这个过程需要一定的时间,AT24C02这个过程是不超过5ms!
所以,当我们在写多个字节时,写入一个字节之后,再写入下一个字节之前,必须延时5ms才可以
从AT24C02中读数据
读当前地址的数据
2、读随机地址的数据
- MCU先发送一个开始信号(START)启动总线
- 接着跟上首字节,发送器件写操作地址(DEVICE ADDRESS)+写数据(0xA0)
注意:这里写操作是为了要把所要读的数据的存储地址先写进去,告诉E2PROM要读取哪个地址的数据。- 发送要读取内存的地址(WORD ADDRESS),通知E2PROM读取要哪个地址的信息。
- 重新发送开始信号(START)
- 发送设备读操作地址(DEVICE ADDRESS)对E2PROM进行读操作 (0xA1)
- E2PROM会自动向主机发送数据,主机读取从器件发回的数据,在读一个字节后,MCU会回应一个应答信号(ACK)后,E2PROM会继续传输下一个地址的数据,MCU不断回应应答信号可以不断读取内存的数据
- 如果不想读了,告诉E2PROM不想要数据了,就发送一个“非应答位NAK(1)”。发送结束信号(STOP)停止总线
3、连续读数据
E2PROM支持连续写操作,操作和单个字节类似,先发送设备写操作地址(DEVICE ADDRESS),然后发送内存起始地址(WORD ADDRESS),MCU会回应一个应答信号(ACK)后,E2PROM会继续传输下一个地址的数据,MCU不断回应应答信号可以不断读取内存的数据。E2PROM的地址指针会自动递增,数据会依次保存在内存中。不应答发送结束信号后终止传输。
代码:
//IIC发送数据
//address 要写入的地址
//date 要写入的数据
void write_add(uchar address,uchar date)
{
IIC_Start();
IIC_Send_Byte(0xA0);
delay(2);
IIC_Send_Byte(address);
delay(2);
IIC_Send_Byte(date);
delay(2);
IIC_Stop();
}
//IIC读取数据
// address 要读取数据的地址
uchar read_add(uchar address) //指定地址读一个字节数据
{
uchar add;
IIC_Start();
IIC_Send_Byte(0xA0);
delay(2);
IIC_Send_Byte(address);
delay(2);
IIC_Start();
IIC_Send_Byte(0xA1);
delay(2);
dd=IIC_Read_Byte();
IIC_Stop();
return add;
}
剩下的IIC以及芯片操作例程已经单独整理成文章,对初学者有很大帮助,如需学习请直接参看:
如果需要IIC的详细原理详解,请参看:
如果需要读取AT24C02例程及代码,请参看:
【STM32】HAL库 STM32CubeMX教程十二—IIC(读取AT24C02 )
本文地址:https://blog.csdn.net/as480133937/article/details/105472659