一文看懂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编写,写保护为关闭状态。
热门推荐
郴州三天两夜深度游:东江湖、高椅岭、白廊环湖全攻略
第二届旅发大会后,郴州高椅岭成网红打卡地!
探秘中国银都:郴州历史文化的深度体验
武汉到浙江自驾游全攻略:三条精选路线详解
武汉到浙江自驾游必看:行车检查全攻略
闯关东的历史意义与深远影响
有强迫症好痛苦?从强迫症症状及成因了解如何自我治疗强迫症
强迫症治疗,到底“药”“不药”?
五芳斋&俞炳荣:嘉兴美食文化的双子星
湖州龙之梦乐园:周末遛娃新宠!
太湖龙之梦:嬉水世界&企鹅乐园,亲子游必打卡!
Qt6静态编译踩坑指南:VS更新帮你脱困!
无需冷藏的长效保质食物全攻略
胃肠道塌陷是什么意思
如何做好读书项目管理
古代没有标点符号,古人如何看懂古书?原来他们有一种独特的技能
盘点那些“媚眼如丝”的女神:陈好、温碧霞、张曼玉谁更绝?
紫苏四宝:从叶子到籽油的全方位健康指南
紫苏籽的六种食用方法,营养又美味
印度尼西亚特有黑色鸡种:Ayam Cemani
《红气球》:一个跨越半世纪的纯真梦想
《红气球》:一个关于自由与童真的电影寓言
呵护明亮视界:儿童戴眼镜的正确姿势与注意事项
你的眼镜该换了,换镜选购与避坑
石雕文殊菩萨与普贤菩萨:佛教信仰的双子星
天津春节必打卡:古文化街&欢乐谷
2025天津非遗春节攻略:杨柳青年画、灯展、花会全览
蔡氏贡掸:一把承载百年匠心的春节神器
谷景电子教你如何选线圈线径提升设备性能
迎接乙巳蛇年:华喦画蛇的艺术魅力与文化内涵