news 2026/9/24 13:00:05

i.MX6ULL 裸机开发 — I2C (IIC) 通信与 AT24C02 驱动

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
i.MX6ULL 裸机开发 — I2C (IIC) 通信与 AT24C02 驱动

前言

I2C 是嵌入式里非常经典的同步串行总线,大量用于 EEPROM、传感器等芯片间低速通信。本次课程从协议底层原理、GPIO 电气模式,再到 AT24C02 硬件接线、寄存器配置、驱动代码编写、调试手段完整串联,打通 I2C 从理论到裸机代码实现的全链路。

一、I2C 通信协议基础

I2C 全称 Inter-Integrated Circuit,由飞利浦在上世纪 80 年代推出,专门用于板上芯片之间通信。

  1. 通信属性:同步串行、半双工。总线包含两根信号线:SCL 时钟线、SDA 数据线;同一时刻只能单向传输数据。采用主从架构,SOC 一般作为主机发起通信,传感器、存储芯片作为从机被动响应。
  2. 线与特性
    线与特性是 I2C 总线最核心的电气特点。I2C 的 SDA、SCL 引脚全部配置为开漏输出,所有设备引脚并联在同一根总线上。
  • 原理:开漏引脚只能主动把总线拉低;想要输出高电平,设备只能释放引脚变成高阻悬空。
  • 逻辑规则:只要总线上任意一个设备把总线拉低,整根总线就变成低电平;只有所有设备全部释放引脚(全部高阻),总线才会被外部上拉电阻拉为高电平。低电平拥有 “碾压” 优先级。
  • 意义:依靠线与,多个设备可以自由拉低总线,实现起始信号、应答信号、多主机总线仲裁,也是 I2C 能够共用两根线挂载多个外设的基础。
  1. 电平兼容:不同电压域芯片(3.3V 与 5V)不能直接相连,容易产生电流倒灌烧毁器件,依靠开漏输出 + 外部上拉电阻解决跨电压通信。

GPIO 开漏与推挽模式

GPIO 内部由两个 MOS 管构成输出电路:

  • 推挽模式:高低电平都可以主动驱动输出。缺点:跨电压芯片对接时会出现电流倒灌,I2C 总线不能使用推挽
  • 开漏模式:仅能主动拉低,输出高电平时引脚为高阻悬空状态,总线高电平完全依靠外部上拉电阻提供。I2C 必须采用开漏。
  • 上拉电阻选型:I2C 常用 4.7K~10KΩ。阻值太小,漏电流大、功耗高;阻值太大,总线驱动不足,信号容易畸变。

二、I2C 标准时序规则

总线空闲:SCL、SDA 全部保持高电平。

  1. 起始信号 Start:SCL 为高,SDA 产生下降沿,代表通信开启。
  2. 数据传输:高位 MSB 优先。SCL 低电平期间,SDA 可以切换电平;SCL 高电平时,SDA 必须稳定,接收端在此时采样数据
  3. 应答 ACK/NACK:1 字节传输完成后进入第 9 个时钟。接收方拉低 SDA = ACK 应答;SDA 保持高电平 = NACK 无应答。
  4. 停止信号 Stop:SCL 保持高,SDA 产生上升沿,通信结束,总线回到空闲状态。

地址与读写方向

Start 信号之后第一个字节:前 7 位是从机地址,bit0 为读写位。bit0=0:主机写从机;bit0=1:主机读从机。理论总线最多挂载 127 个从设备。

三、AT24C02 EEPROM 芯片介绍

AT24C02 是常用 I2C 接口掉电保存存储器

  1. 容量:2Kbit,换算为 256 字节;存储芯片标注容量单位常为 bit。
  2. 页写机制:一页 8 字节,连续写入如果跨页,数据会循环覆盖丢失;写数据时要注意页边界限制。
  3. 电气参数:工作电压 1.8V~5.5V,裸机实验 3.3V 供电,通信速率一般 100KHz。
  4. 硬件地址:A0/A1/A2 引脚电平决定从机地址低三位;全部接地时,从机地址固定为 0x50。
  5. 硬件接线:VCC 接 3.3V,GND 共地;SCL、SDA 复用引脚。底板自带 4.7K 上拉电阻,不需要额外再加。严禁接 5V 供电

