更新:2022 / 02 / 26
协议 | 通用通信协议 | SPI、UART、I2C通信的区别与应用
电子设备之间的通信就像人类的交流,双方需要说同一语言。
在电子产品中,这些语言被称为通信协议。
通信方式
电子设备通过发送数据位从而实现相互交谈。位是二进制的,只能是 1
或 0
。通过电压的快速变化,位从一个设备传输到另一个设备。
以 5V
工作的系统为例,0
通过 0V
的短脉冲进行通信,而 1
则通过 5V
的短脉冲进行通信。
串行与并行
数据位可以通过并行或串行的形式进行传输。
如下所示:
并行通信 | 串行通信 | |
---|---|---|
概念 | 在并行通信中,数据位在导线上同时传输。 | 在串行通信中,数据位通过单根线一一发送。 |
示意图 | 下图显示了二进制(01000011)中字母 “C” 的并行传输, | 下图显示了二进制(01000011)中字母 “C” 的串行传输, |
举例 | UART 、SPI 、I2C 都是串口通信,都是通过 1 根线作为数据线传输数据。 |
相比于并行通信,串行通信需要更少的电路和电线,从而降低实施成本。
全双工与半双工
全双工 | 半双工 | |
---|---|---|
概念 | 发送方和接送方可以同时对彼此进行数据传输。 | 发送方和接送放可以对彼此进行数据传输但是不可以同时,只能单方向传输数据。 |
举例 | UART 和 SPI 都是全双工通信方式,因为他们数据线都有两根,故可以同一时间双向传输数据。 | I2C 只能半双工通信,因为数据线只有一根,故无法在同一时间双向传输数据。 |
同步通信和异步通信
同步通信 | 异步通信 | |
---|---|---|
概念 | 阻塞模式 发送方发出数据后,等待接收方发回响应以后才发下一个数据包的通讯方式。 | 非阻塞模式 发送方发出数据后,不等接收方发回相应,接着发送下一个数据包的通讯方式。 |
示例 | SPI 和 I2C 都是同步通信,因为它们都有时钟线。 | UART 只有两个数据线,发送完数据不会确认你是否接收到。 |
通信协议
通信协议在组织设备之间的通信方面起着重要作用。它根据系统要求以不同的方式设计,并且这些协议具有在设备之间商定的特定规则以实现成功的通信。
以下3种协议,是常见的设备通用通信协议:
对比 | SPI | UART | I2C |
---|---|---|---|
1. | 使用 4 根线工作。 | 使用 2 根线工作。 | 使用 2 根线工作。 |
2. | 同步协议 设备共享时钟信号。 无起始位和停止位,因此数据可不中断地传输,即连续发送或接收任意数量的位。 | 异步协议 无需时钟信号。 取而代之以在数据包中添加开始位和停止位来定义数据传输的开始和结束。 被传输的数据是有限位数的。 主 / 从机设置预先配置的波特率(差距不超过 10% ),该波特率决定了数据传输的速度和时序。当接收 UART 检测到起始位后以特定波特率的频率读取(波特率是数据传输速度的度量,以每秒比特数( bps )来表示)。 | 同步协议 设备共享时钟信号,且时钟始终由主机控制。 数据传输以 msg 的形式进行,每个 msg 都包含从机的二进制地址帧、开始位、停止位还有数据帧之间的 ACK / NACK 位。数据帧的大小限制为 8 位。 |
3. | 没有任何形式的错误检查。 | 有奇偶校验来检查接收到的数据的错误。 | 没有任何形式的错错误检查。 |
4. | 没有信号接收成功的确认(没有 ACK )。 | 没有信号接收成功的确认(没有 ACK )。 | 有信号接收成功的确认( ACK )。 |
5. | 支持多个从属系统或多个主系统。 由片选线来确认目标从设备。 | 不支持多个从属系统或多个主系统。 | 支持多个从属系统或多个主系统。 主机将要通信从机地址发送到从机,从机再与自己的地址进行比较: - 如果地址匹配,从设备向主机发送一个低电平 ACK 位(拉低 SDA );- 如果地址不匹配, SDA 线保持高电平。 |
6. | 传输速率快于 I2C 两倍 | 传输速率慢于 I2C | |
7. | 全双工(同时发送和接收数据)( full-duplex )数据线有 2 根,可以在同一时间 A 发数据给 B ,B 可以在同一时间发送给 A 。 | 全双工(同时发送和接收数据)( full-duplex ) | 半双工(允许双向传输数据但不能同时进行)( half-duplex )数据线有 1 根,所以无法在同一时间进行双向数据传输。 |
SPI 通信
概念
在SPI设备中,设备分为:
设备分类 | 详细 |
---|---|
主机 | 控制设备(通常是微处理器)。 |
从机 | 传感器、显示器或者存储芯片,从主机那获取命令。 |
一套 SPI
通讯共包含 4
种信号线:
信号线 | 描述 |
---|---|
MOSI | Master Output / Slave Input ,信号线,主机输出,从机输入。 |
MISO | Master Input / Slave Output ,信号线,主机输入,从机输出。 |
SCLK | Clock ,时钟信号。 |
SS / CS | Slave Select / Chip Select ,片选信号。 |
实际上,从机的数量受系统负载电容的限制,它会降低主机在电压电平之间准确切换的能力。
工作原理
信号
参考这里 2
信号 | 描述 |
---|---|
MOSI & MISO | 主机通过 MOSI 以串行方式将数据发送给从机,从机也可以通过 MISO 将数据发送给主机。两个可以同步进行。 |
SCLK | 时钟信号,是由主机配置完成的,因此 SPI 通信是由主机启动的。每个时钟周期传输一位数据,因此数据传输的速度取决于时钟信号的频率。 |
SS / CS | 片选信号,主机通过拉低从机的 CS / SS 来使能通信。在空闲 / 非传输状态下,片选线保持高电平。 - 主机多 CS / SS 引脚在主机上可以存在多个 CS / SS 引脚,允许主机与多个不同的从机进行通讯,如下所示:- 主机单 CS / SS 引脚如果主机上只有一个片选引脚可用,则可以通过以下方式连接这些从器件: |
传输步骤
步骤 | 描述 |
---|---|
1. | 主机输出时钟信号 |
2. | 主机拉低 SS / CS 引脚,激活从机 |
3. | 主机通过 MOSI 将数据发送给从机 |
4. | 如果需要相应,则从机通过 MISO 将数据返回给主机。 |
使用 SPI
有一些优点和缺点,如果在不同的通信协议之间进行选择,则应根据项目要求进行充分考量。
优缺点
优点
SPI
通讯无起始位和停止位,因此数据可以连续流传输而不会中断。
没有像 I2C
这样的复杂的从站寻址系统,数据传输速率比 I2C
更高(几乎快两倍)。
独立的 MISO
和 MOSI
线路,可以同时发送和接收数据。
缺点
SPI
使用四根线( I2C
和 UART
使用两根线),没有信号接收成功的确认( I2C
拥有此功能),没有任何形式的错误检查(如 UART
中的奇偶校验位等)。
UART通信
概念
嵌入式系统、微控制器和计算机大多使用 UART
作为设备到设备硬件通信协议的一种形式。在可用的通信协议中,UART
的发送端和接收端仅使用两条线进行直接相互通信。
发送 UART
将控制设备(如 CPU
)的并行数据转换为串行形式,以串行方式从发送 UART
的Tx
引脚将其发送到接收 UART
的 Rx
引脚。如下图所示:
UART
属于异步通讯,这意味着没有时钟信号,取而代之的是在数据包中添加开始和停止位
这些位定义了数据包的开始和结束,因此接收 UART
知道何时读取这些数据。
当接收 UART
检测到起始位时,它将以特定波特率的频率读取。波特率是数据传输速度的度量,以每秒比特数( bps
)表示。两个 UART
必须以大约相同的波特率工作,发送和接收UART
之间的波特率只能相差约 10%
。
UART
的配置参数如下所示:
工作原理
发送 UART
从数据总线获取并行数据后,它会添加一个起始位( Start Bit
),一个奇偶校验位( Parity Bit
)和一个停止位( Stop Bit
)来组成数据包并从 Tx
引脚上逐位串行输出,接收 UART
在其 Rx
引脚上逐位读取数据包。如下所示:
数据包结构
UART
数据包含有 1
个起始位( Start Bit
),5
- 9
个数据位(取决于 UART
),一个可选的奇偶校验位( Parity Bit
)以及 1
- 2
个停止位( Stop Bit
),如下所示:
组成 | 描述 | |
---|---|---|
UART Packet | 起始位Start Bit | UART 数据传输线通常在不传输数据时保持在高电平电平。开始传输时发送 UART 在一个时钟周期内将传输线从高电平拉到低电平,当接收 UART 检测到高电压到低电压转换时,它开始以波特率的频率读取数据帧中的位。 |
数据帧Data Frame | 数据帧内包含正在传输的实际数据。 - 如果使用奇偶校验位,则可以是 5 位,最多 8 位- 如果不使用奇偶校验位,则数据帧的长度可以为 9 位。 | |
校验位Parity Bit | 奇偶校验位是接收 UART 判断传输期间是否有任何数据更改的方式。接收 UART 读取数据帧后,它将对值为 1 的位数进行计数,并检查总数是偶数还是奇数,是否与数据相匹配。 | |
停止位Stop Bit | 为了向数据包的结尾发出信号,发送 UART 将数据传输线从低电压驱动到高电压至少需要两位时间。 |
传输步骤
步骤 | 描述 |
---|---|
1. | 发送 UART 从数据总线( data bus )并行接收数据。 |
2. | 发送 UART 将起始位、奇偶校验位和停止位添加到数据帧。 |
3. | 整个数据包从发送 UART 串行发送到接收 UART 。接收 UART 以预先配置的波特率对数据线进行采样,如上所示。 |
4. | 接收 UART 丢弃数据帧中的起始位、奇偶校验位和停止位。 |
5. | 接收 UART 将串行数据转回并行数据,并将其传输到接收端的数据总线,如上所示。 |
优缺点
尽管是一种广泛使用的硬件通信协议方法,但它并没有一直得到充分优化。在微控制器内部使用 UART
模块时,通常会忽略帧协议的正确实现。
没有任何通信协议是完美的,但是 UART
非常善于其工作。
以下是其利弊,可以借此帮助确认是否符合自己的项目需求:
优点
仅使用两根电线
无需时钟信号
具有奇偶校验位以进行错误检查
只要双方都设置好数据包的结构
有据可查并得到广泛使用的方法
缺点
数据帧的大小最大为9位
不支持多个从属系统或多个主系统
每个UART的波特率必须在彼此的 10%
之内。
I2C 通信
概念
I2C
总线是由 Philips
公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可传送信息。
它结合了 SPI
和 UART
的优点,您可以将多个从机连接到单个主机(如 SPI
)那样,也可以使用多个主机控制一个或多个从机。
当您想让多个微控制器将数据记录到单个存储卡或将文本显示到单个 LCD
时,这将非常有用。
SDA
(Serial Data
),数据线;SCL
(Serial Clock
),时钟线。
I2C
是串行通信协议,因此数据沿着 SDA
一点一点地传输。
与 SPI
一样,I2C
也需要时钟同步信号且时钟始终由主机控制。
I2C
的配置参数如下所示:
工作原理
msg结构
I2C
的传输是以多个 msg
的形式进行,每个 msg
都包含从机的二进制地址帧,以及一个或多个数据帧,还包括开始条件和停止条件,读/写位和数据帧之间的 ACK
/ NACK
位。
组成 | 描述 | |
---|---|---|
Message | 起始位Start Bit | |
地址帧Address Frame | 每个从属设备唯一的 7 位或 10 位序列,用于主从设备之间的地址识别。 | |
读写位Read/Write Bit | 一位 如果主机是向从机发送数据则为低电平,请求数据则为高电平。 | |
确认位ACK / NACK Bit | 消息中的每个帧后均带有一个 ACK / NACK 位。如果成功接收到地址帧或数据帧,接收设备会返回一个 ACK 位用于表示确认。 | |
数据帧Data Frame | 当主机检测到从机的 ACK 位后,就可以发送第一个数据帧了。数据帧始终为 8 位,每个数据帧后紧跟一个 ACK / NACK 位,来验证接收状态。当发送完所有数据帧后,主机可以向从机发送停止条件来终止通信。 | |
停止位Stop Bit | 当发送完所有数据帧后,主机可以向从机发送停止条件来终止通信。 |
传输步骤
步骤 | 描述 |
---|---|
1. | 在 SCL 为高电平时,主机通过将 SDA 从高电平切换到低电平来启动总线通信。 |
2. | 主机向总线发送要与之通信的从机的 7 位或 10 位地址帧:- 如果主机向从机发送数据,则为低电平。 - 如果主机向从机请求数据,则为高电平。 以及 读 / 写位。 |
3. 寻址 | 由于 I2C 没有像 SPI 那样的片选线( SS / CS ),因此它需要使用另一种方式来确认某一个从设备,也就是寻址。主机将要通信的从机地址发送给每个从机,然后从机将其与自己的地址进行比较。 每个从机将主机发送的地址与其自己的地址进行比较。 - 如果地址匹配,则从机通过将 SDA 线拉低一位返回一个 ACK 位;- 如果地址不匹配,则从机将 SDA 线保持高电平。 |
主从机配置: - 单个主机 V.S 多个主机 由于 I2C 使用寻址功能,可以通过一个主机控制多个从机。使用 7 位地址时,最多可以使用 128 ( 27 )个唯一地址。使用 10 个地址并不常见,但可以提供1024 ( 210)个唯一地址。如果要将多个从机连接到单个主机时,请使用 4.7 KΩ 的上拉电阻将他们连接,例如将 SDA 和 SCL 线连接到 Vcc :- 多个主机 V.S 多个从机 I2C 支持多个主机同时与多个从机相连。当两个主机试图通过 SDA 线路同时发送或接收数据时,就会出现问题。因此每个主机都需要在发送信息之前检测 SDA 线是低电平还是高电平。- 如果 SDA 线为低电平,则意味着另一个主机正在控制总线;- 如果 SDA 线为高电平,则安全地发送数据;如果要将多个主机连接到多个从机,则使用 4.7 KΩ 的上拉电阻将 SDA 和 SCL 线连接到Vcc : | |
4. 数据帧发送 / 接收 | 当主机检测到从机的 ACK 位后,就可以发送第一个数据帧了。数据帧始终为 8 位,每个数据帧后紧跟一个 ACK / NACK 位,来验证接收状态。当发送完所有数据帧后,主机可以向从机发送停止条件来终止通信。 |
5. | 传输完每个数据帧后,接收设备将另一个 ACK 位返回给发送方,以确认已成功接收该帧。 |
6. 停止接收 | 随后主机将 SCL 切换为高电平,然后再将 SDA 切换为高电平,从而向主机发送停止条件。 |
优缺点
优点
仅使用两根电线
支持多个主机和多个从机
每个 UART
的波特率必须在彼此的 10%
之内
硬件比 UART
更简单
众所周知且被广泛使用的协议
缺点
数据传输速率比 SPI
慢
数据帧的大小限制为 8
位