一文看懂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编写,写保护为关闭状态。
热门推荐
实习期工资要交税吗
智能家居操作界面的高颜值和体验,绝对能给家带来不一样的感觉
翡翠替代品大全:探索市场上流行的替代玉石与宝石
倪海厦针灸笔记:手阳明大肠经、手太阳小肠经和手少阴心经详解
服务器能放置多少个域名?
水塔花养殖方法详解(从选址到养护,一步步教你打造漂亮的水塔花园)
提升用户体验、创新产品与高效运营,企业发展三驾马车
【宣传单设计全攻略】新手3天速成排版高手,5个技巧让客流量翻倍
揭秘:轻松制作泡泡的神奇方法!
揭秘:轻松制作泡泡的神奇方法!
电热炉家用煮茶炉:静音电陶炉与小型电磁炉的选购指南
怎么用体重计算器计算体重指数 体重身高比例计算公式介绍
如何提前发现小细胞肺癌?专家建议这样做
脾胃虚寒吃烤面包?胃结石能靠喝可乐消除?......这些冷门处方,真有用吗?
为什么四维空间中的绳子不会打结?
房屋买卖税费应该怎么交纳
买房时需要缴纳哪些税费?这些税费如何计算和影响购房成本?
吕布王者荣耀T0版本玩法 吕布怎么玩最厉害
Excel中保留公式的十种方法
2025年高利贷利息一般是多少?
怀孕期合同到期了,咋办?
董明珠时代落幕?格力面临接班人与品牌转型双重考验
电磁炉使用全攻略:正确使用方法与注意事项
“揭秘‘dm’的多重含义:社交、游戏与医学中的应用解析”
打造阅读量50万的公众号:从零到爆款的全方位攻略
Overleaf上LaTeX表格的使用:绘制专业三线表
软件开发如何接私单
五行属土的人缺什么?能量平衡的秘诀与生活指南
五行缺土如何补救与命名技巧
留意6种走路姿势,或是疾病信号!