04 SPI 通信
SPI子系统
SPI是一个同步片上外设通信接口;SPI数据线的位宽主要有1bit(标准spi:Single)、2bit(DualSPI)、4bit[Quad SPI (QSPI)]、8bit[Octal SPI (OSPI)]四种;因此说SPI 是“串行时钟驱动的同步接口”,但数据线不一定是单比特串行。
SPI子系统主要由以下几个部分组成:
1. sysfs 接口 Linux SPI 子系统通过 sysfs 向用户空间暴露 SPI 控制器和 SPI 从设备的注册信息及部分属性。 在 /sys/bus/spi/devices/ 下,可以查看系统中已注册的 SPI master 控制器及其挂载的 SPI 设备信息,包括设备名称、驱动绑定关系、设备地址等。 用户可通过相关 sysfs 节点查看设备状态、驱动绑定情况,并进行部分设备管理操作。
2. SPI 字符设备节点 当 SPI 设备绑定到 spidev 驱动后,系统会在 /dev 下创建相应的字符设备节点,例如 /dev/spidev0.0、/dev/spidev1.1 等,对应具体的 SPI 控制器和片选组合。 用户空间程序可通过 open()、ioctl()、read()、write() 等系统调用访问这些设备节点,从而完成 SPI 数据收发和设备交互。

sysfs接口
检测 SPI 设备
# 查看系统中可用的 SPI 设备
ls /sys/bus/spi/devices/预期输出:
spi0.0 spi1.0 spi1.1 spi2.0
#spi1.0 = SPI 总线 1,片选 0# 查看 SPI 设备信息
cat /sys/bus/spi/devices/spi0.0/modalias预期输出:
spi:dh2228fv使用 spidev_test 工具
spidev_test 是 Linux 内核自带的 SPI 测试工具,用于验证 SPI 通信是否正常。
安装spidev_test工具
- 找到RAM交叉编译器路径
find . -name "*gcc" | grep bin预期输出:
./tools/linux/toolchains/arm-gcc12.2.0-linux-uclibceabi/bin/arm-gcc12.2.0_uClibcng1.0.48-linux-uclibceabi-gcc
./tools/linux/toolchains/arm-gcc12.2.0-linux-uclibceabi/bin/arm-gcc12.2.0-linux-uclibceabi-gcc- 编译spidev_test
./tools/linux/toolchains/arm-gcc12.2.0-linux-uclibceabi/bin/arm-gcc12.2.0-linux-uclibceabi-gcc -static ./source/kernel/linux-5.10.y/tools/spi/spidev_test.c -o ./out/spidev_test此时在out目录下会出现spidev_test可执行文件
- 检查spidev_test格式
file spidev_test预期输出:
spidev_test: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, with debug_info, not stripped提示
必须是给32位ARM Linux系统运行的程序,如果是其他架构说明没使用交叉编译器
- 拷贝spidev_test文件到板端并赋予可执行权限
chmod +x spidev_test测试1:5MHz、Mode3、8bit、回环模式
# 5MHz 时钟, mode3 (CPOL=1, CPHA=1), 8bit, 使能内部回环
./spidev_test -D /dev/spidev0.0 -s 5000000 -d 8 -H -O -l预期输出:
spi mode: 0x23
bits per word: 8
max speed: 5000000 Hz (5000 kHz)测试2:10MHz、Mode2、16bit、回环模式
# 10MHz 时钟, mode2 (CPOL=1, CPHA=0), 16bit, 使能内部回环
./spidev_test -v -s 10000000 -b 16 -O -I -D /dev/spidev0.0预期输出:
spi mode: 0x2
bits per word: 16
max speed: 10000000 Hz (10000 kHz)
TX | FF FF FF FF FF FF 40 00 00 00 00 95 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF F0 0D |......@.........................|
RX | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................................|提示
回环模式(-l 参数)启用控制器内部回环,发送的数据会直接回送到接收端,用于验证 SPI 控制器本身是否正常。实际与外设通信时不要启用回环模式。
