I2C 通信协议
I2C 是一种半双工系统内部协议,即在系统内多个集成电路(IC)间的通讯。其支持 3 种传输模式,本文不对 3 种传输模式展开,仅分析基本原理。
一、物理层
I2C 通信设备之间的常用连接方式如下:
- 一条 I2C 总线包含两条线路:
- SDA:双向串行数据线,用来传输数据
- SCL:串行时钟线,用来同步时钟
- 一条 I2C 通信总线可以连接多个 I2C 通信设备,包含多个主机或从机
- 每个总线上的设备都有一个独立的地址,主机利用这个地址访问不同的从机设备
- 总线通过上拉电阻接到电源。当I2C设备空闲时,会输出高阻态, 而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平
- 多个主机同时使用总线时,为了防止数据冲突, 会利用仲裁方式决定由哪个设备占用总线
- 连接到相同总线的 IC 数量受到总线的最大电容 400pF 限制
- I2C 总线具有 3 种传输模式:
- 标准模式:100kbps
- 快速模式:400kbps
- 高速模式:3.4Mbps,目前大多数 I2C 设备尚不支持
关于 I2C 为什么使用上拉电阻,有下面 3 个原因(数电知识):
- SDA和SCL线均为漏极开路驱动器
- 它可以将输出驱动为低电平,将其驱动为高电平
- 为了使线路能够变高,您必须提供上拉电阻
不同于 RS-232 为异步通信需要设置波特率,I2C 拥有一条时钟线,为同步传输,其数据有效性如下:
- SCL为高电平的时候SDA表示的数据有效:SDA 为高电平时表示逻辑1, 为低电平时表示逻辑0
- SCL为低电平的时候SDA表示的数据无效:SDA 一般在这个时候进行电平切换
二、协议层
I2C 的通信过程是由主机发起的,支持主机写数据到从机和主机在从机中读数据,其过程如下图:
- 起始信号 S 当 SCL 线是高电平时 SDA 线从高电平向低电平切换,这个情况表示通讯的起始。起始和停止信号一般由主机产生。
-
从机地址信号 (SLAVE_ADDRESS):其实信号产生后所有从机开始等待主机接下来的广播。与主机广播地址相同的设备被选中等待接下来的信号,其余设备会忽略接下来的信号。这个从机地址可以是7位或10位
-
传输方向的选择位:该位为0时,表示后面的数据传输方向是由主机传输至从机,即主机向从机写数据。该位为1时,则相反,即主机由从机读数据
-
ACK 响应位:被选中的从机在知晓传输方向后会返回一个应答 Ack 信号,主机在收到 Ack 后进入传输数据状态:发送数据或等待接收
-
下面从读数据和写数据两个角度分析后续过程:
- 写数据:主机接收到从机的应答 ACK 信号后开始发送数据,每个数据包大小为 8 bits, 主机每发送一个数据包,等待从机应答信号 ACK,并重复这个过程
- 读数据:主机接收到从机的应答 ACK 信号后开始接收数据,从机开始发送数据,每个数据包也是 8 bits,从机每发送一个数据包要等待主机的应答信号 ACK,并重复这个过程。倘若主机希望停止接收数据,会发送一个非应答信号 NACK,从机接收到需停止发送
-
停止信号 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