第 7 章:嵌入式外设驱动与系统通信
一、从“控制”到“通信”:嵌入式系统的神经网络
前几章,我们已经掌握了信号调理、电路原理、MCU 架构。
但嵌入式系统真正强大的地方在于:
> 它不是孤立的芯片,而是一个由通信与控制连接的整体。
在现代电子系统中:
传感器 → 采集数据
MCU → 计算与控制
外设模块 → 执行 / 通信
主机 / 云端 → 管理与反馈
所有这一切的连接都依赖于通信接口和驱动软件。
---
二、嵌入式通信的层次结构
通信不只是“线连上就能传”,它有严格的分层思想:
层级 名称 作用 示例
物理层 定义电平与波形 电线、电压、电流 UART、SPI 电平
链路层 定义数据帧结构 同步、校验、寻址 I²C、CAN
传输层 定义数据包控制 重传、流控 TCP/UDP
应用层 具体协议语义 命令格式、内容 Modbus、MQTT
嵌入式系统通常主要涉及物理层与链路层,
而嵌入式联网系统(如 ESP32)会扩展到应用层。
---
三、UART 通信 —— 最古老但最经典的接口
3.1 UART 概念
UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)
是最基本的串行通信方式。
异步意味着通信双方不共享时钟信号。
数据通过 TX(发送)和 RX(接收)两根线传输。
---
3.2 UART 帧格式
一个 UART 帧包括:
起始位(1) + 数据位(5~9) + 校验位(可选) + 停止位(1或2)
例如:
8N1 格式 → 1 个起始位 + 8 数据位 + 无校验 + 1 停止位。
示例波形:
空闲线高电平
↓
|_Start_|_D0_|_D1_|_D2_|_D3_|_D4_|_D5_|_D6_|_D7_|Stop|
---
3.3 波特率(Baud Rate)
波特率定义通信速率,例如:
9600 bps
115200 bps
若发送与接收端波特率不匹配(误差 > 3%),通信将失败。
---
3.4 UART 驱动编写思路
发送端:
1. 等待发送缓冲区空;
2. 写入数据寄存器;
3. 硬件自动移位发送;
4. 发送中断触发或等待标志位。
接收端:
1. 检测接收标志位;
2. 读取接收缓冲寄存器;
3. 处理校验与缓存。
示例伪代码(STM32 HAL 框架):
HAL_UART_Transmit(&huart1, data, len, 100);
HAL_UART_Receive(&huart1, rx_buf, len, 100);
---
3.5 UART 应用举例
串口调试输出(printf);
GPS 模块通信;
蓝牙串口模块(HC-05);
RS232/RS485 工业总线。
---
四、I²C 通信 —— 双线多设备总线
4.1 I²C 基本结构
I²C(Inter-Integrated Circuit)是一种由 Philips 提出的双线通信协议。
仅需两根信号线:
SCL(时钟线);
SDA(数据线)。
支持多主多从结构。
---
4.2 数据传输机制
I²C 是同步通信协议。
主机产生时钟信号,所有设备都在该时钟下传输数据。
信号规则:
当 SCL 为高电平时,SDA 的变化代表起始 / 停止;
数据在 SCL 高电平期间稳定;
每字节传输完毕后,从机应答(ACK)。
---
4.3 典型传输过程
Start → 地址(7bit) + R/W → ACK → 数据1 → ACK → 数据2 → ... → Stop
每个从设备都有唯一地址(通常 7 位或 10 位)。
---
4.4 驱动设计关键点
起始条件与停止条件的时序要正确;
ACK 信号必须检测;
需要等待总线空闲;
多主机环境要处理仲裁。
伪代码示例:
I2C_Start();
I2C_SendByte(DeviceAddr << 1);
I2C_WaitACK();
I2C_SendByte(RegAddr);
I2C_SendByte(Data);
I2C_Stop();
---
4.5 应用实例
温湿度传感器(如 SHT30、BME280);
OLED 显示屏;
EEPROM 存储芯片;
RTC 时钟芯片(DS1307)。
---
五、SPI 通信 —— 高速同步接口
5.1 SPI 架构
SPI(Serial Peripheral Interface)由 Motorola 提出,
采用主从结构,4 根信号线:
引脚 功能
SCK 时钟信号
MOSI 主机输出,从机输入
MISO 主机输入,从机输出
CS (SS) 片选信号
---
5.2 SPI 时序模式
SPI 有 4 种模式,由时钟极性(CPOL)和相位(CPHA)决定。
不同设备要求不同模式:
模式 CPOL CPHA
0 0 0
1 0 1
2 1 0
3 1 1
注意:主从两端必须模式一致。
---
5.3 驱动编写要点
SPI 通信是全双工的,
每发送一位数据,同时接收一位。
驱动伪代码:
uint8_t SPI_Transfer(uint8_t data) {
SPI->DR = data;
while(!(SPI->SR & SPI_FLAG_RXNE));
return SPI->DR;
}
---
5.4 优缺点
优点:
高速(可达数十 MHz);
简单、硬件占用少;
全双工传输。
缺点:
不支持多主机;
每个从机需独立 CS 引脚;
传输距离有限(几米内)。
---
5.5 应用场景
显示屏(LCD、TFT、OLED);
SD 卡模块;
传感器(陀螺仪、加速度计);
FLASH 存储芯片。
---
六、CAN 总线 —— 工业级通信协议
CAN(Controller Area Network)是一种多主抗干扰总线,
广泛用于汽车与工业控制系统。
---
6.1 特点
差分信号传输,抗干扰能力强;
支持多主仲裁;
自动重发;
校验完善;
实时性强。
---
6.2 数据帧结构
CAN 帧包括:
起始位 → 标识符 → 控制位 → 数据段 → CRC 校验 → ACK → 结束位
常见速率:125Kbps ~ 1Mbps。
---
6.3 驱动机制
CAN 驱动通常依靠硬件过滤器和中断机制。
MCU 中的 CAN 控制器负责自动仲裁与错误处理。
---
6.4 应用领域
车辆 ECU 通信;
电机控制网络;
机器人控制系统;
工业自动化。
---
七、DMA —— 解放 CPU 的数据传输引擎
DMA(Direct Memory Access)允许外设与内存直接交换数据,无需 CPU 干预。
7.1 工作原理
1. CPU 配置 DMA 通道;
2. 外设触发 DMA 请求;
3. DMA 自动搬运数据;
4. 传输完成触发中断。
---
7.2 优势
极大提高系统吞吐;
降低 CPU 占用;
实现实时数据流处理。
---
7.3 应用示例
ADC 连续采样;
UART 接收环形缓冲;
SPI 高速传输;
显示数据刷新。
---
八、通信协议栈与数据管理
嵌入式通信的上层通常通过协议栈(Protocol Stack)管理数据流。
8.1 Modbus 协议
一种广泛用于工业的通信标准。
支持:
RTU(串口);
TCP(以太网)。
帧结构:
地址 + 功能码 + 数据 + CRC 校验
---
8.2 MQTT 协议
IoT 领域常用的轻量级发布/订阅协议。
适用于 ESP32、嵌入式 Linux 系统。
---
8.3 数据缓存与队列
在多任务系统中,常通过环形缓冲区(Ring Buffer)或消息队列(Queue)管理通信数据。
---
九、驱动设计思想
嵌入式驱动是软硬件结合最紧密的部分。
核心思想:
1. 硬件抽象化(HAL 层)
屏蔽寄存器差异;
提供统一 API。
2. 中断与 DMA 驱动
减少 CPU 负载;
提升实时性。
3. 状态机设计
用结构体保存驱动状态;
用 switch-case 管理通信流程。
4. 分层架构:
应用层(App)
↓
驱动接口层(Driver API)
↓
硬件抽象层(HAL)
↓
寄存器操作层(LL)
---
十、调试与问题排查技巧
通信问题排查流程:
1. 检查供电与地线;
2. 检查时钟与波特率;
3. 用逻辑分析仪抓包;
4. 校验 ACK 或 CRC;
5. 确认模式匹配(SPI、UART、I²C)。
抗干扰措施:
加 RC 滤波;
短线、差分布线;
软件重发机制;
校验码检测。
系统稳定性优化:
中断优先级调整;
DMA 缓冲区双缓冲;
Watchdog 防死机。
---
十一、通信系统的整体思维
通信是嵌入式的“神经系统”,
稳定的通信意味着系统的可靠与智能。
> 数据的准确传输 = 控制的可靠执行。
从 UART 到 SPI,从 I²C 到 CAN,从底层电平到协议逻辑,
真正的工程师要能:
画得出时序;
看得懂波形;
写得出驱动;
找得出干扰源。
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐


所有评论(0)