目录
在嵌入式系统设计中,通信协议如同设备的“语言”,决定了单片机如何与传感器、存储器、显示屏等外设高效对话。本文将深入剖析四种核心协议的工作原理与应用场景。
一、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
协议流程解析
-
起始条件:SCL高电平时SDA从高→低
-
地址帧:7位地址 + R/W位(0写/1读)
-
应答信号:每字节后接收方拉低SDA
-
数据帧:8位数据 + ACK/NACK
-
停止条件: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时钟相位配置错误导致数据错位?
解决方案:
用示波器捕获SCLK与MOSI时序
确认从设备要求的CPHA/CPOL
调整SPI_CR寄存器的CPOL/CPHA位
Q3:CAN总线出现错误帧如何处理?
诊断步骤:
检查终端电阻(应为120Ω)
测量CAN_H-CAN_L静态电压(正常2.5V)
使用CAN分析仪捕获错误码
掌握这些通信协议的底层原理与应用技巧,将大幅提升嵌入式系统设计的可靠性与效率。实际开发中建议结合逻辑分析仪进行信号抓取,可直观验证协议实现的正确性。
1108

被折叠的 条评论
为什么被折叠?



