一、为什么外设总线重要
嵌入式开发经常要和硬件打交道。传感器、屏幕、Flash、按键、LED、通信模块都需要通过某种接口和主控芯片连接。
最常见的外设接口:
- GPIO。
- UART。
- I2C。
- SPI。
- PWM。
- ADC。
理解这些接口,是从应用开发走向板级开发和驱动开发的基础。
二、GPIO
GPIO 是通用输入输出引脚,可以输出高低电平,也可以读取外部电平。
常见用途:
- 点亮 LED。
- 读取按键。
- 控制复位脚。
- 控制电源使能。
- 读取硬件状态。
输出控制:
1 | 0 -> 低电平 |
输入读取:
1 | 0 -> 外部低电平 |
Linux 下可以通过 gpiod 工具调试:
1 | gpiodetect |
三、UART
UART 是串口通信,嵌入式调试最常用。
常见参数:
1 | 115200 8N1 |
含义:
- 波特率:115200。
- 数据位:8。
- 校验位:None。
- 停止位:1。
Linux 下串口设备常见名称:
1 | /dev/ttyS0 |
使用 picocom:
1 | picocom -b 115200 /dev/ttyUSB0 |
UART 常见问题:
- TX/RX 接反。
- GND 没共地。
- 波特率不一致。
- 电平不匹配,TTL 和 RS232 不能直接接。
四、I2C
I2C 是两线总线:
1 | SCL 时钟 |
特点:
- 支持多个从设备。
- 每个设备有地址。
- 速度通常不高。
- 常用于传感器、EEPROM、RTC、电源管理芯片。
Linux 调试工具:
1 | sudo apt install -y i2c-tools |
查看总线:
1 | i2cdetect -l |
扫描设备:
1 | i2cdetect -y 1 |
读取寄存器:
1 | i2cget -y 1 0x50 0x00 |
写寄存器:
1 | i2cset -y 1 0x50 0x00 0x12 |
I2C 常见问题:
- 没有上拉电阻。
- 地址写错,7 位地址和 8 位地址混淆。
- 设备没供电。
- 设备被内核驱动占用。
- 时序或电压不匹配。
五、SPI
SPI 常见四根线:
1 | SCLK 时钟 |
特点:
- 速度快。
- 全双工。
- 没有统一设备地址,通过 CS 选择设备。
- 常用于屏幕、Flash、ADC、无线模块。
关键参数:
- 时钟频率。
- CPOL。
- CPHA。
- bit order。
- 片选极性。
Linux 下常见设备:
1 | /dev/spidev0.0 |
SPI 常见问题:
- mode 配错。
- CS 不对。
- 频率太高。
- MOSI/MISO 接反。
- 设备需要额外 reset 或 dc 引脚。
六、PWM
PWM 是脉宽调制,通过控制占空比模拟不同输出效果。
常见用途:
- LED 亮度。
- 蜂鸣器。
- 电机调速。
- 舵机控制。
关键参数:
- 周期。
- 占空比。
- 极性。
示例:
1 | 周期 20ms,占空比 1.5ms,常用于舵机中位 |
七、ADC
ADC 用于把模拟电压转换成数字值。
常见用途:
- 电池电压。
- 电位器。
- 光照传感器。
- 温度传感器。
关注点:
- 分辨率:例如 12 bit。
- 参考电压。
- 采样率。
- 输入范围。
- 噪声和滤波。
八、调试外设的顺序
遇到外设不工作,不要直接怀疑驱动,按顺序检查:
- 原理图连接是否正确。
- 电源是否正常。
- GND 是否共地。
- 复位脚和使能脚是否正确。
- 管脚复用是否配置正确。
- 设备树是否开启。
- 总线是否能扫描到设备。
- 驱动是否加载。
- 应用层参数是否正确。
九、学习建议
建议从 UART 和 GPIO 开始,因为反馈最直接。然后学习 I2C 读取传感器,再学习 SPI 驱动屏幕或 Flash。
每学一个外设,都要同时理解:
- 硬件连接。
- 时序协议。
- Linux 设备节点。
- 调试工具。
- 典型错误。
嵌入式开发最重要的是把软件现象和硬件信号联系起来。
- 本文链接: https://blog.hansong.icu/2026/06/21/Embedded_Dev_Peripheral_Bus/
- 版权声明: 本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 4.0 许可协议。