一文看懂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编写,写保护为关闭状态。
热门推荐
坐火车怎样积分?如何享受会员积分优惠?省钱攻略来了
维生素D与生育力:缺乏危害、诊断与科学补充指南
夫妻“同一属相”,到底好不好呢?老祖宗的经验之谈,有一定道理
Excel中如何设置符合要求的字体变红色
正念疗愈焦虑训练:三种实用技巧详解
别扔!这4种食物发芽不仅没毒,还营养飙升
肠道微生物组研究14个主题方向 | 技术方法:主要认知和研究现状
股份代持在初创公司融资中的角色:吸引投资、保护利益和实现增长
如果,一个人很久不理你,就这么做
中国汽车行业数据分析:39.19%消费者对比亚迪电动汽车表示认可
理解ADC:Delta-Sigma ADC 如何工作?
《三体》改编潮中,抢滩登陆者为什么是B站?
银行的金融服务产品创新与客户价值创造的关系研究
win11系统变量TEMP是什么?如何解析其数据?
盘点《我是歌手》历届冠亚军,个个都是实力唱将
做肠镜准备的注意事项
柳叶刀重磅发布!4大类措施,告别手部湿疹困扰
公路车选购终极指南:从预算到尺寸,新手避坑必看5大要点
如何有效维护IIS服务器以确保其稳定运行?
工商业燃气用户安全使用指南:从管理到维护的全方位解析
浙大最新研究发现:经常不吃早餐,容易增加代谢性疾病
吃早餐延寿?我国学者研究发现,不吃早餐或大增全因死亡、心血管、癌症死亡风险
如何在相对短暂的时间内提升复合弓射箭技术
青少年社交障碍心理咨询:初中孩子没朋友孤独如何开导
全面掌握:12333参保证明下载指南
在过剩的格局下,我们来探讨下氧化铝的底部
国宝是什么
搞笑又有趣的电竞队伍名字大全让你笑到停不下来
上海交通大学高峰教授团队:智能步态优化框架助力六足机器人研究
蜂蜜和枫糖浆在健康上有什么差异?