2、通信协议基础:串行通信与并行通信的区别、同步与异步通信、常见总线标准(UART、I2C、SPI、CAN)的对比

好,咱们正式开始聊通信协议。这一节是基础中的基础,但也是很多新手容易混淆的地方。我见过不少工程师,做项目好几年了,问起串行和并行到底差在哪,还是支支吾吾说不清楚。别急,咱们一个一个捋。

2.1 串行通信 vs 并行通信

说白了,串行通信就是一根线,数据一个比特一个比特地排队走。并行通信呢,就是多根线一起走,一次传好几个比特。

你可能会想:那肯定并行快啊,一次传8位,串行一次才传1位。嗯,理论上没错。但实际工程中,情况复杂得多。

核心区别:

  • 串行通信:数据按位顺序传输,占用引脚少,抗干扰能力强,适合长距离。
  • 并行通信:数据同时传输多位,速度快,但占用引脚多,线间干扰大,不适合远距离。

我记得有一次做电池管理系统(BMS)的通信方案,有人提议用并行总线来采集电芯电压,说这样速度快。我当时就笑了——你想想看,电池包里面几十节电芯,每节拉8根线出来,那线束得多粗?而且高压环境下的串扰问题,够你喝一壶的。最后我们老老实实用了串行通信,虽然单次传输慢一点,但整体可靠多了。

我的经验:在嵌入式系统里,尤其是板级通信,串行通信是绝对的主流。并行通信现在基本只出现在DDR内存、LCD屏接口这些对带宽要求极高的场景。做电池均衡系统,你几乎碰不到并行通信。

2.2 同步通信 vs 异步通信

这个区分,很多教材讲得云里雾里。我换个说法:

  • 同步通信:发送方和接收方共用同一个时钟信号。时钟来了,大家一起动作。
  • 异步通信:没有共享时钟,靠双方约定好的波特率(速率)来对齐数据。

为什么会这样?你想想看,如果两个设备离得很远,比如一个在车头一个在车尾,共享时钟信号很容易被干扰,信号也会衰减。这时候异步通信就派上用场了——只要双方波特率设对,就能正常通信。

我刚开始做项目时,有一次调试UART死活收不到数据。查了半天,发现是波特率设成了9600,但代码里写的是115200。嗯,这种低级错误,谁还没犯过呢?

避坑指南:我曾经在一个项目中,用I2C(同步)接了多个从设备,结果因为总线电容太大,时钟信号变形,导致通信不稳定。后来加了总线缓冲器才解决。同步通信对信号质量要求更高,布线时一定要注意。

2.3 常见总线标准对比

好了,咱们来看看嵌入式世界里最常见的四种总线:UART、I2C、SPI、CAN。我把它们放在一起对比,你一看就明白。

特性 UART I2C SPI CAN
通信方式 异步 同步 同步 异步
信号线数 2(TX/RX) 2(SCL/SDA) 4(SCK/MOSI/MISO/CS) 2(CAN_H/CAN_L)
传输模式 全双工 半双工 全双工 半双工
最大速率 ~1Mbps(典型) ~3.4Mbps(高速模式) ~50Mbps(取决于实现) ~1Mbps(CAN 2.0)
通信距离 短(几米) 短(几米) 短(几米) 长(几十米到千米)
多设备支持 点对点 多主多从 一主多从 多主多从
典型应用 调试口、GPS模块 传感器、EEPROM SD卡、显示屏 汽车、工业控制

我个人习惯,做板级调试时首选UART,简单可靠,一根USB转串口线就能搞定。I2C适合挂载多个低速传感器,比如温度、电压采集。SPI呢,速度快,适合跟SD卡、LCD屏这类需要大量数据交换的设备通信。

至于CAN,这可是咱们电池均衡系统的重头戏。CAN总线在汽车和工业领域用得特别多,原因很简单:抗干扰能力强,支持多主通信,还有完善的错误检测机制。我在做BMS项目时,电池包内部电芯之间的通信用的就是CAN。你想想看,电池包里面高压、大电流,电磁环境多恶劣,换别的总线早挂了。

选型建议:

  • 简单调试、点对点通信 → UART
  • 挂载多个低速传感器 → I2C
  • 高速数据传输(如SD卡、LCD) → SPI
  • 长距离、多节点、高可靠性(如BMS、汽车) → CAN

2.4 小结

这一节咱们把通信协议的基础概念过了一遍。串行和并行,同步和异步,还有四种常见总线的特点。说白了,没有最好的协议,只有最合适的。做项目时,先搞清楚你的需求:距离多远?速度多快?节点多少?环境多恶劣?然后对号入座就行。

下一节,咱们会深入CAN总线的物理层和协议细节。这可是电池均衡系统的核心,别走开。