IMX6ULL裸机开发——I2C通信协议

i.MX6ULL 有 4 路 I2C 外设:I2C1~I2C4,硬件为 I2C‑master,裸机无 Linux I2C 驱动,直接操作寄存器,支持标准模式 100K、快速模式 400K。最快典型模式3.4M

硬件引脚(复用为 I2C 功能,开漏输出,必须外部上拉)

  • I2C1:UART4_TX(SCL)、UART4_RX(SDA)
  • I2C2:EPDC_SDCE0(SCL)、EPDC_GDSP(SDA)
  • I2C3:GPIO1_IO06(SCL)、GPIO1_IO07(SDA)
  • I2C4:CSI_DATA00(SCL)、CSI_DATA01(SDA)
  • I2C 硬件特性:片上 I2C 控制器是开漏,引脚必须配置为 I2C 复用功能,不能配置 GPIO 输出模拟 I2C(硬件控制器自动产生 SCL/SDA 时序),外部必须 4.7K 上拉电阻。

寄存器列表如下:

寄存器 作用
I2Cx_IADR 从机地址寄存器,master 模式不用
I2Cx_IFDR 分频寄存器,设置 I2C 波特率
I2Cx_I2CR I2C 控制寄存器:使能、主机模式、发送 / 接收、应答
I2Cx_I2SR 状态寄存器:中断、总线忙、仲裁丢失、应答 ACK、传输完成
I2Cx_I2DR 数据收发寄存器,写 = 发送,读 = 接收

主机向从机发数据流程:

  1. 等待 IBB=0,总线空闲,保证总线没有其它通信
  2. 配置 I2CR 寄存器,发起起始信号
  3. 写从机地址 + 写位到 I2DR
  4. 等待 IIF 置位,字节传输完成;软件清零 IIF;检查 ACK
  5. 写寄存器地址0x01到 I2DR
  6. 等待 IIF 置位,字节传输完成;软件清零 IIF;检查 ACK
  7. 写要发送的数据150到 I2DR
  8. 等待 IIF 置位,字节传输完成;软件清零 IIF;检查 ACK
  9. 配置 I2CR 产生停止信号
  10. 等待 IBB=0,等待停止条件完成,总线回到空闲状态

写时序的大致流程

主机从|从机读取数据流程:

  1. 等待 IBB=0,确认总线空闲
  2. I2CR 配置,发起起始信号
  3. I2DR 写入从机写地址和写为
  4. 等待 IIF=1,传输完成;清 IIF;检查 ACK
  5. I2DR 写入寄存器地址0x01
  6. 等待 IIF=1,传输完成;清 IIF;检查 ACK
  7. I2CR 配置发起重复起始 Restart
  8. I2DR 写入从机地址|1读操作标志位
  9. 等待 IIF=1,传输完成;清 IIF;检查 ACK
  10. 读取 I2DR 寄存器得到从机返回数据;配置主机输出 NACK
  11. 等待 IIF=1;清 IIF
  12. I2CR 配置产生停止信号
  13. 等待 IBB=0,等待总线空闲,本次读事务结束

读从机的大致流程

起始信号与停止信号

1. 起始信号 S(Start Condition)

总线空闲状态:SDA = 高,SCL = 高,IBB=0(总线空闲)

  1. SCL 保持高电平;
  2. SDA 由高电平 → 低电平跳变(下降沿);
  3. 起始条件生成后,硬件自动置 IBB=1(总线忙);
  4. 随后主机拉低 SCL,开始输出字节(从机地址字节)。

2. 停止信号 P(Stop Condition)

字节 + ACK 传输全部完成之后,生成停止

  1. SCL 先拉高到高电平;
  2. SDA 由低电平 → 高电平跳变(上升沿);
  3. Stop 条件完成,硬件自动清除 IBB=0(总线释放,回到空闲)

3. 重复起始信号 Sr(Repeated Start,读寄存器流程要用)

⚠️ 重点:不发送 Stop,IBB 保持 = 1,总线一直处于忙状态!

  1. 当前字节 + ACK 传输完成,SCL 回到高;
  2. SDA 高→低跳变(和普通 Start 电平变化完全一样);
  3. 全程不置 Stop,IBB 保持 1,不会释放总线;
  4. 之后直接发送读地址字节。
  5. 用途:寄存器读操作,写完寄存器地址后用 Restart 切换读写方向,不释放总线
    Restart 阶段不能等待 IBB 清零,一旦 IBB 变成 0,就等于产生了 Stop,本次事务直接结束。
相关推荐
智感子14 分钟前
测控链路:从传感器到上位机
人工智能·嵌入式硬件·fpga开发
恒锐丰科技林技术员4 小时前
EG2129 带过流保护全桥驱动芯片解析
经验分享·嵌入式硬件·硬件工程
女神下凡7 小时前
芯参谋(43):DDR4_电路设计指南
arm开发·单片机·嵌入式硬件·设计规范
电子元器件选型哥7 小时前
MOS管驱动电阻怎么选?阻值大小到底影响什么?
单片机·嵌入式硬件·硬件工程师·半导体·电子元器件
白搞电子8 小时前
ESP32-S31 上做可在线安装的 WASM 应用平台:0.4.9 Beta 发布
单片机·嵌入式硬件·物联网
水果里面有苹果8 小时前
48-AS5600旋转磁编码器
嵌入式硬件
iCxhust8 小时前
8088的nmi中断能关闭吗?
嵌入式硬件·8088单板机
黑妹天下第一乖13 小时前
第 08 讲:阿加犀 AidGenSE 端侧大模型服务化与 OpenAI 兼容接口
人工智能·嵌入式硬件·深度学习·机器人·iot
辰哥单片机设计13 小时前
漏水传感器(STM32)
stm32·单片机·嵌入式硬件
恶魔泡泡糖14 小时前
stm32F103C8T6标准库串口接收之多串口基础应用5
stm32·单片机·嵌入式硬件