通信协议整理(I2C、UART、SPI)
通信特征
(从数据传输方向上):
- 单工:数据只能单一方向传输;
- 半双工:数据能在两个方向传输,但同一时刻只能在一个方向;
- 双工:数据能同时在两个方向传输;
I2C
I2C在物理层上有SCL和SDA两条线将主机和从设备连接,并有上拉电阻连接。
SCL工作逻辑:
- 空闲时为高电平,通信开始后拉低
- 通信过程中,SCL低电平时某一设备在SDA上设置数据(电平信号),高电平时另一设备读取SDA的电平信号。

- 启动条件:SCL处于高电平,把SDA(从高电平)拉低;(多主机占用一个总线时,最先拉低SDA的主机获得总线使用权)
- 结束条件:SCL处于高电平,把SDA(从低电平)拉高;
- (其他时刻,SCL高电平时SDA不能发生跳变)
- 重复启动条件:当某一主设备获取到从机应答后需要立刻做出下一步传输,为避免被其他主机占用总线,主设备接受了应答后应使用启动条件而非结束条件
仲裁:
对于多主机、多节点,所有SDA或SCL都会通过上拉电阻连接到高电平,意味着I2C总线在理论上只能由一对主机、节点进行数据传输。各个主机通过监视SDA、SCL,直至停止条件发生、总线进入空闲时才开始传输消息。
如果出现多个主机同时开始传输,就需要进行仲裁:最先将SDA信号电平拉低的主机为仲裁获胜者,失败者立即暂停传输。
UART
异步通信协议,物理层上包括TX、RX两条数据传输的接线和共地的接线。
两个设备之间的UART通信需要有相同的波特率,以保持收发速率一致。
UART的传输以数据帧为单位,数据帧格式有两种,分别是无校准位(8位数据位)和有校准位(9位数据位)。
数据帧如下图:( 起始位+8位数据位/9位数据位(带奇偶检验)+停止位(1or2) )
SPI
SPI是同步、全双工的通信,仅支持一主多从。物理层上包含:
- SCK时钟线
- MISO、MOSI数据线
- CS/NSS/SS片选:每个从机设备都有一个自己的片选线,置低电平时,该设备被选择与主机通信

主从设备的shift register通过MISO、MOSI连接成数据传输的回路。此外还有buffer register作为收发数据的缓冲区,发送和接收的数据。
SPI有两个时钟的配置选项,分别是clock polarity和clock edge,主从设备进行SPI通信需要这两个时钟配置保持一致:
- clock polarity 时钟极性:在时钟空闲时的电平(高/低)
0:空闲时钟电平为0;
1:空闲时钟电平为1; - clock edge 时钟边沿:数据传输(移位)的时钟边沿
0:数据移位发生在时钟从空闲转换到活动时;
1:数据移位发生在时钟从活动转换到空闲时;
📊 SPI模式组合:
SPI模式由两个参数决定:
- CPOL (Clock Polarity):时钟极性
- CPHA (Clock Phase):时钟相位
组合后的四种模式:
| 模式 | CPOL | CPHA | 采样时刻 | 空闲时钟 | 数据采样边沿 |
|---|---|---|---|---|---|
| Mode 0 | 0 | 1EDGE | 第一个边沿 | 低电平 | 上升沿 |
| Mode 1 | 0 | 2EDGE | 第二个边沿 | 低电平 | 下降沿 |
| Mode 2 | 1 | 1EDGE | 第一个边沿 | 高电平 | 下降沿 |
| Mode 3 | 1 | 2EDGE | 第二个边沿 | 高电平 | 上升沿 |
参考:
[I2C] ADI整理发布的I2C,PMbus,SMbus入门教程,难得的好文章(含中文版)
I²C – Inter-Integrated Circuit
SPI – Serial Peripheral Interface
浙公网安备 33010602011771号