通信协议
https://oss.012700.xyz/butterfly/2024/09/hexo-theme-butteffly-docs-outdate-flat.png
串行和并行
1. 串行通信
- 位通过单根线——发送,下图显示了二进制(01000011)中字母 “C” 的串行传输。当时时钟线为高电平时,接受数据位,高电平为 1,低电平为 0。

2. 并行通信
- 数据位在导线中同时传输,下图显示了二进制(01000011)中字母 “C” 的并行传输。当时钟线为高电平时,8 个数据位同时接受数据,高电平位 1,低电平位 0。
所以 UART、SPI、I2C 都是串口通信,因为它们都是通过一根线作为数据线传输数据。
全双工与半双工
1. 全双工
- 简单来说,比如我们在打电话时,我们可以在同一时间说话,这就是全双工通信
2. 半双工
- 相对的,虽然半双工也可以互相通信,但是在同一时间只能单方向传输数据。
UART 和 SPI 都是全双工通信方式,因为他们的数据线都有两根,即可以在同一时间 A 发数据给 B,B 也可以在这个时间发数据给 A。
而 I2C 通信只有一根数据线,所以不能同一时间双向传输数据。
同步通信和异步通信
- 同步是阻塞模式,异步是非阻塞模式 。
1. 同步通信
- 发送方发出数据后,等待收方发回响应以后才发下一个数据包的通讯方式。
2. 异步通信
- 发送方发出数据后,不等接收方发回响应,接着发送下一个数据包的通讯方式。
所以 SPI 和 I2C 都是同步通信,因为他们都有时钟线,UART 是异步通信方式,他只有两个数据线,发送完数据不会确定你是否接收到。
SPI 通信
SPI 可以无中断传输数据,可以连续地发送或接收任意数量的位。但是 I2C 和 UART 中,数据以数据包的形式发送,有限定位数。
在 SPI 设备中,设备分为主机控制设备(通常是微控制器)和从机(通常是传感器,显示器和存储芯片)设备,从机从主机那获取指令
SPI 信号线有四种:
- MOSI-信号线:主机输出,从机输入;
- MISO-信号线:主机输入,从机输出;
- SCLK-时钟信号;
- SS/CS-片选信号;
SPI 协议特点: 实际上,从机的数量受系统负载电容的限制,它会降低主机在电压电平之间准确切换的能力。
时钟信号
- 每个时钟周期传输一位数据,因此数据传输的速度取决于时钟信号的频率。时钟信号由于是主机配置生成的,因此 SPI 通信始终由主机启动。
- 设备共享时钟信号的任何通信协议都成为同步。SPI 是一种同步通信协议,还有一些异步通信不使用时钟信号。例如在 UART 通信中,双方都设置为预先配置的波特率,该波特率决定了数据传输的速度和时序。
- 片选信号:主机通过拉低从机的 CS/SS 来使能通信。主机可以存在多个 CS/SS 引脚,允许主机与多个从机进行通信。
1. 传输步骤
- 主机输出时钟信号
- 主机拉低 SS/CS 引脚,激活从机
- 主机通过 MOSI 将数据发送给从机
- 如果需要相应,则从机通过 MISO 将数据返回给从机
2. SPI 优缺点
- 优点:无起始位和停止位,因此数据可以持续传输不会中断;数据传输速度快(比 I2C 快几乎两倍)。独立的 MISO、MOSI 可以同时发送和接收数据。
- 缺点:使用四根线(I2C 使用两根线),没有信号接收成功的确认(I2C 由此功能),没有任何形式的错误检查(UART 中的奇偶校验位)。
UART 通信
- 两个 UART 直接相互通信。发送 UART 将控制设备(如 CPU)的并行数据转换位串行形式,以串行的形式将其发送到接收 UART。只需要两条即可在两个 UART 之间传输信息:
- UART 属于异步通信,没有时钟信号。它会在数据包中增加开始和停止位。这些位定义了数据包的开始和结束,因此接收 UART 知道何时读取这些数据。
- 当接收 UART 检测到起始位时,它将以特定的波特率的频率读取(数据传输速度的度量),以每秒比特数(bps)表示。两个 UART 必须以大约相同的波特率工作,发送的接收 UART 之间的波特率只能相差约 10%。
1. 工作原理
- UART 数据包包含有一个起始位,5 到 9 个数据位(取决于 UART),一个可选择的奇偶检验位以及一个或两个停止位
- 起始位:UART 数据传输线通常在不传输数据时保持在高电平电平。开始传输时发送 UART 在一个时钟周期内将传输线从高电平拉低到低电平,当接收 UART 检测到高电压转换时,他开始以波特率的频率读取数据帧中的位
- 数据帧:数据帧内包含正在传输的实际数据。使用奇偶校验位时 5-8 位,不使用最多可以时 9 位
- 校验位:奇偶校验位是接收 UART 判断传输期间是否有任何数据更改的方式。接收 UART 读取数据帧后,它将对值为 1 的数进行计数,并且检查总数是偶数还是奇数,是否与数据相匹配
- 停止位:向数据包的结尾发出信号,发送 UART 将数据传输线从低电压驱动到高电压至少两位的时间
2. 传输步骤
- 发送 UART 从数据总线并行接收数据
- 发送 UART 将起始位、奇偶校验位和停止位添加到数据帧
- 整个数据包从发送 UART 串行发送到接收 UART。接收 UART 以预先配置的波特率对数据线进行采样
- 接收 UART 丢弃数据帧中的起始位、奇偶校验位和停止位
- 接收 UART 将串行数据转换回并行数据,并将其传输到接收端的数据总线
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 雨落波敛!