一文看懂AT24C02(IIC)的原理及应用
创作时间:
作者:
@小白创作中心
一文看懂AT24C02(IIC)的原理及应用
引用
CSDN
1.
https://m.blog.csdn.net/m0_74219261/article/details/140733081
AT24C02是一款常用的I2C总线串行EEPROM芯片,广泛应用于各种嵌入式系统中。本文将详细介绍AT24C02的硬件特性、I2C通信协议以及具体的代码实现,帮助读者快速掌握其原理及应用。
AT24C02简介
AT24C02是一个2K位串行CMOS E2PROM,内部含有256个8位字节。CATALYST公司的先进CMOS技术显著降低了器件的功耗。AT24C02具有16字节页写缓冲器,通过I2C总线接口进行操作,并提供专门的写保护功能。
主要特点
- 存储容量:2 Kbit(256 字节),适合保存小块配置数据或用户设置。
- 接口类型:I2C,支持7位总线地址,允许多个EEPROM挂载在同一总线上。
- 电源电压:工作电压范围为1.8V至5.5V,适应不同电源要求。
- 操作温度范围:-40°C至+85°C,适用于各种环境。
- 数据保持时间:高达100年,确保数据长期可靠保存。
- 写入时间:典型写入时间约为5ms,适合需要快速更新的应用。
- 写保护:芯片具有写保护功能,防止意外数据修改。
芯片管脚图
图一
图二
各引脚功能说明:
- A0、A1、A2:器件地址选择
- SDA:数据线
- SCL:时钟线
- WP:写保护线(连接Vcc时写保护,连接Vss或悬空时可读写)
I2C通信协议
I2C是一种主从通信协议,支持一主多从模式。所有从机都挂载在时钟线和数据线上,每个从机都有对应的通信地址。
AT24C02的通信地址由芯片地址和控制字组成:
- 芯片地址:固定为1010(高四位)
- 控制字:由A2、A1、A0和R/W组成
- 形成八位二进制编码:1010A2A1A0R/W(R/W为0时为读,1为写)
通信流程
通讯开始时时钟线高电平期间数据线拉低
代码实现
起始信号
void I2CStart(void)
{
sda = 1;
scl = 1;
I2C_Delay(DELAY_TIME);
sda = 0;
I2C_Delay(DELAY_TIME);
scl = 0;
}
发送一个字节
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写入
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;
}
注意事项
信号在被拉低或置高后,需要加入一定时间的延时来稳定信号,一般为5us。延时代码如下:
#define DELAY_TIME 5
sbit sda = P1^6;
sbit scl = P1^7;
static void I2C_Delay(unsigned char n)
{
do
{
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
}
while(n--);
}
以上代码基于I2C通信地址0xA0编写,写保护为关闭状态。
热门推荐
RVV电源线的规格多样性
跨境包裹无忧,解读国际快递代收税费新政
10款吸油纸推荐!了解好坏处及正确用法
同样是睡8小时,“晚睡晚起”比“早睡早起”差在哪?
怎样在银行办理信用卡溢缴款取出?
为什么看眼睛一定要查视力?不查可以吗?
肥胖代谢表型与慢性肾病风险的关系研究
INTJ人格类型及适合职业详解
5个实用方法缓解脚后跟疼痛
摆脱盲从,用逻辑思考掌握人生方向
重磅!中国5G用户突破10亿,三大运营商最新数据出炉
唐太宗李世民的功绩有什么?他为何被后来的皇帝视为楷模?(5)
CCF YOCSEF长春举办技术论坛:智能光电技术如何促进现代农业的优质发展
经常喝“山楂干”泡水,坚持一段时间后,身体会有5个好处!
128个五线城市:辽阳第7,河池第60,海北第125
高中学生在考场上如何克服紧张的心理情绪?
浅析芦苇的生态价值与保护策略
如何应对电瓶缺水的情况?这种情况可能带来哪些后果?
烧纸钱引发火灾怎么处罚?祭扫用火隐患何在?
不同区域的跨境电商平台特征:选择适合你的平台
10首必听合唱神曲,经典背后的传奇!
狗尾巴草什么月份过季
室内门安装规范标准 室内门安装有什么讲究
数学与物理学的一次重要跨界:杨振宁与谷超豪的学术合作
羽衣甘蓝和甘蓝的区别
世界十大未解悬案 盘点震惊世界的悬案
国内首创!创新疗法成功逆转早期阿尔茨海默症
美国太阳SUN平衡阀的原理及特性
缺口回补的原因有哪些?这些原因反映了市场的哪些情况?
小孩穿什么衣服,刚出生的小孩穿什么衣服?小孩服饰的注意事项和要点