在嵌入式系统和电子设备开发中,UART、I2C和CAN是三种最常用的串行通信协议。它们各自有着独特的设计哲学和应用场景,理解它们的区别对于硬件工程师和嵌入式开发者来说至关重要。
这三种协议都采用串行数据传输方式,但它们在物理层实现、协议架构和应用场景上存在显著差异。UART是最基础的异步串行通信,I2C采用同步主从架构,而CAN则是为工业环境设计的可靠总线协议。选择哪种协议取决于项目对速度、可靠性、复杂度和成本的要求。
提示:在实际项目中,经常需要同时使用多种通信协议。例如主控芯片通过UART与调试终端通信,通过I2C连接传感器,同时通过CAN总线与其它设备组网。
UART(Universal Asynchronous Receiver/Transmitter)采用异步通信方式,不需要时钟信号同步。其典型连接只需要TX(发送)、RX(接收)和GND(地线)三根线。数据以帧为单位传输,每帧包含:
常见的波特率从9600bps到115200bps不等,工业设备可能支持更高速度。例如:
c复制// 典型UART初始化配置(以STM32 HAL库为例)
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
UART最常见的应用包括:
优势:
局限:
注意:UART通信双方必须预先约定相同的波特率,即使微小偏差也会导致数据错误。建议使用自动波特率检测或高精度晶振。
I2C(Inter-Integrated Circuit)是飞利浦开发的同步串行协议,使用两条线:
物理层特点:
典型传输时序:
code复制开始条件 → 地址字节(R/W位) → 应答 → 数据字节 → 应答 → ... → 停止条件
I2C协议包含几个关键机制:
例如读取I2C传感器的典型代码:
c复制// 读取BH1750光照传感器数据
HAL_I2C_Master_Transmit(&hi2c1, 0x23<<1, ®_addr, 1, 100);
HAL_Delay(120);
HAL_I2C_Master_Receive(&hi2c1, 0x23<<1, buffer, 2, 100);
lux = (buffer[0]<<8) | buffer[1];
典型应用:
主要限制:
CAN(Controller Area Network)是专为汽车电子设计的可靠总线协议,其特点包括:
CAN帧结构复杂,包含:
CAN协议有几个革命性设计:
例如使用STM32 CAN外设的配置:
c复制hcan.Instance = CAN1;
hcan.Init.Prescaler = 6;
hcan.Init.Mode = CAN_MODE_NORMAL;
hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;
hcan.Init.TimeSeg1 = CAN_BS1_13TQ;
hcan.Init.TimeSeg2 = CAN_BS2_2TQ;
hcan.Init.TimeTriggeredMode = DISABLE;
CAN总线广泛应用于:
在电动汽车中,CAN总线通常用于:
| 特性 | UART | I2C | CAN |
|---|---|---|---|
| 通信方式 | 异步 | 同步 | 同步 |
| 典型速率 | 9600-115200bps | 100k-400kbps | 125k-1Mbps |
| 拓扑结构 | 点对点 | 多主多从 | 多主 |
| 错误检测 | 奇偶校验(可选) | 无 | CRC+多种机制 |
| 硬件复杂度 | 低 | 中 | 高 |
| 最大设备数 | 2 | 理论128(7位地址) | 理论上无限制 |
选择通信协议时应考虑:
设备数量:
通信距离:
可靠性要求:
开发资源:
现代汽车电子系统通常组合使用这些协议:
在工业PLC系统中:
无通信:
数据错误:
设备无应答:
通信不稳定:
无法进入正常工作模式:
高错误帧率:
专业技巧:使用CAN分析仪捕获原始帧数据比单纯看错误计数器更有效。对于关键系统,建议实现CAN FD(灵活数据率)以获得更高带宽。