通信协议整理(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:数据移位发生在时钟从活动转换到空闲时;
参考:
[I2C] ADI整理发布的I2C,PMbus,SMbus入门教程,难得的好文章(含中文版)
I²C – Inter-Integrated Circuit
SPI – Serial Peripheral Interface
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义