当前位置:首页>Linux>在Linux用户态操作SPI接口的优选方法

在Linux用户态操作SPI接口的优选方法

  • 2026-08-26 15:29:30
在Linux用户态操作SPI接口的优选方法

大家好,我是情报小哥~

在嵌入式Linux开发中,SPI作为常用的高速同步串行通信协议,广泛应用于传感器、存储芯片、显示模块等外设交互场景。Linux内核提供了多种SPI访问方式,其中spidev框架凭借其用户空间直接操作的便捷性,成为快速开发与调试SPI外设的优选方案。本文将详细讲解如何通过spidev在Linux用户空间实现SPI通信。

一、spidev框架简介

Linux SPI框架支持内核态驱动开发与用户态直接访问两种模式。spidev框架的核心价值在于允许开发人员无需编写内核驱动,直接通过用户空间接口控制SPI外设,极大简化了SPI通信的开发与调试流程。其核心优势包括:

  • 无需深入内核驱动开发,降低技术门槛;
  • 支持全双工/半双工通信、多种SPI模式配置;
  • 可灵活调整通信速率、数据位宽等参数;
  • 兼容Linux标准文件操作接口(open/read/write/ioctl)。

二、硬件环回测试(MOSI/MISO短路)

在进行软件配置前,建议通过硬件环回测试验证SPI总线的物理连通性,该方法可快速排查硬件故障(如引脚连接、电平匹配等问题)。

2.1 测试原理

将SPI总线的MOSI(主机输出/从机输入)与MISO(主机输入/从机输出)引脚短接,形成数据回路。主机发送的数据会通过MOSI引脚直接反馈至MISO引脚,若接收数据与发送数据一致,则说明SPI总线硬件正常。

三、设备树(DT)与内核配置

要让Linux系统识别SPI外设并支持spidev访问,需完成两项核心配置:内核启用spidev支持、设备树描述SPI外设信息。

3.1 内核配置

启用用户态SPI设备驱动支持,步骤如下:

  1. 进入Linux内核源码目录,执行make menuconfig打开配置菜单;
  2. 导航至Device Drivers → SPI support → User mode SPI device driver support;
  3. 勾选该选项(配置为y或m,y表示编译进内核,m表示编译为模块);
  4. 保存配置并重新编译内核(或模块),更新开发板内核镜像。

3.2 设备树配置

设备树需明确描述SPI控制器、引脚配置、通信参数等信息,使内核能够正确识别并暴露spidev接口。

  • 启用SPI控制器(设置status = "okay");
  • 配置引脚复用(指定pinctrl节点,对应SPI功能引脚);
  • 添加spidev子节点(兼容属性为"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的SPI单元测试

spidev_test是Linux内核提供的官方测试工具,支持全双工/半双工传输、速率配置、模式切换等功能,可快速验证spidev接口的可用性。

4.1 工具获取与编译

Linux内核源码中已包含spidev_test,无需额外下载:

源码路径:tools/spi/spidev_test.c
编译方法:单独交叉编译:
arch64gcc spidev_test.c -o spidev_test
安装:将编译生成的spidev_test可执行文件拷贝至开发板(如通过scp、U盘等方式),也就是一个执行文件~

4.2 核心选项说明

执行./spidev_test -h可查看所有支持的选项,核心参数分类如下:

类别
选项
功能描述
设备配置
-D/--device
指定spidev设备节点(默认/dev/spidev1.1)
-s/--speed
最大通信速率(Hz)
-d/--delay
传输延迟(微秒)
SPI模式
-H/--cpha
时钟相位(CPHA)配置
-O/--cpol
时钟极性(CPOL)配置
传输模式
-l/--loop
启用环回模式(适用于硬件环回测试)
-t/--txonly
仅发送(半双工)
-r/--rxonly
仅接收(半双工)
数据配置
-b/--bpw
每字数据位宽(如8位、16位)
-S/--size
单次传输数据长度
-I/--iter
传输迭代次数
数据输入输出
-i/--input
从文件读取输入数据(如test.bin)
-o/--output
输出数据到文件(如results.bin)
-p
直接指定发送数据(如"1234\xde\xad")
辅助功能
-v/--verbose
详细模式(显示发送/接收缓冲区数据)

速率适配:默认通信速率为500KHz,若系统时钟配置不支持该速率(SPI控制器最大速率为输入时钟的1/256),需通过-s选项指定合法速率(如-s 4000000表示4MHz);

模式匹配:若外设要求特定的CPOL/CPHA组合(如SPI模式1、2、3),需通过-O(CPOL)和-H(CPHA)选项配置;
数据位宽:默认每字8位,若外设支持其他位宽(如16位),通过-b选项指定(如-b 16)。

4.3 32字节全双工环回测试

结合前文的硬件环回配置,执行以下命令进行测试:

./spidev_test -D /dev/spidev0.0 -v -l

4.3.1 命令解析

  • -D /dev/spidev0.0:指定SPI设备节点(需与设备树配置对应,可通过ls /dev/spidev*查看系统中存在的节点);
  • -v:启用详细模式,打印传输参数与数据缓冲区;
  • -l:启用环回模式(与硬件MOSI/MISO短接配合)。

4.3.2 预期输出

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配置均正常。

4.4 注意事项

  • 速率适配:默认通信速率为500KHz,若系统时钟配置不支持该速率(SPI控制器最大速率为输入时钟的1/256),需通过-s选项指定合法速率(如-s 4000000表示4MHz);
  • 模式匹配:若外设要求特定的CPOL/CPHA组合(如SPI模式1、2、3),需通过-O(CPOL)和-H(CPHA)选项配置;
  • 数据位宽:默认每字8位,若外设支持其他位宽(如16位),通过-b选项指定(如-b 16)。

END

来源:嵌入式情报局


版权归原作者所有,如有侵权,请联系删除。
▍推荐阅读
嵌入式UI开发新选择:CDroid
C语言为啥还没灭亡?甚至推出了新标准C23
一个软件打磨了28年,被安装超过100亿次,居然赚不到钱?
→点关注,不迷路←

最新文章

随机文章