1. 四大通信协议核心对比图先来看这张对比表格5秒钟就能抓住关键差异协议硬件接线通信方式典型速度最大设备数典型应用场景UARTTX/RX/GND异步全双工115.2kbps1对1调试终端、GPS模块I2CSCL/SDA同步半双工100kbps-3.4Mbps理论128个温湿度传感器SPIMOSI/MISO/SCLK/CS同步全双工50Mbps无理论限制OLED屏幕、Flash存储CANCAN_H/CAN_L异步半双工1Mbps理论110个汽车ECU、工业控制我第一次接触这些协议时最头疼的就是记不清它们的硬件连接方式。后来发现用生活场景类比特别管用UART就像两个人打电话必须一对一连接I2C像微信群聊一个群主(主设备)可以多个成员SPI像快递柜每个柜子(从设备)有独立取件码(CS片选)CAN则像紧急广播重要通知(高优先级报文)可以打断普通通话2. UART最古老的串口协议2.1 硬件连接与工作原理UART的硬件接线简单到令人发指——只需要交叉连接TX和RX再加根地线。我在调试树莓派时经常用USB转TTL模块这样连接# 查看Linux系统串口设备 ls /dev/ttyUSB* # 用minicom调试 minicom -D /dev/ttyUSB0 -b 115200但要注意电平标准TTL电平3.3V/5V单片机常用RS232±15V老式电脑串口RS485差分信号工业现场2.2 帧格式与波特率一个标准的UART数据帧包含起始位总是低电平5-8位数据LSB先发可选的奇偶校验位1-2位停止位高电平常见波特率有4800、9600、115200等。这里有个坑我曾经因为设备双方波特率设置不一致收到一堆乱码。建议用示波器测量实际波形确认理想波形_-----___--_ (起始位01000001停止位) 异常波形_---_-_---_ (波特率不匹配时)3. I2C优雅的总线协议3.1 多设备连接方案I2C总线的精髓在于7位设备地址。比如MPU6050陀螺仪的地址是0x68AT24C02 EEPROM是0x50。接线时所有设备的SCL和SDA分别并联就像这样Master | |-- SCL -- Sensor1 (0x68) | |-- Sensor2 (0x50) | |-- SDA -- Sensor1 |-- Sensor2实际项目中遇到过地址冲突的问题——两个相同型号的传感器默认地址相同。解决方法要么改硬件地址引脚要么用I2C多路复用器(如TCA9548A)。3.2 通信时序解析用逻辑分析仪抓取的典型I2C波形START -- 地址W -- ACK -- 数据 -- ACK -- STOP \________ 单次传输 ________/特殊机制时钟拉伸从设备可以拉低SCL来请求等待重复起始位在不释放总线的情况下开始新传输10位地址扩展地址空间较少使用4. SPI速度之王4.1 四种工作模式SPI的模式由CPOL和CPHA决定模式CPOLCPHA采样时刻000上升沿101下降沿210下降沿311上升沿比如W25Q128 Flash芯片用的是Mode 3。配置错误会导致数据错位我有次把Mode 0设成Mode 3读出的ID全是0xFF。4.2 实战技巧片选管理Linux下用gpiod控制CS引脚更可靠// 手动控制CS示例 struct gpiod_chip *chip gpiod_chip_open(/dev/gpiochip0); struct gpiod_line *cs gpiod_chip_get_line(chip, 17); gpiod_line_request_output(cs, SPI_CS, 1);速度优化DMA传输能突破CPU瓶颈信号完整超过10MHz时要考虑阻抗匹配5. CAN工业级可靠性5.1 差分信号优势CAN总线用CAN_H和CAN_L的电压差表示数据显性电平逻辑0CAN_H - CAN_L 1.5V隐性电平逻辑1电压差≈0V这种设计让CAN在工厂环境中抗干扰能力极强。实测发现即使其中一根线断路网络仍能工作速率下降。5.2 报文优先级机制CAN的仲裁域包含11位标识符标准帧数值越小优先级越高。这就像急诊科分诊——心跳骤停高优先级报文可以插队处理。过滤设置示例SocketCAN# 只接收ID为0x123的报文 candump can0,123:7FF6. 协议选型指南6.1 成本敏感型场景最低成本方案UART2根线中等成本I2C需上拉电阻不考虑成本SPI硬件CS控制6.2 速率需求对照需求推荐协议100kbpsI2C/UART100k-1MbpsSPI1MbpsSPI DMA长距离可靠传输CAN6.3 开发难度评估从调试便利性看UART最友好printf调试SPI时序简单I2C需注意地址冲突CAN需要专用分析仪最近给客户做电机控制器最终选择CANSPI组合CAN负责机间通信SPI连接高速ADC。调试时先用CANalyzer抓包再用Saleae逻辑分析仪看SPI时序效率提升明显。