
核心要点
- 距离和节点数量在吞吐量成为决定因素之前很久就决定了协议的选择,因此应先确定物理层的规格,再据此设计固件。
- SPI、UART、I2C 和 CAN 各自都是在一种资源与另一种资源之间进行权衡,而正确的选择应是那种其代价在您的设计中能够承受的方案。
- 尽早设定协议边界,可确保嵌入式控制器在不同实验台和工具链之间具有可移植性,而非将其锁定在某一块电路板上。
为微控制器选择通信协议是一项硬件决策,一旦做出,就将在产品的整个生命周期内沿用下去。
引脚数、线缆长度、节点数和错误处理会同步变化,一旦设置不当,就会表现为间歇性故障,而这种故障无人能复现。如今,一辆高端汽车大约搭载了150个电子控制单元,每个单元都是一个微控制器,它们在交换数据时必须确保不丢失任何数据帧。
SPI、UART、I2C 和 CAN 之所以能屹立不倒,是因为它们各自解决了不同的问题。SPI 以牺牲引脚数量为代价换取吞吐量,I2C 则以牺牲速度为代价换回更多引脚,而 CAN 则通过消耗芯片资源来确保在充满噪声的机箱内仍能正常工作。只要将协议与实际约束你设计的限制条件相匹配,其上的固件就会变得更简单。
微控制器系统内部的串行通信原理
串行通信通过几根导线以每次传输一位的方式传输数据,用并行带宽换取引脚和电路板空间。微控制器上的每种协议都基于这一原理构建规则,涵盖时钟控制、设备选择和错误处理等方面。
一款典型的Cortex-M 器件通常提供多个 USART 模块、两到三个 SPI 模块、几个 I2C 模块,以及通常还包含一个 CAN 控制器。这些模块通过多路复用器共享引脚,因此您为传感器选择的协议将决定哪些引脚可用。
有五个属性决定了在电路板组装完成后,总线的运行方式。
- 时钟同步:因为同步总线包含时钟线,而异步总线则采用预设的比特率。
- 寻址,即确定有多少台设备共享同一条线路。
- 拓扑结构,涵盖点对点链路以及横跨一个机箱的多点总线。
- 电气传输距离,因为单端信号在长距离传输时会衰减,而差分对信号则能保持稳定。
- 错误处理,即当校验和验证失败时,芯片会采取什么措施。
在讨论数据传输速率之前,请先搞清楚这五点。任何固件都无法修复一个规格不符的物理层。
为何在原始吞吐量至关重要时,SPI能脱颖而出
SPI 是一种同步全双工总线,工作频率达数十兆赫,因为控制器提供时钟信号,且帧内不包含寻址操作。四根线用于传输时钟信号,两根数据线和一根芯片选择线,每个外设还需要一个额外的选择引脚。
显示 这项研究揭示了其中的权衡。一块分辨率为320×240、每秒30帧的彩色TFT屏幕,每帧需要数兆字节的像素数据;SPI在40 MHz下传输这些数据绰绰有余,而I2C在400 kHz下传输同一帧数据则需要数分钟。
SPI 协议本身并未规定任何纪律性要求。它既未定义确认机制,也未定义恢复机制,因此,当外设错过时钟沿时,会悄无声息地返回乱码数据,而您的固件必须通过自身的 CRC 校验来捕获这些异常。传输距离同样至关重要,因为 40 MHz 的时钟信号在 30 厘米长的扁平电缆上传输时,会产生严重的振铃现象,足以导致数据损坏。
“它规定既不进行确认也不进行恢复,因此,如果某个外设错过了时钟沿,它会悄无声息地返回垃圾数据,而你的固件必须通过自身的CRC来检测到这一点。”
UART 如何处理无时钟的点对点链路
UART 通过两根线将恰好两个设备连接起来,且不使用共享时钟,因此两端必须事先商定好波特率。正是由于这种简单性,它才成为工程师在开发新硬件时最先实现的接口,也是最后才会移除的接口。
您购买的几乎每个模块都支持这种协议。GNSS接收机以9600波特率连续传输位置数据,而通过USB桥接的调试控制台,在全新电路板通电后几分钟内就能提供可读的输出结果。
一旦添加第三台设备,限制便会显现。UART不支持寻址,因此要扩展到单链路以上,就需要使用RS-485收发器以及您现在需要维护的寻址方案。时钟精度是另一个限制因素,因为接收器采样的是每个比特的中间点,且仅能容忍约2%的漂移,这就是为什么在较高传输速率下,内部RC振荡器会引发问题,而晶体振荡器则不会。
为什么 I2C 适合引脚数量有限的传感器网络
I2C 通过为每个设备分配一个 7 位地址(控制器用于选通该设备),将许多设备连接在两根线路上。带上拉电阻的开漏输出使任何设备都能将线路拉低,这正是无需额外引脚即可实现应答和时钟拉伸的原理。
在传感器集群中,这种设计才能真正体现其价值。一台手持式仪器可能在同一对引脚上集成温度传感器、加速度计、小型EEPROM和电源监测器。
这种便利性伴随着两种故障模式。相同的部件通常带有相同的固定地址,因此三个相同的压力传感器就需要一个多路复用器,而在原型阶段才发现这一点代价高昂。总线电容是另一个限制因素,因为规范规定标准总线的上限为400 pF,而布局密集的电路板往往会超过这一限制,一旦超过,400 kHz的频率就无法正常工作了。
CAN 如何在存在电气噪声的情况下确保分布式控制器的可靠性

