常见串口(UART、SPI、I2C)
串口的概念
串口,全称叫串行接口(Serial Interface)。串口相对于并口,它的数据和控制信息是一位接一位传递的。虽然速度会慢于并口,但是通信距离较并口更长。因此要进行长距离通信,应使用串口。
UART
UART 全称是 Universal Asynchronous Receiver/Trasmitter,也就是异步串行收发器。
UART 作为串口的一种,其工作原理也是将数据一位一位的进行传输,发送和接收各用一条线,因此通过 UART 接口与外界相连最少只需要三条线:TXD(发送)、RXD(接收)和 GND(地线)。

上图表示UART的通信格式,各位的含义如下:
-
空闲位:数据线在空闲状态的时候为逻辑“1”状态,也就是高电平,表示没有数据线空闲,没有数据传输。
-
起始位:当要传输数据的时候先传输一个逻辑“0”,也就是将数据线拉低,表示开始数据传输。
-
数据位:数据位就是实际要传输的数据,数据位数可选择 5~8 位,我们一般都是按照字节传输数据的,一个字节 8 位,因此数据位通常是 8 位的。低位在前,先传输,高位最后传输。
-
奇偶校验位:这是对数据中“1”的位数进行奇偶校验用的,可以不使用奇偶校验功能。
- 奇校验:使数据位+校验位的总“1”个数为奇数
- 偶校验:使数据位+校验位的总“1”个数为偶数
-
停止位:数据传输完成标志位,停止位的位数可以选择 1 位、1.5 位或 2 位高电平,一般都选择 1 位停止位。
SPI
SPI 是 Motorola 公司推出的一种同步串行接口技术,是一种高速、全双工的同步通信总线,SPI 时钟频率相比 I2C 要高很多,最高可以工作在上百 MHz。SPI 以主从方式工作,通常是有一个主设备和一个或多个从设备,一般 SPI 需要 4 根线,但是也可以使用三根线(单向传输)。这四根线如下:
- CS/SS,Slave Select/Chip Select,这个是片选信号线,用于选择需要进行通信的从设备。I2C 主机是通过发送从机设备地址来选择需要进行通信的从机设备的,SPI 主机不需要发送从机设备,直接将相应的从机设备片选信号拉低即可。
- SCLK,Serial Clock,串行时钟,和 I2C 的 SCL 一样,为 SPI 通信提供时钟。
- MOSI/SDO,Master Out Slave In/Serial Data Output,简称主出从入信号线,这根数据线只能用于主机向从机发送数据,也就是主机输出,从机输入。
- MISO/SDI,Master In Slave Out/Serial Data Input,简称主入从出信号线,这根数据线只能用户从机向主机发送数据,也就是主机输入,从机输出。
SPI通信都是由主机发起的,主机需要提供通信的时钟信号。主机通过SPI线连接多个从设备的结构如下图:

SPI 有四种工作模式,通过串行时钟极性(CPOL)和相位(CPHA)的搭配来得到四种工作模式:
-
CPOL=0,串行时钟空闲状态为低电平。
-
CPOL=1,串行时钟空闲状态为高电平,此时可以通过配置时钟相位(CPHA)来选择具体的传输协议。
-
CPHA=0,串行时钟的第一个跳变沿(上升沿或下降沿)采集数据。
-
CPHA=1,串行时钟的第二个跳变沿(上升沿或下降沿)采集数据。
这四种工作模式如下图所示:

以 CPOL=0,CPHA=0 这个工作模式为例,SPI 进行全双工通信的时序如下图所示:

SPI是全双工的,所以读写时序可以一起完成。上图中,CS片选信号先拉低,选择通信从设备,然后通过MOSI和MISO完成数据收发。图中,MOSI发出了0xd2给从设备,并且MISO读取了0x66。
Tips
若是采样时数据线中的数据正在跳变,以跳变后的数据为准。如上图中SCLK第一次上升沿时MOSI也是上升沿,此时采样的MOSI的比特位是1。
I2C
I2C使用两条线在主控制器和从机之间进行数据通信。一条是SCL(串行时钟线),另外一条是SDA(串行数据线),总线空闲时SCL和SDA处于高电平。
I2C协议
I2C支持多从机,即一个I2C控制器下可以挂多个I2C从设备,每个I2C从设备有不同的器件地址,I2C主控制器可以通过I2C设备的期间地址访问指定的I2C设备。

起始位
- I2C通信起始标志。在SCL高电平时,SDA出现下降沿就表示起始位。如下图:

停止位
- 停止I2C通信的标志位。在SCL高电平时,SDA出现上升沿就表示停止位。如下图:

