i.MX6ULL 裸机开发 — I2C (IIC) 通信与 AT24C02 驱动
前言I2C 是嵌入式里非常经典的同步串行总线大量用于 EEPROM、传感器等芯片间低速通信。本次课程从协议底层原理、GPIO 电气模式再到 AT24C02 硬件接线、寄存器配置、驱动代码编写、调试手段完整串联打通 I2C 从理论到裸机代码实现的全链路。一、I2C 通信协议基础I2C 全称 Inter-Integrated Circuit由飞利浦在上世纪 80 年代推出专门用于板上芯片之间通信。通信属性同步串行、半双工。总线包含两根信号线SCL 时钟线、SDA 数据线同一时刻只能单向传输数据。采用主从架构SOC 一般作为主机发起通信传感器、存储芯片作为从机被动响应。线与特性线与特性是 I2C 总线最核心的电气特点。I2C 的 SDA、SCL 引脚全部配置为开漏输出所有设备引脚并联在同一根总线上。原理开漏引脚只能主动把总线拉低想要输出高电平设备只能释放引脚变成高阻悬空。逻辑规则只要总线上任意一个设备把总线拉低整根总线就变成低电平只有所有设备全部释放引脚全部高阻总线才会被外部上拉电阻拉为高电平。低电平拥有 “碾压” 优先级。意义依靠线与多个设备可以自由拉低总线实现起始信号、应答信号、多主机总线仲裁也是 I2C 能够共用两根线挂载多个外设的基础。电平兼容不同电压域芯片3.3V 与 5V不能直接相连容易产生电流倒灌烧毁器件依靠开漏输出 外部上拉电阻解决跨电压通信。GPIO 开漏与推挽模式GPIO 内部由两个 MOS 管构成输出电路推挽模式高低电平都可以主动驱动输出。缺点跨电压芯片对接时会出现电流倒灌I2C 总线不能使用推挽。开漏模式仅能主动拉低输出高电平时引脚为高阻悬空状态总线高电平完全依靠外部上拉电阻提供。I2C 必须采用开漏。上拉电阻选型I2C 常用 4.7K~10KΩ。阻值太小漏电流大、功耗高阻值太大总线驱动不足信号容易畸变。二、I2C 标准时序规则总线空闲SCL、SDA 全部保持高电平。起始信号 StartSCL 为高SDA 产生下降沿代表通信开启。数据传输高位 MSB 优先。SCL 低电平期间SDA 可以切换电平SCL 高电平时SDA 必须稳定接收端在此时采样数据。应答 ACK/NACK1 字节传输完成后进入第 9 个时钟。接收方拉低 SDA ACK 应答SDA 保持高电平 NACK 无应答。停止信号 StopSCL 保持高SDA 产生上升沿通信结束总线回到空闲状态。地址与读写方向Start 信号之后第一个字节前 7 位是从机地址bit0 为读写位。bit00主机写从机bit01主机读从机。理论总线最多挂载 127 个从设备。三、AT24C02 EEPROM 芯片介绍AT24C02 是常用 I2C 接口掉电保存存储器容量2Kbit换算为 256 字节存储芯片标注容量单位常为 bit。页写机制一页 8 字节连续写入如果跨页数据会循环覆盖丢失写数据时要注意页边界限制。电气参数工作电压 1.8V~5.5V裸机实验 3.3V 供电通信速率一般 100KHz。硬件地址A0/A1/A2 引脚电平决定从机地址低三位全部接地时从机地址固定为 0x50。硬件接线VCC 接 3.3VGND 共地SCL、SDA 复用引脚。底板自带 4.7K 上拉电阻不需要额外再加。严禁接 5V 供电。AT24C02 读写时序分类字节写Start → 从机写地址 → 存储字地址 → 写入数据 → Stop每一步等待从机 ACK。随机读需要两次 Start。第一次发送写地址 字地址定位存储位置再次发起 Start发送读地址读取数据主机控制 ACK/NACK 结束传输。当前地址读直接从 EEPROM 内部指针当前位置读取不需要指定字地址适合连续读取场景。四、i.MX6ULL I2C 控制器与寄存器配置I2C 模块时钟来自 IPG Clock66MHz依靠分频寄存器分频得到 100KHz 的 SCL 时钟。I2ADR从机地址寄存器主机模式下不使用用于本机作为从机时被外部主机寻址。IFDR 分频寄存器设置 SCL 时钟频率66MHz 输入时钟输出 100KHz 需要配置 640 分频。I2CR 控制寄存器包含模块使能 IEN、主从选择 MSTA、收发选择 MTX、应答控制位。I2SR 状态寄存器传输完成标志 ICF、总线忙碌 IBB、仲裁丢失 IAL、中断标志 IIFIAL、IIF 标志需要软件写 0 手动清除。初始化规范初始化顺序先关闭 I2C 模块 → 配置分频 → 再使能 I2C模块使能时硬件自动复位。寄存器位域推荐用宏定义避免直接写魔法数字提升代码可读性。五、I2C 主机写驱动代码实现流程通信前置处理清除 IAL 仲裁丢失、IIF 中断标志防止上一次通信残留标志干扰本次传输。发起起始信号MTX 置发送模式MSTA 从 0 置 1硬件自动产生 Start切换为主机。发送地址字节从机地址左移 1 位最低位填充读写标志发送完毕等待中断标志检查 ACK收到 NACK 需要异常处理。循环发送依次发送 EEPROM 内部字地址、待写入数据每发送一个字节等待应答。结束通信发送 Stop 信号等待 IBB 总线忙碌标志清零确认总线释放。异常处理用 goto 统一处理出错场景无论是否正常完成都发送 Stop防止总线死锁。代码开发细节字符串长度计算需要引入头文件string.h使用 strlen。函数参数包含 I2C 句柄、从机地址、数据缓冲区、长度注意size_t和uint8_t*类型匹配强制转换消除编译警告。AT24C02 地址计算固定前缀 1010A2A1A0 全部为 0写操作最低位 0最终地址 0x50。EEPROM 擦写寿命约 100 万次禁止死循环不间断写入容易直接损坏芯片。调试可以加延时或者串口触发写入。六、调试工具逻辑分析仪逻辑分析仪用来抓取 SCL、SDA 波形验证 I2C 时序是否正确是 I2C 开发核心调试工具。接线通道 0 接 SCL通道 1 接 SDA必须共 GND。软件设置上位机选择 IIC 协议解析映射 SCL/SDA 通道软件可以自动解码总线地址、传输数据。波形排查捕获不到波形优先检查 USB、电源、杜邦线接触编译报错检查头文件是否包含 iic.h。七、面试 开发重点总结I2C同步、串行、半双工两根线 SCLSDA开漏输出 上拉电阻总线具备线与特性。时序记忆StartSCL 高SDA 下降沿StopSCL 高SDA 上升沿SCL 高采样SCL 低改变数据。AT24C02 重点页写限制、擦写寿命、跨页会覆盖数据。驱动开发要点初始化顺序、标志位软件清零、异常时释放总线避免 I2C 总线卡死。调试手段串口打印 逻辑分析仪抓波形定位时序、应答 NACK 类问题。