CAN 通过差分双绞线传输消息,因此电气噪声会等量地作用于两根导线上,并在接收端相互抵消。节点并非逐个寻址。每条消息都携带一个标识符,该标识符同时也确定了消息的优先级,而硬件会在不丢失胜出帧的情况下解决冲突。
该设计已在批量生产中证明了其价值,每年在汽车和工业机械领域售出的CAN节点超过20亿个。电动传动系统便说明了原因:电池管理系统、逆变器、充电器和仪表盘通过一条双绞线连接,彼此相距数米,而来自电池的故障信息在与常规温度更新之间会优先获得仲裁权。
硅芯片确实承担了原本应由固件处理的功能。CAN控制器负责循环冗余校验(CRC)、应答和重传,而持续出现故障的节点会自动从总线上脱离。这会牺牲有效载荷大小并增加规划工作量,因为经典帧的容量为8字节,而CAN FD将其扩大到64字节,而且在编写固件之前必须先为每个标识符分配地址。
为您的应用 约束选择合适的协议
首先考虑那些无法妥协的物理限制(通常是距离或节点数量),之后再考虑吞吐量。如果一条链路需要在设备内部穿越2米长的电缆,那么在讨论速度之前,SPI和I2C就已经被排除在外了。
| 协议与布线 | 最适合放在哪里 | 您需要支付的费用 |
| SPI,每台设备需四根线加一条选择线 | 板载连接至显示器、闪存以及高速换流器 。 | 随着外设的增加,引脚数量也在不断增加,而且没有任何检查机制。 |
| UART,两台设备之间的两根线 | 调试控制台、GNSS接收机和调制解调器均向同一个监听器发送数据。 | 如果没有收发器和自定义寻址机制,系统无法扩展到超过两个节点。 |
| I2C,两根带有上拉电阻的共用线 | 低速率传感器和配置存储器的集群。 | 解决地址冲突,并处理总线电容、限幅器件数量和时钟频率。 |
| CAN,机箱内的一对差分双绞线 | 车辆和机械中的控制器相距仅几米。 | 整个网络范围内的微型有效载荷和标识符规划。 |
混合设计是常态。一个电机控制器会通过SPI读取其位置传感器数据,通过I2C配置电源监控器,为维修技术人员提供UART接口,并通过CAN向车辆报告状态。当嵌入式控制器代码从台架原型机迁移到实验室硬件时,OPAL-RT的团队也会遇到同样的混合场景,此时工具链的兼容性确保了移植过程无需重写代码。
关于微控制器通信协议的常见问题,清晰解答
SPI 和 I2C 之间的主要区别是什么?
SPI 与 I2C 之间的主要区别在于:SPI 以引脚数量换取速度,而 I2C 则以速度换取引脚数量。SPI 需要为每个外设配备一条工作在数十兆赫兹的选通信号线,而 I2C 则通过两根导线与多个寻址设备共享,工作频率最高可达 3.4 MHz。
在单块电路板上使用CAN总线值得吗?
很少。当节点在电气噪声环境下相距数米时,CAN 的成本才算物有所值;而在同一块电路板上,SPI 或 I2C 只需更少的芯片面积就能传输相同的数据。唯一例外的情况是,当一块电路板接入现有的 CAN 网络时。
在新硬件上,应该先启用哪个协议?
几乎总是使用UART。一个正常工作的串行控制台能提供打印输出,方便你调试其他所有内容,而且它只需要两个引脚和正确的时钟设置。
在产品生命周期的各个阶段,遵循协议规范都能带来回报
如果协议选择是针对原型而非最终产品而制定的,那么这些选择很快就会过时。那些仅凭引脚可用性就选择总线的团队,往往要花费数年时间添加多路复用器、重试逻辑和屏蔽措施,来支撑一个本应由差分对就能胜任的设计。
没有遇到这个问题的工程师会将总线视为系统架构的一部分。他们在选型前会统计节点数量和线缆长度,为选通线所占用的引脚预留预算,并在固件启动前记录下标识符映射表。这些工作虽然并不光鲜,但都比在生产线上追查间歇性故障要经济得多。
OPAL-RT的价值体现在嵌入式控制器代码在不同测试平台间能够无缝迁移,因为具有明确协议边界的设计可以在不同工具链之间移植,而无需任何人重写接口层。合理的协议选择是一种无声的工程实践,其成效体现在:电路板首次测试即可成功启动,总线在选定协议的人员离职后仍能长期保持可靠性。
“没有遇到这个问题的工程师们将总线视为系统架构的一部分。”


