1. I²C通信协议深度解析与AT24C02实战指南
在嵌入式硬件开发中,I²C总线因其简洁的两线制设计(仅需SCL时钟线和SDA数据线)而广受欢迎。作为从业十余年的嵌入式工程师,我发现许多开发者在I²C底层时序和EEPROM器件操作上常遇到瓶颈。本文将结合AT24C02芯片,从信号时序到代码实现,完整呈现工业级可靠性的开发方案。
1.1 I²C基础通信机制
I²C总线采用主从架构,所有通信由主机发起。总线上的每个从设备都有唯一的7位或10位地址,AT24C02的固定地址部分是1010,剩余3位由硬件引脚决定,支持同一总线上挂载最多8个同型号芯片。
关键提示:I²C标准模式速率为100kHz,快速模式可达400kHz。实际延时参数需根据具体时钟频率调整,过快会导致从设备无法响应。
1.1.1 起始与停止条件
所有通信以起始条件(START)开始:
- SCL高电平时,SDA从高到低的跳变
- 类似"举手发言"的动作,告知总线即将开始传输
停止条件(STOP)则相反:
- SCL高电平时,SDA从低到高的跳变
- 相当于"结束发言"的示意
c复制void IIC_Start(void) {
SDA_HIGH(); // 确保起始条件满足SDA先高
SCL_HIGH();
DELAY_US(1); // 保持时间t_HD;STA ≥ 4μs
SDA_LOW();
DELAY_US(1); // 建立时间t_SU;STA ≥ 4.7μs
SCL_LOW(); // 准备数据传输
}
1.2 应答机制深度剖析
1.2.1 发送应答流程
主机每发送完8位数据后,第9个时钟脉冲期间会释放SDA线,由从机拉低SDA作为应答(ACK)。具体实现要点:
- 主机在SCL低电平时准备应答信号
- 根据参数ack值设置SDA电平(0-应答,1-非应答)
- 拉高SCL保持至少4μs(标准模式)
- 从机在SCL高电平期间采样SDA
- 最后SCL拉低完成应答周期
c复制void IIC_Send_Ack(uint8_t ack) {
SCL_LOW();
SET_SDA_AS_OUTPUT(); // 切换为输出模式
DELAY_US(1);
if(ack) SDA_HIGH(); // 发送NACK
else SDA_LOW(); // 发送ACK
DELAY_US(1);
SCL_HIGH(); // 从机采样窗口
DELAY_US(4); // 保持时间t_SU;DAT ≥ 4μs
SCL_LOW(); // 完成时钟脉冲
}
1.2.2 接收应答实现
主机接收数据时的应答时序更为关键:
- 主机在发送完8位数据后,需切换SDA为输入模式
- 从机在第9个时钟周期控制SDA电平
- 典型问题:未正确配置GPIO输入模式导致无法读取从机应答
c复制uint8_t IIC_Recv_Ack
