
大家好,我是情报小哥~
在嵌入式Linux开发中,SPI作为常用的高速同步串行通信协议,广泛应用于传感器、存储芯片、显示模块等外设交互场景。Linux内核提供了多种SPI访问方式,其中spidev框架凭借其用户空间直接操作的便捷性,成为快速开发与调试SPI外设的优选方案。本文将详细讲解如何通过spidev在Linux用户空间实现SPI通信。
Linux SPI框架支持内核态驱动开发与用户态直接访问两种模式。spidev框架的核心价值在于允许开发人员无需编写内核驱动,直接通过用户空间接口控制SPI外设,极大简化了SPI通信的开发与调试流程。其核心优势包括:
在进行软件配置前,建议通过硬件环回测试验证SPI总线的物理连通性,该方法可快速排查硬件故障(如引脚连接、电平匹配等问题)。
将SPI总线的MOSI(主机输出/从机输入)与MISO(主机输入/从机输出)引脚短接,形成数据回路。主机发送的数据会通过MOSI引脚直接反馈至MISO引脚,若接收数据与发送数据一致,则说明SPI总线硬件正常。

要让Linux系统识别SPI外设并支持spidev访问,需完成两项核心配置:内核启用spidev支持、设备树描述SPI外设信息。
启用用户态SPI设备驱动支持,步骤如下:
make menuconfig打开配置菜单;Device Drivers → SPI support → User mode SPI device driver support;y或m,y表示编译进内核,m表示编译为模块);设备树需明确描述SPI控制器、引脚配置、通信参数等信息,使内核能够正确识别并暴露spidev接口。
status = "okay");"rohm,dh2228fv"或通用"spidev");spi-max-frequency)。&spi4 { pinctrl-names = "default", "sleep"; // 引脚状态配置(默认/休眠) pinctrl-0 = <&spi4_pins_a>; // 默认状态引脚配置 pinctrl-1 = <&spi4_sleep_pins_a>; // 休眠状态引脚配置 status = "okay"; // 启用spi4控制器 spidev@0{ compatible = "rohm,dh2228fv"; // 兼容属性(支持spidev框架) reg = <0>; // 从设备地址(SPI片选信号对应,环回测试无实际意义) spi-max-frequency = <4000000>; // 最大通信速率4MHz };};pinctrl-names与pinctrl-0/1:指定SPI引脚在不同状态下的复用配置,需与开发板引脚定义一致;reg = <0>:对应SPI片选信号(CS)的索引,若系统中有多个SPI从设备,需通过该参数区分;spi-max-frequency:根据外设规格调整,需不超过SPI控制器与外设的最大支持速率。配置完成后,重新编译设备树(make dtbs),并将生成的.dtb文件更新至开发板。
spidev_test是Linux内核提供的官方测试工具,支持全双工/半双工传输、速率配置、模式切换等功能,可快速验证spidev接口的可用性。
Linux内核源码中已包含spidev_test,无需额外下载:
tools/spi/spidev_test.carch64gcc spidev_test.c -o spidev_testspidev_test可执行文件拷贝至开发板(如通过scp、U盘等方式),也就是一个执行文件~执行./spidev_test -h可查看所有支持的选项,核心参数分类如下:
-s选项指定合法速率(如-s 4000000表示4MHz);-O(CPOL)和-H(CPHA)选项配置;-b选项指定(如-b 16)。结合前文的硬件环回配置,执行以下命令进行测试:
./spidev_test -D /dev/spidev0.0 -v -l-D /dev/spidev0.0:指定SPI设备节点(需与设备树配置对应,可通过ls /dev/spidev*查看系统中存在的节点);-v:启用详细模式,打印传输参数与数据缓冲区;-l:启用环回模式(与硬件MOSI/MISO短接配合)。spi mode: 0x0bits per word: 8max speed: 500000 Hz (500 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 | 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 | ......@.... .................. .若TX(发送)与RX(接收)数据完全一致,说明SPI总线与spidev配置均正常。
-s选项指定合法速率(如-s 4000000表示4MHz);-O(CPOL)和-H(CPHA)选项配置;-b选项指定(如-b 16)。小哥搜集了一些嵌入式学习资料,公众号内回复【1024】即可找到下载链接!
推荐好文点击蓝色字体即可跳转
☞专辑|Linux应用程序编程大全 ☞ 专辑|学点网络知识 ☞ 专辑|手撕C语言 ☞ 专辑|手撕C++语言
☞ 专辑|经验分享 ☞ 专辑|从单片机到Linux ☞ 专辑|电能控制技术 ☞ 专辑|嵌入式必备数学知识 ☞ MCU进阶专辑
☞ 经验分享