深入解析单片机常用通信协议:UART、I2C、SPI与CAN

目录

一、UART:异步串行通信的基石

二、I2C:双线制总线协议的精妙设计

三、SPI:高速全双工通信的首选

四、CAN:工业级可靠通信协议

常见问题解答


在嵌入式系统设计中,通信协议如同设备的“语言”,决定了单片机如何与传感器、存储器、显示屏等外设高效对话。本文将深入剖析四种核心协议的工作原理与应用场景。

一、UART:异步串行通信的基石

物理层特性

  • 最少引脚:仅需TX(发送)、RX(接收)、GND三线

  • 电平标准:TTL(0-3.3V/5V)或RS-232(±3~15V)

  • 波特率自适应:双方需预设相同波特率(常见9600/115200bps)

数据帧结构示例

[起始位0] [D0][D1][D2][D3][D4][D5][D6][D7] [校验位] [停止位1]

典型应用场景

  • GPS模块数据传输

  • 蓝牙模块通信

  • 调试信息输出(printf重定向)

关键配置代码(STM32 HAL库)

UART_HandleTypeDef huart;
huart.Instance = USART1;
huart.Init.BaudRate = 115200;
huart.Init.WordLength = UART_WORDLENGTH_8B;
huart.Init.StopBits = UART_STOPBITS_1;
huart.Init.Parity = UART_PARITY_NONE;
HAL_UART_Init(&huart);

// 发送数据
uint8_t tx_data[] = "Hello UART!";
HAL_UART_Transmit(&huart, tx_data, sizeof(tx_data), 100);

二、I2C:双线制总线协议的精妙设计

拓扑结构

主设备 ──┬── SCL ──┐
         ├── SDA ──┼──> 从设备1
         └── 4.7kΩ上拉 ──> 从设备2

协议流程解析

  1. 起始条件:SCL高电平时SDA从高→低

  2. 地址帧:7位地址 + R/W位(0写/1读)

  3. 应答信号:每字节后接收方拉低SDA

  4. 数据帧:8位数据 + ACK/NACK

  5. 停止条件:SCL高电平时SDA从低→高

地址冲突解决方案

// 扫描I2C总线设备
for(uint8_t addr=0x08; addr<=0x77; addr++) {
  if(HAL_I2C_IsDeviceReady(&hi2c, addr<<1, 3, 100) == HAL_OK) {
    printf("Device found at 0x%X\n", addr);
  }
}

三、SPI:高速全双工通信的首选

四线制信号

信号线作用
SCLK主设备提供的时钟
MOSI主出从入(Master Out Slave In)
MISO主入从出(Master In Slave Out)
CS片选(低电平有效)

时钟模式配置

typedef enum {
  SPI_MODE0 = 0,  // CPOL=0, CPHA=0
  SPI_MODE1,      // CPOL=0, CPHA=1
  SPI_MODE2,      // CPOL=1, CPHA=0
  SPI_MODE3       // CPOL=1, CPHA=1
} SPIMode;

性能对比(STM32F4系列)

  • 理论最高速率:42MHz (APB2时钟)

  • 实际吞吐量:约30Mbps(受PCB布局影响)


四、CAN:工业级可靠通信协议

抗干扰核心机制

  • 差分信号:CAN_H与CAN_L电压差表示数据

  • 非破坏性仲裁:ID值小的节点优先发送

  • CRC校验:15位循环冗余校验码

标准帧格式

[SOF][11位ID][RTR][IDE][DLC][数据域0-8字节][CRC][ACK][EOF]

典型应用电路

        +-------------+
MCU_CAN-----| CAN收发器 |----> CAN_H
        | (如TJA1050)|----> CAN_L
        +-------------+
                ╰── 120Ω终端电阻

常见问题解答

Q1:I2C总线上拉电阻如何取值?

计算公式:Rp_min = (Vdd - Vol_max) / Iol_max
典型值:3.3V系统用4.7kΩ,5V系统用2.2kΩ

Q2:SPI时钟相位配置错误导致数据错位?

解决方案:

  1. 用示波器捕获SCLK与MOSI时序

  2. 确认从设备要求的CPHA/CPOL

  3. 调整SPI_CR寄存器的CPOL/CPHA位

Q3:CAN总线出现错误帧如何处理?

诊断步骤:

  1. 检查终端电阻(应为120Ω)

  2. 测量CAN_H-CAN_L静态电压(正常2.5V)

  3. 使用CAN分析仪捕获错误码

掌握这些通信协议的底层原理与应用技巧,将大幅提升嵌入式系统设计的可靠性与效率。实际开发中建议结合逻辑分析仪进行信号抓取,可直观验证协议实现的正确性。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值