AT24C02
概述:
AT24C02是一个2K位串行CMOS E2PROM, 内部含有256个8位字节,CATALYST公司的先进CMOS技术实质上减少了器件的功耗。AT24C02有一个16字节页写缓冲器。该器件通过IIC总线接口进行操作,有一个专门的写保护功能
主要特点:
存储容量: 2 Kbit(256 字节),可用作保存小块配置数据或用户设置。
接口类型: I2C,总线地址支持 7 位(允许在同一总线上连接多个 EEPROM)。
电源电压: 工作电压范围为 1.8V 至 5.5V,适应不同的电源要求。
操作温度范围: 通常为 -40°C 至 +85°C,适合广泛的应用环境。
数据保持时间: 高达 100 年,确保数据长期可靠保存。
写入时间: 典型写入时间约为 5ms,适用于需要快速更新的应用。
写保护: 芯片具有写保护功能,以防止意外的数据修改。
芯片管脚图如下
图一
图二
该图来自芯片手册中,简单介绍一下各个引脚的功能
- A0、A1、A2:器件地址选择
- SDA:数据线
- SCL:时钟线
- WP:写保护线(如果WP管脚连接到Vcc,所有的内容都被写保护只能读。当WP管脚连接到Vss or GND 或悬空允许器件进行正常的读/写操作)
IIC通信协议
iic为主从通信协议,采用一主多从模式即一个主机控制多个从机
图三
从机都挂载在时钟线和数据线上,每个从机都有所对应的通信地址。
通讯开始时时钟线高电平期间数据线拉低
对应代码
//起始信号
void I2CStart(void)
{
sda = 1;
scl = 1;
I2C_Delay(DELAY_TIME);
sda = 0;
I2C_Delay(DELAY_TIME);
scl = 0;
}
接下来就是发送7位地址码(还有一位是读写位),理论上可以挂载128个从机设备
(信号读取规则为时钟线高电平期间读取数据线上的数据)
//发送一个字节
void I2CSendByte(unsigned char byt)
{
unsigned char i;
for(i=0; i<8; i++){
scl = 0;
I2C_Delay(DELAY_TIME);
if(byt & 0x80){
sda = 1;
}
else{
sda = 0;
}
I2C_Delay(DELAY_TIME);
scl = 1;
byt <<= 1;
I2C_Delay(DELAY_TIME);
}
scl = 0;
}
//接收一个字节
unsigned char I2CReceiveByte(void)
{
unsigned char da;
unsigned char i;
for(i=0;i<8;i++){
scl = 1;
I2C_Delay(DELAY_TIME);
da <<= 1;
if(sda)
da |= 0x01;
scl = 0;
I2C_Delay(DELAY_TIME);
}
return da;
}
//等待应答
unsigned char I2CWaitAck(void)
{
unsigned char ackbit;
scl = 1;
I2C_Delay(DELAY_TIME);
ackbit = sda;
scl = 0;
I2C_Delay(DELAY_TIME);
return ackbit;
}
//发送应答
void I2CSendAck(unsigned char ackbit)
{
scl = 0;
sda = ackbit;
I2C_Delay(DELAY_TIME);
scl = 1;
I2C_Delay(DELAY_TIME);
scl = 0;
sda = 1;
I2C_Delay(DELAY_TIME);
}
//停止信号
void I2CStop(void)
{
sda = 0;
scl = 1;
I2C_Delay(DELAY_TIME);
sda = 1;
I2C_Delay(DELAY_TIME);
}
AT24C02写入
AT24C02读取
代码如下所示
//AT24c02 写数据
void write_at24c02(unsigned char addr,unsigned char date)
{
I2CStart();
I2CSendByte(0xA0);
I2CWaitAck();
I2CSendByte(addr);
I2CWaitAck();
I2CSendByte(date);
I2CWaitAck();
I2CStop();
Delay100ms(); //延时函数必须加
}
//AT24c02 读数据
unsigned char read_at24c02(unsigned char addr)
{
unsigned char dat;
I2CStart();
I2CSendByte(0xA0);
I2CWaitAck();
I2CSendByte(addr);
I2CWaitAck();
I2CStart();
I2CSendByte(0xA1);
I2CWaitAck(); //发送数据后必须加等待函数
dat = I2CReceiveByte();
I2CSendAck(1); //接收之后必须加一个发送应答
I2CStop();
Delay100ms(); //延时函数必须加
return dat;
}
标签:DELAY,unsigned,char,Delay,AT24C02,IIC,TIME,I2C
From: https://blog.csdn.net/m0_74219261/article/details/140733081