主题:深入掌握 UART 与 SPI 驱动开发原理、架构与调试技术
本期围绕实际项目中应用最广泛的两类外设通信接口 —— UART(串口)与 SPI(串行外设接口),通过结构化知识点梳理,结合实际驱动开发流程、配置接口、通信机制和调试技巧,构建完整且工程化的通信驱动开发能力框架。
🎯 本期特训知识结构
模块 | 核心能力目标 |
---|---|
UART 驱动开发 | 掌握串口驱动框架、设备树配置、收发中断处理、波特率设置 |
SPI 驱动开发 | 理解 SPI 总线结构、主从驱动划分、时序配置、DMA应用 |
通信协议适配技巧 | 掌握 CPOL/CPHA 配置、通信频率控制、用户态调试与访问流程 |
实战问题分析 | 熟练定位通信异常、驱动不加载、收发失败等问题 |
📘 Part 1:UART 驱动开发核心知识点
✅ 1. UART 驱动架构与框架
- 基于 serial_core 架构,驱动需注册
uart_driver
与uart_port
- 通过
uart_ops
实现收发函数,响应中断并管理 FIFO
✅ 2. UART 开发完整流程
- 查阅手册获取寄存器、波特率计算方式
- 修改设备树,配置
reg
、interrupts
、clocks
- 编写
platform_driver
+probe()
注册 serial core - 实现并注册
uart_driver
与uart_ops
- 使用 minicom / screen 等工具做回环测试
✅ 3. 波特率设置机制(常考重点)
baud_rate = uartclk / (16 * divisor);
- 寄存器配置 DLL / DLM 以控制 divisor
- 波特率不匹配是常见调试失败原因
✅ 4. 中断收发机制
- 常见中断:RX、TX、LINE 状态
- 驱动中典型函数:
serial8250_rx_chars()
、serial8250_tx_chars()
📘 Part 2:SPI 驱动开发核心知识点
✅ 5. SPI 控制器与设备驱动结构
- 控制器(Master)驱动注册控制器,负责 SCLK 与 CS 管理
- 设备(Client)驱动描述挂载在总线上的外设,如 Flash、LCD、ADC
✅ 6. SPI 驱动开发步骤
- 修改设备树节点,包含 cs-gpios、reg、compatible 等信息
- 控制器注册
spi_master
,外设匹配spi_driver.probe()
- 使用
spi_sync()
/spi_async()
完成数据交换 - 设置 mode(CPOL/CPHA)、频率等参数
spi->mode = SPI_MODE_0;
spi->max_speed_hz = 10000000;
spi_setup(spi);
✅ 7. SPI 时序适配与协议细节
- SPI_MODE_0 ~ SPI_MODE_3 表示不同 CPOL / CPHA 组合
- 需严格参考外设手册,否则数据将位移或错位传输
📘 Part 3:通信驱动调试实战与进阶技巧
✅ 8. UART 无法收发的排查路径
- 回环测试:判断是否是接线问题
- 查看
dmesg
是否注册 driver 和 port 成功 - 检查设备树中中断号是否正确
- 使用示波器查看波形是否稳定
✅ 9. SPI + DMA 应用实践
- 应用于大数据量 SPI Flash、LCD、摄像头模块
- 缓冲区使用
dma_alloc_coherent()
分配 - 配置
spi_transfer
的tx_dma
和rx_dma
字段
✅ 10. 设备树中配置多个 SPI 外设
&ecspi1 {
cs-gpios = <&gpio5 10 GPIO_ACTIVE_LOW>, <&gpio5 11 GPIO_ACTIVE_LOW>;
status = "okay";
flash@0 {
reg = <0>;
compatible = "winbond,w25q64";
spi-max-frequency = <50000000>;
};
lcd@1 {
reg = <1>;
compatible = "spi,lcd";
spi-max-frequency = <8000000>;
};
};
🧪 补充:用户空间如何访问 UART / SPI 设备?
UART:
- 使用
minicom
,screen
,putty
进行串口调试
SPI:
int fd = open("/dev/spidev1.0", O_RDWR);
ioctl(fd, SPI_IOC_WR_MODE, &mode);
ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
write(fd, tx_buf, tx_len);
read(fd, rx_buf, rx_len);
📌 知识点小结
模块 | 关键内容 |
---|---|
UART 驱动 | uart_driver / uart_ops 实现 |
波特率机制 | divisor 寄存器计算 |
SPI 驱动 | 控制器注册 / 设备 probe / 数据交换 |
CPOL/CPHA | SPI_MODE 0~3 说明 |
DMA 应用 | SPI + 大数据块场景,buffer 规划 |
设备树挂载 | cs-gpios、reg、max-frequency 等配置 |
✅ 总结
本篇通过结构化知识梳理与重点模块讲解,系统呈现 UART 与 SPI 驱动开发全流程。无论是波特率配置、中断处理,还是 SPI 总线协议控制与多设备支持,都提供了可复用的工程实践路径。
📘 Day 3 预告:设备树进阶使用技巧 + 中断子系统剖析 + 多外设资源管理
欢迎持续关注本系列内容,助你构建稳定、高效、可维护的驱动开发能力体系。