跳转到内容
新建笔记

串行通信:UART、SPI、I²C、CAN 与 RS-485

串行通信把数据按位发送。理解一个接口时,先分清三个互相独立的问题:什么时候采样、数据能朝哪些方向传输、线上电压怎样表示数据。同步/异步、半双工/全双工、UART/RS-485 不能互相替代。

层次解决的问题示例
应用协议一条消息代表什么,怎样寻址、应答和校验Modbus RTU、自定义设备命令
数据传输与控制器怎样组成位流、产生时序、收发数据UART、SPI、I²C、CAN 控制器
电气接口电压、驱动能力、共模范围与线缆连接CMOS 电平、RS-232、RS-485、CAN 收发器

例如,微控制器的 UART 可以经 RS-485 收发器连接到差分总线,再承载 Modbus RTU。UART 引脚不能因此直接接到 RS-485 的 A/B 差分线。

同步串行接口用约定的时钟关系确定采样时刻,SPI 和 I²C 都有时钟线。UART 没有单独的时钟线:双方约定速率,接收器检测起始位后用自己的时钟采样,属于异步串行传输。

这里的“同步”不表示发送后等待应答;是否等待应答是另一层协议行为。异步通信仍然需要时间同步和时钟误差限制。

方式含义常见例子
单工信息只沿一个固定方向流动广播接收、单向测量输出
半双工可双向传输,同一共享信道不能同时承载两路独立数据两线 RS-485、I²C 的 SDA、CAN 总线
全双工两个方向可同时传输独立 TX/RX 的 UART、常规四线 SPI、四线 RS-485

双工由信道和设备能力决定。RS-485 可以使用两线半双工或四线全双工;“全双工 RS-485 就是 RS-422”不成立。RS-422 和 RS-485 的区别还涉及驱动器及多点连接能力。TI 的 RS-485 说明给出了两种 RS-485 网络。

3. UART:帧格式与有效吞吐量

跳转到“3. UART:帧格式与有效吞吐量”

以常见 8N1 为例:8 个数据位、无奇偶校验、1 个停止位;此外还有 1 个起始位。

空闲高电平 → 起始位 0 → D0 D1 D2 D3 D4 D5 D6 D7 → 停止位 1
1 位 8 位 1 位

数据位数量、位序、奇偶校验及停止位以实际设备配置为准。奇校验让“数据位与校验位合计”的 1 的数量为奇数,偶校验则为偶数;奇偶校验不能检出所有多位错误。

波特率是每秒码元数,比特率是每秒比特数。二进制 UART 每码元通常表示 1 bit,两者数值相同,但不能把波特率普遍定义为比特率。

连续发送且没有字节间空闲时,8N1 每发送一个 8 位字节占 10 bit:

Rpayload=Rbaud1+8+0+1R_{\mathrm{payload}}=\frac{R_{\mathrm{baud}}}{1+8+0+1}

因此 9600 baud 的上限是 960 byte/s,19200 baud 是 1920 byte/s;应用报头、校验、应答和调度还会降低有效吞吐量。原先直接除以 8 的算法遗漏了帧开销。

一次串口应用通常依次完成:选择驱动或串口库 → 配置速率/数据位/校验/停止位 → 打开端口 → 按协议组织与解析字节流 → 处理超时与错误 → 关闭端口。RS-485 半双工还要控制发送使能及收发切换时刻;发送函数返回不一定意味着最后一个停止位已经离开硬件。

项目RS-232RS-422RS-485
信号形式相对参考地的单端信号平衡差分信号平衡差分信号
常见连接点对点,独立 TX/RX单驱动器到一个或多个接收器支持多驱动器的多点总线
常见双工TX/RX 独立时全双工双向连接通常使用两对线一对线半双工;两对线可全双工
软件额外关注流控、端口参数与消息边界方向和设备协议总线访问、发送使能、周转时间与冲突

距离和速率要一起设计,还受线缆、终端、支线、节点负载及收发器规格影响。不能把“20 米”“10 Mb/s”当成任意连接都成立的保证,也不能仅由波特率断言某条线路能传多远。

差分信号并不免除共模电压限制。终端匹配、偏置、参考地/隔离及保护应结合实际器件和布线设计。自动收发转换器也有传播及周转时间,产品宣传中的“零延迟”不等于物理延迟为零。

5. SPI:信号、采样边沿与多设备

跳转到“5. SPI:信号、采样边沿与多设备”

常规四线 SPI 包括 SCLK、MOSI、MISO、CS;此外通常需要共同参考地。控制器产生时钟及片选,同时发送 MOSI、采样 MISO;外设采样 MOSI 并输出 MISO。两端都在采样,并非只有控制器“采样从机”。有些芯片采用三线、单向或多数据线变体,不能用“四根线”限制全部 SPI。

CPOL 决定空闲时钟电平;CPHA 决定在一个周期的第一个还是第二个边沿采样。

模式CPOLCPHA空闲电平采样边沿通常更新下一位的边沿
000低第一个,上升沿下降沿
101低第二个,下降沿上升沿
210高第一个,下降沿上升沿
311高第二个,上升沿下降沿

