常见串口(UART、SPI、I2C)

串口的概念

串口,全称叫串行接口(Serial Interface)。串口相对于并口,它的数据和控制信息是一位接一位传递的。虽然速度会慢于并口,但是通信距离较并口更长。因此要进行长距离通信,应使用串口

UART

UART 全称是 Universal Asynchronous Receiver/Trasmitter,也就是异步串行收发器。

UART 作为串口的一种,其工作原理也是将数据一位一位的进行传输,发送和接收各用一条线,因此通过 UART 接口与外界相连最少只需要三条线:TXD(发送)、RXD(接收)和 GND(地线)。

image

上图表示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线连接多个从设备的结构如下图:

image

SPI 有四种工作模式,通过串行时钟极性(CPOL)和相位(CPHA)的搭配来得到四种工作模式:

  1. CPOL=0,串行时钟空闲状态为低电平。

  2. CPOL=1,串行时钟空闲状态为高电平,此时可以通过配置时钟相位(CPHA)来选择具体的传输协议。

  3. CPHA=0,串行时钟的第一个跳变沿(上升沿或下降沿)采集数据。

  4. CPHA=1,串行时钟的第二个跳变沿(上升沿或下降沿)采集数据。

这四种工作模式如下图所示:

image

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

image

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设备。

image

起始位

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

停止位

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

数据传输

  • I2C协议明确规定:数据线(SDA)上的数据在时钟线(SCL)高电平期间被采样。为了确保这一采样过程的可靠进行,协议有两个重要规定:

    • 数据稳定性要求: 在SCL线处于高电平期间,SDA线必须保持稳定(不变) 。这是强制性规则!

      • 任何在SCL高电平期间发生在SDA线上的变化都被视为通信控制的信号(如起始条件或停止条件),而不是要采样的数据位
    • 数据变化允许时间: SDA线上的数据允许变化的时间段是在SCL线处于低电平期间。

  • image

  • 数据传输注意点

    • 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 写时序

  • image

  • 上图表示I2C写时序:

    1. 开始信号
    2. 发送 I2C 设备地址,每个 I2C 器件都有一个设备地址,通过发送具体的设备地址来决定访问哪个 I2C 器件。这是一个 8 位的数据,其中高 7 位是设备地址,最后 1 位是读写位,为1 的话表示这是一个读操作,为 0 的话表示这是一个写操作。
    3. I2C 器件地址后面跟着一个读写位,为 0 表示写操作,为 1 表示读操作。
    4. 从机发送的 ACK 应答信号。
    5. 重新发送开始信号。
    6. 发送要写写入数据的寄存器地址。
    7. 从机发送的 ACK 应答信号。
    8. 发送要写入寄存器的数据。
    9. 从机发送的 ACK 应答信号。
    10. 停止信号。

Tips

MSB:Most Significant Bit。最高有效位,数据中权重最高的比特位

LSB:Least Significant Bit。最低有效位,数据中权重最低的比特位

如:有二进制数0b10110110,其中MSB是最左端的1,LSB是最右端的0。

I2C 读时序

  • image

  • 上图表示I2C单字节读时序,主要分为四大步:第一步发送设备地址并且读写位设置为写,第二步发送寄存器地址,第三步发送设备地址并且读写位设置为读,第四步读取从机数据。

    1. 主机发送起始信号。
    2. 主机发送要读取的 I2C 从设备地址。
    3. 读写控制位,因为是向 I2C 从设备发送数据,因此是写信号。
    4. 从机发送的 ACK 应答信号。
    5. 重新发送 START 信号。
    6. 主机发送要读取的寄存器地址。
    7. 从机发送的 ACK 应答信号。
    8. 重新发送 START 信号。
    9. 重新发送要读取的 I2C 从设备地址。
    10. 读写控制位,这里是读信号,表示接下来是从 I2C 从设备里面读取数据。
    11. 从机发送的 ACK 应答信号。
    12. 从 I2C 器件里面读取到的数据。
    13. 主机发出 NO ACK 信号,表示读取完成,不需要从机再发送 ACK 信号了。
    14. 主机发出 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)
功耗 中高(多片选时功耗大) 超低(静态电流小,开漏结构)
posted @ 2025-06-03 15:15  重光拾  阅读(91)  评论(0)    收藏  举报