AT24C02
- 目的:存储数据
-
- 原理
-
- 写入
- 读出
目的:存储数据
做一件事,首先了解他的目的,我们使用AT24C03是为了存储数据在eeprom中,达到断电仍可保存的目的。
于是我们就需要弄清如何将数据写入 以及 如何读出写入的数据。
我将以最简单的方式教你依据数据手册 写出 存储数据的程序。
原理
写入
从上图可以发现,却认为的SDA为低电平~,我们有官方给的驱动里可以找到这么一个函数
void IIC_SendAck(bit ackbit)
{
SCL = 0;
SDA = ackbit; // 0:应答,1:非应答
IIC_Delay(DELAY_TIME);
SCL = 1;
IIC_Delay(DELAY_TIME);
SCL = 0;
SDA = 1;
IIC_Delay(DELAY_TIME);
}
IIC_SendAck(0)可以作为发送应答~
控制字节的高四位 1010 = 9
低4位由A0,A1,A2, 0 组成,其中A0,A1,A2电平 表示选择哪一个AT24C02,注意
起始位: start
控制字节: 一般来说 为0x90
确认位: 上面我们提及的发送应答,将SDA置0;
地址字节:存储数据的地址,AT24xx00的器件,只使用地址字节的低四位,所以存储地址为0~255
数据字节: 我们想存储的数据
P: 停止位
请注意确认位的正确书写,不能少写也不能多写,只有应答了,单片机才清楚你已经执行上一步,他才会准备下一步要做什么。否则程序将停滞不前或者跑飞
void W_at24c02(u8 address,u8 dat)
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_SendAck(0);
IIC_SendByte(address);
IIC_SendAck(0);
IIC_SendByte(dat);
IIC_SendAck(0);
IIC_Stop();
}
读出
由芯片手册,我们看出随机读取操作才能正确的将我们当前存储地址的数据 读取出来,而当前读取操作会 读取到我们写入地址再+1 的地址,里面没有存储我们的数据。
并且,随机读取,需要先发送字节地址(此时为写操作),字节地址发送完毕后,主器件收到确认信号就产生起始条件。
下面是代码流程:
s起始位: start
控制字节: 0x90(此时为写如)
确认位: 上面我们提及的发送应答,将SDA置0;
地址字节:之前我们写入过数据的地址
确认位: 将SDA置0;
s起始位: start
控制字节: 0x91(此时为读操作)
数据字节: 读取 之前发送的地址字节 里的数据
这里没有确认位
P: 停止位
u8 R_at24c02(u8 address)
{
u8 temp;
IIC_Start();
IIC_SendByte(0xa0);
IIC_SendAck(0);
IIC_SendByte(address);
IIC_SendAck(0);
IIC_Start();
IIC_SendByte(0xa1);
IIC_SendAck(0);
temp = IIC_RecByte();
IIC_Stop();
return temp;
}