例如 Mode 0 的第一位必须在第一个上升沿之前稳定;接收端在上升沿采样,发送端通常在下降沿换成下一位。还必须满足建立时间、保持时间以及片选到首个时钟的时间要求。

CPHA 单独不能决定“上升沿还是下降沿”,必须与 CPOL 一起判断。不同厂商的 CKP、CKE、NCPHA 等寄存器命名和取值语义未必与 CPOL/CPHA 相同,要按芯片时序图核对。Linux SPI 文档和Microchip 模式表可交叉检查四种模式。

  • 独立片选:设备共享 SCLK/MOSI/MISO,各用一根 CS。未被选中的外设应按数据手册释放共享输出;同时选中多个会驱动 MISO 的器件可能发生电气争用。
  • 菊花链:前一个器件的串行输出接到后一个的输入,整串移位后再统一锁存。只有支持这种模式的设备才能这样连接。链越长,更新整串所需时钟越多;不能把物理位置直接解释为“优先级低”。

SPI 的命令、地址、字长、位序、片选边界和最高时钟由具体设备规定,常见用途有存储器、ADC、DAC、显示和传感器。SPI 本身没有统一的地址、应答或错误校验格式,外设协议可以另外增加状态位、校验和或 CRC。其速率没有统一的“10 MHz”“120 MHz”上限,也没有固定为 I²C 两倍的关系。TI 的 SPI 概述说明了基本连接及协议灵活性。

6. I²C:先理解开漏,再理解事务

跳转到“6. I²C:先理解开漏,再理解事务”

I²C(也写作 IIC)使用 SDA 数据线和 SCL 时钟线。常见标准/快速模式使用开漏或开集电极输出及上拉电阻:器件主动拉低,释放后由上拉形成高电平。支持的速度模式、总线电容和上拉阻值必须按器件与规范确定。

控制器发起事务并组织时钟;目标器件可在支持时通过拉低 SCL 延长等待,这叫时钟拉伸。因此“只有主机能影响 SCL”不准确。设备是否能当控制器或目标、是否支持多控制器,取决于其实现。

条件SDA/SCL 上的含义
空闲SDA、SCL 均为高
STARTSCL 为高时,SDA 从高变低
STOPSCL 为高时,SDA 从低变高
普通数据位SCL 为高时 SDA 保持稳定;通常在低电平期间更新
ACK每 8 bit 后的第 9 个时钟,由接收方把 SDA 拉低
NACK第 9 个时钟,SDA 保持高

START/STOP 是数据稳定规则的专门例外。NACK 可能表示地址未响应、接收方暂时不能接受数据,也可能是控制器读完最后一个字节后正常结束,不能一概当成传输失败。

常见 7 位地址格式把地址放在前 7 bit,最低位为 R/W。I²C 另有 10 位地址格式,不要把 7 位当成唯一情况。

写:START → 地址+W → ACK → 数据0 → ACK → 数据1 → ACK → STOP
读:START → 地址+R → ACK → 数据0 → ACK → 最后一字节 → NACK → STOP

每个字节按高位先行;数据字节数和寄存器含义由设备协议决定。读寄存器时常见“先写寄存器地址 → 重复 START → 地址+R → 读取”,重复 START 允许在不释放总线的情况下切换事务方向。

I²C 的 ACK 表示字节层面的应答,并不替代端到端数据完整性检查。完整时序、电气条件、仲裁及各速度模式应以 NXP UM10204为准。

7. CAN:共享总线上的消息仲裁

跳转到“7. CAN:共享总线上的消息仲裁”

CAN 使用独立节点时钟,通过总线边沿进行同步和重同步,不需要单独的时钟线。各节点可以发起消息,仲裁让竞争中的高优先级消息继续发送,其他节点随后重试。

经典 CAN 的共享总线在一个时刻承载一帧消息,属于半双工;发送节点同时监测总线是仲裁和错误检测的一部分,并不意味着同时传输两路独立帧。CAN 数据链路包含 CRC、位监测、位填充、格式与应答等检查,不能照搬 UART 的奇偶校验来解释。

CAN 常见物理布线是两端终端匹配的线形总线,支线长度受到速率及时序约束。任意星形连接不能直接假定可靠。经典 CAN 与 CAN FD 的帧格式和速率安排也需分别核对。TI CAN 基础介绍了仲裁、同步、错误检查和故障隔离。

8. 调试时按同一个顺序检查

跳转到“8. 调试时按同一个顺序检查”
  1. 电气连接:供电、参考地、逻辑电平、差分极性、上拉和终端是否正确。
  2. 时序参数:UART 帧格式;SPI 的模式、位序、片选;I²C 的地址表示、ACK 和时钟拉伸。
  3. 消息含义:寄存器地址、长度、字节序、校验、请求与应答关系。
  4. 观察真实波形:示波器确认幅值与边沿;逻辑分析仪辅助解码,解码参数错误也会生成看似合理的错误字节。
  5. 验证边界情况:超时、设备未连接、连续传输、收发切换以及总线恢复。

下列本地素材保留用于对照;概念和参数以正文及对应芯片手册为准。

SPI 控制器与外设连接示意

SPI 模式时序示意

I²C 起始、数据、应答与停止时序

I²C 写事务示意

I²C 读事务示意