1.AT24C02数据手册使用
a. AT24C02 features:
工作电压: 2.7V-5.5V(1.8V-5.5V)
通信协议:I2C
容量:2K
数据保留时长:100年
b.原理图接线说明:
板子实际接线:
注意:SCL,SDA要上拉电阻,用来输出高电平;
WP接地,允许正常的读/写的操作;
地址范围:AT24C02为8位(0x00-0xff)
二、设备操作
(1)写数据
BYTE WRITE:写入操作需要在器件地址字和确认之后使用 8 位数据字地址。收到此地址后,EEPROM 将再次响应 0,然后输入第一个 8 位数据字。收到 8 位数据字后,EEPROM 将输出一个零,寻址器件(如微控制器)必须以停止条件终止写入序列。此时, EEPROM 进入内部定时写入周期 tWR 到非易失性存储器。在此写入周期内,所有输入均被禁用,并且在写入完成之前 EEPROM 不会响应(参见第 8 页的图 11)。
这里我们主要用的是写一个字的数据:
观察 figure 7.并依据原理图可知,
device address : 0xA0(W) 0XA1(R)
依据 figure 8 可知:
在AT24C02上写一个字的代码:
void AT24C02_WriteByte(u8 address,u8 dat)
{
I2C_Start();
I2C_WriteByte(0xa0);
I2C_WaitACK();
I2C_WriteByte(address);
I2C_WaitACK();
I2C_WriteByte(dat);
I2C_WaitACK();
I2C_Stop();
I2C_Delay(DELAY_TIME);//加上延时好点
}
(2)读数据
随机读取需要一个“虚拟”字节写入序列来加载数据字地址。一旦器件地址字和数据字地址被 EEPROM 计时并确认,微控制器必须生成另一个启动条件。微控制器现在通过发送读/写选择位为高电平的器件地址来启动当前地址读取。EEPROM 确认器件地址并串行时钟输出数据字。微控制器不响应零,但会生成以下停止条件(参见第 12 页的图 11)。
我们主要使用随机读取的方式:
依据 figure 11有代码:
u8 AT24C02_ReadByte(u8 address)
{
u8 dat=0;
I2C_Start();
I2C_WriteByte(0xa0);
I2C_WaitACK();
I2C_WriteByte(address);
I2C_WaitACK();
I2C_Start();
I2C_WriteByte(0xa1);
I2C_WaitACK();
dat=I2C_ReadData();
I2C_WriteACK(1);
I2C_Stop();
return dat;
}
三、I2C时序说明
I2C协议:分为六部分: 开始、停止、读一个字节、写一个字节、发送应答位、接受应答位
SCL为高电平时是读取数据的,为低电平时SDA可改变数据的,如果在SCL为高电平时,SDA发生改变,则视为开始或者结束的标志,
SCL由主机控制;一般先控制SDA,再控制SCL; SCL ,SDA默认保持高电平
1.开始:
SCL为高电平时,SDA产生下降沿
void I2C_Start(void)
{
SDA=1;
SCL=1;
SDA=0;
SCL=0;
}
SDA=1;SCL=1;SDA=0;SCL=0;
2.停止:
SCL为高电平时,SDA产生上升沿
void I2C_Stop(void)
{
SDA=0;
SCL=1;
SDA=1;
}
I2C为高位先行!!!!
3.发送一个字节:
SCL为高电平时,SDA保持稳定不变,SCL为低电平时,SDA可转换电平
void I2C_SendByte(u8 byte)
{
u8 i=0;
for(i=0;i<8;i++)
{
SCL=0;
if(byte & 0x80) SDA = 1;
else SDA = 0;
// SDA=byte&0x80;
SCL=1;
byte<<=1;
}
SCL=0;
}
4.读取一个字节:
SCL高电平,读取SDA,再拉低SCL让从机改变SDA;
u8 I2C_ReadByte(void)
{
u8 i=0;
u8 dat=0;
for(i=0;i<8;i++)
{
SCL=1;
dat<<=1;
if(SDA) dat|=1;
SCL=0;
}
return dat;
}
5.发送应答位:
拉低SCL,改变SDA,拉高SCL,拉低SCL
void I2C_SendACK(u8 ackbit)
{
SCL=0;
SDA=ackbit;
SCL=1;
SCL=0;
}
6.等待应答位:
拉高SCL,SDA保持空闲,读取SDA,拉低SCL
bit I2C_WaitACK(void)
{
bit rack=0;
SDA=1;
SCL=1;
rack=SDA;
SCL=0;
return rack;
}
四、AT24C02存取数据代码
1.51单片机数据类型所占字节:
其它编译器:
2.进行u16位数据存取
// 0000 0000 0000 0000 //u16,
// 0000 0000 //u8,u8读取u16数据时,会优先读取低八位
write_at24c02(0x00,wdat_u16>>8);//右移存高八位
write_at24c02(0x01,wdat_u16);//存低八位
rdat=(read_at24c02(0x00)<<8+read_at24c02(0x01));//读取u16
3.进行float读取
write_at24c02(0x03,(u16)(wdat_float*1000)/256);
write_at24c02(0x04,(u16)(wdat_float*1000)%256);
rdat_float=(read_at24c02(0x03)*256+read_at24c02(0x04))/1000.0f;
4.进行字符串数据存取
u8 wdat_string[]={"hello world"};
for(i=0;i<sizeof(wdat_string);i++)
{
write_at24c02(0x10+i, wdat_string[i]);
}
for(i=0;i<sizeof(wdat_string);i++)
{
rdat_string[i]=read_at24c02(0x10+i);
}
2025蓝桥杯(单片机)备赛--扩展外设控制之DS18B20(六)-CSDN博客
2025蓝桥杯(单片机)备赛--基本外设控制之共阳数码管(四)-CSDN博客
2025蓝桥杯(单片机)备赛--基本外设控制之继电器和蜂鸣器(三)-CSDN博客