数据传输
-
I2C协议明确规定:数据线(SDA)上的数据在时钟线(SCL)高电平期间被采样。为了确保这一采样过程的可靠进行,协议有两个重要规定:
-
数据稳定性要求: 在SCL线处于高电平期间,SDA线必须保持稳定(不变) 。这是强制性规则!
- 任何在SCL高电平期间发生在SDA线上的变化都被视为通信控制的信号(如起始条件或停止条件),而不是要采样的数据位。
-
数据变化允许时间: SDA线上的数据允许变化的时间段是在SCL线处于低电平期间。
-
-

-
数据传输注意点
- I²C每次传输的基本数据单位是8位(一个字节) 。
- I²C 一帧 包含 9个时钟脉冲:8个用于数据,第9个用于ACK/NACK。
- I²C 一次通信事务 可以包含 1帧到N帧(即1字节到N字节数据 + 每个字节对应的ACK/NACK位)。
应答信号
- 当 I2C 主机发送完 8 位数据以后会将 SDA 设置为输入状态,等待 I2C 从机应答,也就是等到 I2C 从机告诉主机它接收到数据了。应答信号是由从机发出的,主机需要提供应答信号所需的时钟,主机发送完 8 位数据以后紧跟着的一个时钟信号就是给应答信号使用的。从机通过将 SDA 拉低来表示发出应答信号,表示通信成功,否则表示通信失败。
I2C 写时序
-

-
上图表示I2C写时序:
- 开始信号
- 发送 I2C 设备地址,每个 I2C 器件都有一个设备地址,通过发送具体的设备地址来决定访问哪个 I2C 器件。这是一个 8 位的数据,其中高 7 位是设备地址,最后 1 位是读写位,为1 的话表示这是一个读操作,为 0 的话表示这是一个写操作。
- I2C 器件地址后面跟着一个读写位,为 0 表示写操作,为 1 表示读操作。
- 从机发送的 ACK 应答信号。
- 重新发送开始信号。
- 发送要写写入数据的寄存器地址。
- 从机发送的 ACK 应答信号。
- 发送要写入寄存器的数据。
- 从机发送的 ACK 应答信号。
- 停止信号。
Tips
MSB:Most Significant Bit。最高有效位,数据中权重最高的比特位
LSB:Least Significant Bit。最低有效位,数据中权重最低的比特位
如:有二进制数0b10110110,其中MSB是最左端的1,LSB是最右端的0。
I2C 读时序
-

-
上图表示I2C单字节读时序,主要分为四大步:第一步发送设备地址并且读写位设置为写,第二步发送寄存器地址,第三步发送设备地址并且读写位设置为读,第四步读取从机数据。
- 主机发送起始信号。
- 主机发送要读取的 I2C 从设备地址。
- 读写控制位,因为是向 I2C 从设备发送数据,因此是写信号。
- 从机发送的 ACK 应答信号。
- 重新发送 START 信号。
- 主机发送要读取的寄存器地址。
- 从机发送的 ACK 应答信号。
- 重新发送 START 信号。
- 重新发送要读取的 I2C 从设备地址。
- 读写控制位,这里是读信号,表示接下来是从 I2C 从设备里面读取数据。
- 从机发送的 ACK 应答信号。
- 从 I2C 器件里面读取到的数据。
- 主机发出 NO ACK 信号,表示读取完成,不需要从机再发送 ACK 信号了。
- 主机发出 STOP 信号,停止 I2C 通信。
I2C读取多字节时序
有时候我们需要读写多个字节,多字节读写时序和单字节的基本一致,只是在读写数据的候可以连续发送多个自己的数据,其他的控制时序都是和单字节一样的。
三者对比
| 特性 | UART | SPI | I2C |
|---|---|---|---|
| 通信方向 | 全双工(独立收/发线) | 全双工(主从同时收发) | 半双工(单一数据线共享) |
| 同步方式 | 异步(无时钟线) | 同步(共用时钟SCK) | 同步(共用时钟SCL) |
| 信号线 | 2根(TX, RX) | 4根(SCK, MOSI, MISO, CS) | 2根(SCL, SDA) |
| 拓扑结构 | 点对点(1:1) | 一主多从(1:N,片选控制) | 多主多从(M:N,地址仲裁) |
| 最大设备数 | 2(仅1收1发) | 理论上无限(需独立片选线) | 128设备(7位地址) |
| 速度 | 低(常用9600-115200 bps) | 高(可达100+ Mbps) | 中(标准模式100kbps,高速模式3.4Mbps) |
| 硬件复杂度 | 简单(无时钟同步) | 较高(需片选逻辑) | 中等(需地址仲裁) |
| 数据组织 | 字节流(无结构) | 数据块(按帧传输) | 字节+地址(协议严格) |
| 寻址方式 | 无(仅直连) | 硬件片选(CS引脚) | 软件地址(设备唯一地址) |
| 错误检测 | 奇偶校验位(可选) | 无(依赖硬件冗余) | 无(可软件添加CRC) |
| 功耗 | 低 | 中高(多片选时功耗大) | 超低(静态电流小,开漏结构) |

浙公网安备 33010602011771号