AT24C02 读写时序分类

  1. 字节写:Start → 从机写地址 → 存储字地址 → 写入数据 → Stop,每一步等待从机 ACK。
  2. 随机读:需要两次 Start。第一次发送写地址 + 字地址,定位存储位置;再次发起 Start,发送读地址,读取数据,主机控制 ACK/NACK 结束传输。
  3. 当前地址读:直接从 EEPROM 内部指针当前位置读取,不需要指定字地址,适合连续读取场景。

四、i.MX6ULL I2C 控制器与寄存器配置

I2C 模块时钟来自 IPG Clock(66MHz),依靠分频寄存器分频得到 100KHz 的 SCL 时钟。

  1. I2ADR:从机地址寄存器,主机模式下不使用,用于本机作为从机时被外部主机寻址。
  2. IFDR 分频寄存器:设置 SCL 时钟频率,66MHz 输入时钟,输出 100KHz 需要配置 640 分频。
  3. I2CR 控制寄存器:包含模块使能 IEN、主从选择 MSTA、收发选择 MTX、应答控制位。
  4. I2SR 状态寄存器:传输完成标志 ICF、总线忙碌 IBB、仲裁丢失 IAL、中断标志 IIF;IAL、IIF 标志需要软件写 0 手动清除。

初始化规范

初始化顺序:先关闭 I2C 模块 → 配置分频 → 再使能 I2C,模块使能时硬件自动复位。寄存器位域推荐用宏定义,避免直接写魔法数字,提升代码可读性。

五、I2C 主机写驱动代码实现流程

  1. 通信前置处理:清除 IAL 仲裁丢失、IIF 中断标志,防止上一次通信残留标志干扰本次传输。
  2. 发起起始信号:MTX 置发送模式,MSTA 从 0 置 1,硬件自动产生 Start,切换为主机。
  3. 发送地址字节:从机地址左移 1 位,最低位填充读写标志;发送完毕等待中断标志,检查 ACK,收到 NACK 需要异常处理。
  4. 循环发送:依次发送 EEPROM 内部字地址、待写入数据,每发送一个字节等待应答。
  5. 结束通信:发送 Stop 信号,等待 IBB 总线忙碌标志清零,确认总线释放。
  6. 异常处理:用 goto 统一处理出错场景,无论是否正常完成都发送 Stop,防止总线死锁

代码开发细节

  • 字符串长度计算需要引入头文件<string.h>,使用 strlen。
  • 函数参数包含 I2C 句柄、从机地址、数据缓冲区、长度;注意size_tuint8_t*类型匹配,强制转换消除编译警告。
  • AT24C02 地址计算:固定前缀 1010,A2A1A0 全部为 0,写操作最低位 0,最终地址 0x50。
  • EEPROM 擦写寿命约 100 万次,禁止死循环不间断写入,容易直接损坏芯片。调试可以加延时或者串口触发写入。

六、调试工具:逻辑分析仪

逻辑分析仪用来抓取 SCL、SDA 波形,验证 I2C 时序是否正确,是 I2C 开发核心调试工具。

  1. 接线:通道 0 接 SCL,通道 1 接 SDA,必须共 GND。
  2. 软件设置:上位机选择 IIC 协议解析,映射 SCL/SDA 通道,软件可以自动解码总线地址、传输数据。
  3. 波形排查:捕获不到波形优先检查 USB、电源、杜邦线接触;编译报错检查头文件是否包含 iic.h。

七、面试 & 开发重点总结

  1. I2C:同步、串行、半双工,两根线 SCL+SDA,开漏输出 + 上拉电阻,总线具备线与特性
  2. 时序记忆:Start(SCL 高,SDA 下降沿);Stop(SCL 高,SDA 上升沿);SCL 高采样,SCL 低改变数据。
  3. AT24C02 重点:页写限制、擦写寿命、跨页会覆盖数据。
  4. 驱动开发要点:初始化顺序、标志位软件清零、异常时释放总线,避免 I2C 总线卡死。
  5. 调试手段:串口打印 + 逻辑分析仪抓波形,定位时序、应答 NACK 类问题。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/24 12:59:54

loader加载器是什么?从类加载器到Ultimate ASI Loader一次讲透

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/24 12:59:16

RV1106嵌入式AI部署:确定性推理与工业级落地实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/24 12:58:36

硬件工程师能力跃迁:从功能实现到量产可靠性的99课时实战路径

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/24 12:57:52

ESP32模组选型指南:WROOM、WROVER与S3的区别及esptool实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华