📅 2025/05/16

I2C 通信协议

I2C 是一种半双工系统内部协议,即在系统内多个集成电路(IC)间的通讯。其支持 3 种传输模式,本文不对 3 种传输模式展开,仅分析基本原理。

一、物理层

I2C 通信设备之间的常用连接方式如下:

关于 I2C 为什么使用上拉电阻,有下面 3 个原因(数电知识):

  1. SDA和SCL线均为漏极开路驱动器
  2. 它可以将输出驱动为低电平,将其驱动为高电平
  3. 为了使线路能够变高,您必须提供上拉电阻

不同于 RS-232 为异步通信需要设置波特率,I2C 拥有一条时钟线,为同步传输,其数据有效性如下:

二、协议层

I2C 的通信过程是由主机发起的,支持主机写数据到从机和主机在从机中读数据,其过程如下图:

  1. 起始信号 S 当 SCL 线是高电平时 SDA 线从高电平向低电平切换,这个情况表示通讯的起始。起始和停止信号一般由主机产生。

  1. 从机地址信号 (SLAVE_ADDRESS):其实信号产生后所有从机开始等待主机接下来的广播。与主机广播地址相同的设备被选中等待接下来的信号,其余设备会忽略接下来的信号。这个从机地址可以是7位或10位

  2. 传输方向的选择位:该位为0时,表示后面的数据传输方向是由主机传输至从机,即主机向从机写数据。该位为1时,则相反,即主机由从机读数据

  3. ACK 响应位:被选中的从机在知晓传输方向后会返回一个应答 Ack 信号,主机在收到 Ack 后进入传输数据状态:发送数据或等待接收

  4. 下面从读数据和写数据两个角度分析后续过程:

    • 写数据:主机接收到从机的应答 ACK 信号后开始发送数据,每个数据包大小为 8 bits, 主机每发送一个数据包,等待从机应答信号 ACK,并重复这个过程
    • 读数据:主机接收到从机的应答 ACK 信号后开始接收数据,从机开始发送数据,每个数据包也是 8 bits,从机每发送一个数据包要等待主机的应答信号 ACK,并重复这个过程。倘若主机希望停止接收数据,会发送一个非应答信号 NACK,从机接收到需停止发送
  5. 停止信号 P:当 SCL 是高电平时 SDA 线由低电平向高电平切换,表示通讯的停止。

Ref

https://doc.embedfire.com/mcu/stm32/f103badao/std/zh/latest/book/I2C.html 野火 STM32

PDF https://www.ti.com/lit/an/sbaa565/sbaa565.pdf?ts=1747371431982&ref_url=https%253A%252F%252Fwww.google.com%252F A Basic Guide to I2C - Texas Instruments