Raspberry Pi SPI总线技术详解
概述
SPI(Serial Peripheral Interface)是一种同步串行通信接口,广泛应用于嵌入式系统中连接各种外设。Raspberry Pi系列计算机配备了多个SPI总线控制器,可用于连接显示器、网络控制器、UART等多种外设设备。
SPI硬件架构
各型号Raspberry Pi的SPI控制器配置
不同型号的Raspberry Pi配备了不同数量的SPI控制器:
-
基础型号(Zero、1、2、3):
- SPI0:2个硬件片选,所有型号都可用
- SPI1:3个硬件片选(原始Model A/B除外)
- SPI2:3个硬件片选(仅Compute Module 1/3/3+)
-
高级型号(4、400、Compute Module 4):
- 额外提供SPI3-SPI6总线,每条总线2个硬件片选
- 这些额外SPI总线通过特定GPIO引脚的复用功能实现
引脚映射详解
SPI0标准映射(所有型号)
| SPI功能 | 引脚号 | Broadcom引脚名 | 功能定义 | |---------|--------|----------------|----------| | MOSI | 19 | GPIO10 | SPI0_MOSI| | MISO | 21 | GPIO09 | SPI0_MISO| | SCLK | 23 | GPIO11 | SPI0_SCLK| | CE0 | 24 | GPIO08 | SPI0_CE0_N| | CE1 | 26 | GPIO07 | SPI0_CE1_N|
SPI0替代映射(仅Compute Module)
Compute Module提供了另一组引脚用于SPI0功能,方便特殊应用场景下的布线。
SPI1映射(大多数型号可用)
SPI1提供了3个片选信号,适合连接多个SPI设备。
SPI3-SPI6(BCM2711专用)
这些新增的SPI总线为Raspberry Pi 4及更高版本提供了更丰富的外设连接能力。
SPI工作模式
主模式类型
-
标准模式:
- 使用三线制(SCLK、MOSI、MISO)
- 最常见的SPI通信方式
-
双向模式:
- 使用单线数据线(MOMI)
- 节省引脚资源但为半双工通信
-
LoSSI模式:
- 专为LCD控制器设计
- 9位传输格式(1位命令/数据标识+8位内容)
传输模式
- 轮询模式:CPU主动检查状态
- 中断模式:事件驱动,效率较高
- DMA模式:直接内存访问,最高效
时钟速度配置
SPI时钟速度由核心时钟分频得到:
SCLK = 核心时钟 / CDIV
其中CDIV必须为偶数,若设为0则使用65536分频。实际可用速度受电气特性限制,通常超过50MHz可能不稳定。
SPI软件支持
Linux驱动
默认使用spi-bcm2835
驱动,支持以下特性:
-
模式支持:
- 时钟极性和相位可配置
- 片选高/低有效
- 无片选模式(单设备)
- 3线双向模式
-
数据位宽:
- 标准8位模式
- LCD专用的9位LoSSI模式
-
性能优化:
- SPI0和SPI3-6支持DMA传输
- 其他总线支持中断模式
启用配置
-
SPI0:
- 默认禁用,需在config.txt中添加
dtparam=spi=on
- 可选择1或2个片选配置
- 默认禁用,需在config.txt中添加
-
SPI1:
- 通过dtoverlay启用,支持1-3个片选
- 示例:
dtoverlay=spi1-2cs
-
高级SPI总线:
- 类似方式配置SPI2-SPI6
用户空间接口
spidev
提供了用户空间访问SPI的接口:
- C语言:使用ioctl系统调用
- Python:通过spidev或SPI-Py库
- Shell:直接写入设备文件
示例Shell命令:
echo -ne "\x01\x02\x03" > /dev/spidev0.0
故障排查指南
回环测试
连接MOSI和MISO引脚进行自发自收测试:
-
下载测试程序:
wget https://raw.githubusercontent.com/raspberrypi/linux/rpi-6.1.y/tools/spi/spidev_test.c
-
编译并运行:
gcc -o spidev_test spidev_test.c ./spidev_test -D /dev/spidev0.0
-
预期输出应显示发送和接收的数据匹配。
常见问题
-
速度不稳定:
- 检查线缆长度和质量
- 降低时钟频率测试
- 确保电源稳定
-
通信失败:
- 验证引脚连接正确
- 检查设备树配置
- 确认片选信号有效
-
双向模式问题:
- 确保正确设置SPI_3WIRE模式
- 传输结构体中tx或rx必须为NULL
通过本文的详细说明,开发者可以充分利用Raspberry Pi的SPI接口能力,连接各种外设并实现高效通信。实际应用中应根据具体需求选择合适的模式和工作参数。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考