1.AT24C02简介
AT24C02是一种可以实现掉电不丢失的存储器,可用于保存单片机运行时想要永久保存的数据信息存储介质:E2PROM通讯接口:I2C总线容量:256字节。
AT24C02的引脚及应用电路如下图所示:
AT24C02实现掉电存储/1-1.png)
2.I2C总线简介及原理
I2C总线(Inter IC BUS)是由Philips公司开发的一种通用数据总线。
它具有两根通信线:SCL(Serial Clock)、SDA(Serial Data)。
它有以下特点:同步、半双工,带数据应答。
通用的I2C总线,可以使各种设备的通信标准统一,对于厂家来说,使用成熟的方案可以缩短芯片设计周期、提高稳定性,对于应用者来说,使用通用的通信协议可以避免学习各种各样的自定义协议,降低了学习和应用的难度。
I2C的具体原理如下:
- 所有I2C设备的SCL连在一起,SDA连在一起
- 设备的SCL和SDA均要配置成开漏输出模式
- SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右
- 开漏输出和上拉电阻的共同作用实现了“线与”的功能,此设计主要是为了解决多机通信互相干扰的问题
AT24C02实现掉电存储/2-1.png)
简而言之:在默认状态下,SDA和SCL均处于高电平(置1)(挂起)状态,此时所有设备开关断开,均处于悬空状态;当SDA或SCL置0时,开关闭合,对应导线接地,即处于低电平(置0)(拉低)状态。
通过控制SCL与SDA可以实现开关的闭合,从而实现通信。
3.I2C数据帧
要实现”主机对指定从机发送指定信息”,或”主机从指定从机接收指定信息“的功能,需要多种数据帧进行拼接实现,下面介绍这些数据帧及对应的代码实现:
Start帧与Stop帧:
AT24C02实现掉电存储/3-1.png)
1 | void I2C_Start(){ |
1 | void I2C_Stop(){ |
SendByte帧:
AT24C02实现掉电存储/3-2.png)
1 | void I2C_SendByte(unsigned char Byte){ |
需要注意的是:由于24C02的电气特性中,SCL灵敏度支持的最大频率为1000kHz(即只要电平持续时间大于1μs即可正常读取数据)。而11.0592MHz经过12分频后为921.6KHz,即约1.085μs翻转一下,再翻回来形成一个周期,即2.170μs。
2.170>1,因此I2C_SCL可以直接置1后置0。
同时,还需要满足24C02的电气特性中的时钟高电平宽度要求,该要求要求高电平持续时间至少0.4μs。 2.170>0.4,因此I2C_SCL可以直接置1后置0。
下图为24C02的电气特性表(部分):
AT24C02实现掉电存储/3-5.png)
ReceiveByte帧:
AT24C02实现掉电存储/3-3.png)
1 | unsigned char I2C_ReceiveByte(){ |
SendAck帧与ReceiveAck帧:
Ack帧0表示收到,1表示未收到。
AT24C02实现掉电存储/3-4.png)
1 | void I2C_SendAck(unsigned char Ackbit){//此处也可以用bit类型,bit是C51中特有的数据类型,类似bool型,只有0和1 |
1 | unsigned char I2C_ReceiveAck(){ |
4.AT24C02数据帧
AT24C02的数据帧就由上面的六中最基本的数据帧拼凑而成。具体的拼凑方式及对应代码如下:
字节写:
AT24C02实现掉电存储/4-1.png)
1 | void AT24C02_WriteByte(unsigned char WordAddress,Data){ |
随机读:
AT24C02实现掉电存储/4-2.png)
这里讲解一下随机读的逻辑:
开始→主机声明要读的设备(此处需要SLAVE ADDRESS+W而非SLAVE ADDRESS+R是为了继续发送WordAddress)→主机接收从机的ACK→主机声明读的设备的具体位置(要在该设备的哪个地址写入)主机接收从机的ACK→
重新开始,把控制权交给从机→主机声明要读的设备(要读哪个设备)→主机接收从机的ACK→主机读取从机发到SDA线上的数据→主机发送ACK表示是否接收到从机发来的数据(此处SendAck为0为1均可)→结束
1 | unsigned char AT24C02_ReadByte(unsigned char WordAddress){ |
需要注意的是:AT24C02的固定地址为1010,本开发板上的可配置地址为000,所以SLAVE ADDRESS+W为0xA0,SLAVE ADDRESS+R为0xA1。
5.利用AT24C02实现掉电存储数据
功能如下:
初始状态:LCD1602显示5个0。
按独立按键1:显示数值+1。
按独立按键2:显示数值-1。
按独立按键3:把数据存至AT24C02,显示写入成功。
按独立按键4:将AT24C02中的数据读出,显示读出成功。
具体代码如下:
1 |
|
需要注意的是,同样由于24C02的电气特性,在字节写的时候需要有5ms的延迟确保写入成功,因此需要在AT24C02_WriteByte后Delay(5)。