RK 平台 SPI 开发完全指南(驱动 + 配置 + 测试 + 优化)

电子说

1.4w人已加入

描述

 

 

 

在嵌入式Linux开发中,SPI(串行外设接口)凭借高速同步通信特性,广泛应用于传感器、存储芯片、显示模块等外设交互场景。瑞芯微(Rockchip)作为主流嵌入式芯片厂商,其Linux平台SPI驱动已形成完善的开发体系,支持Master/Slave双模式、多速率适配及灵活配置。本文基于Rockchip官方开发指南,从功能特性、驱动配置、测试验证到优化方案,全方位拆解RK平台SPI开发流程。

Linux

一、RK平台SPI核心特性速览

 

 

1. 基础支持能力

 

 

协议兼容:默认采用摩托罗拉SPI协议,支持4种传输模式(CPOL/CPHA组合配置)

 

 

数据宽度:支持8/16位传输,16位模式可提升DMA传输效率

 

 

片选扩展:每个SPI控制器支持1-2个硬件片选,可通过cs-gpios扩展更多片选信号

 

 

内核适配:兼容Linux4.4Linux4.19及以上内核(含Linux5.10),新增Slave模式框架支持

 

 

2. 关键速率参数(全平台汇总)

 

 

SOC系列

 

 

Master模式最高速率

 

 

Slave模式最高速率

 

 

RK3506/RK3588

 

 

50MHz

 

 

50MHz/33MHz

 

 

RV1103B/RV1106B

 

 

50MHz

 

 

33MHz

 

 

RK3576/RK3562

 

 

50MHz

 

 

33MHz

 

 

RV1126/RV1109

 

 

50MHz

 

 

16MHz

 

 

其他平台

 

 

50MHz

 

 

16MHz

 

 

 注意:表格速率为理论值,实际受PCB走线质量、PLL分频策略影响,需以实测为准;部分平台需配置100MHz工作时钟(二分频后输出50MHz)。

 

 

二、开发环境与核心代码路径

 

 

1. 内核配置前提

 

 

需在Kernel配置中启用SPI相关支持,配置路径如下:

 

 

  •  
  •  
  •  
  •  
  •  
Device Drivers --->  [*] SPI support --->    <*> Rockchip SPI controller driver  # RK专用SPI控制器驱动    <*> User mode SPI device driver support  # 用户态访问支持(可选)    [*] SPI slave protocol handlers  # Slave模式支持(如需从机功能)

2. 核心代码位置

 

 

功能模块

 

 

代码路径

 

 

作用说明

 

 

SPI驱动框架

 

 

drivers/spi/spi.c

 

 

Linux通用SPI框架实现

 

 

RK SPI主控驱动

 

 

drivers/spi/spi-rockchip.c

 

 

主控模式核心逻辑、寄存器操作

 

 

RK SPI从机驱动

 

 

drivers/spi/spi-rockchip-slave.c

 

 

从机模式数据传输、DMA处理

 

 

用户态设备节点驱动

 

 

drivers/spi/spidev.c

 

 

创建/dev/spidev设备节点,支持用户态操作

 

 

内核测试驱动

 

 

drivers/spi/spi-rockchip-test.c

 

 

内核态测试工具,需手动添加编译

 

 

用户态测试工具

 

 

Documentation/spi/spidev_test.c

 

 

用户态SPI读写测试示例程序

 

 

三、SPI驱动配置实战(Master/Slave双模式)

 

 

1. Master模式配置(RK芯片作为主机)

 

 

1DTS节点配置示例(以SPI0为例)

 

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
&spi0 {    status = "okay";    // 可选配置:关闭DMA仅用IRQ传输(默认开启DMA)    // dma-names;    // 可选配置:读采样延时(单位ns,需根据外设调整)    // rx-sample-delay-ns = <10>;    // 可选配置:Runtime PM休眠延时(优化功耗)    // rockchip,autosuspend-delay-ms = <500>;    spi_test@0 {        compatible = "rockchip,spi_test_bus0_cs0";  // 与驱动匹配名        reg = <0>;  // 片选编号(0或1)        spi-cpha;  // 配置CPHA=1(默认0)        spi-cpol;  // 配置CPOL=1(默认0)        spi-lsb-first;  // 小端优先传输(默认大端)        spi-max-frequency = <24000000>;  // 传输速率(不超过50MHz)    };};

2)时钟配置说明

 

 

SPI输出时钟(spi-max-frequency)由工作时钟(assigned-clock-rates)分频得到

 

 

约束关系:assigned-clock-rates ≥ 2×spi-max-frequency(内部分频为偶数)

 

 

示例:需50MHz传输速率时,配置assigned-clock-rates = <100000000>

 

 

2. Slave模式配置(RK芯片作为从机)

 

 

1)关键依赖

 

 

需先确认SDK包含Slave驱动补丁(commit 10cbf3c2),无补丁可通过瑞芯微Redmine获取。

 

 

2DTS节点配置示例(以SPI1为例)

 

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
&spi1 {    compatible = "rockchip,spi-slave";  // 从机模式标识    status = "okay";    ready-gpios = <&gpio1 RK_PD3 GPIO_ACTIVE_LOW>;  // 就绪信号(下降沿有效)    // 可选配置:屏蔽CS释放检测(适用于长时序场景)    // rockchip,cs-inactive-disable;    slave@0 {        compatible = "rockchip,spi_test_bus1_cs0";        reg = <0>;  // 从机仅支持片选0        spi-cpha;        spi-cpol;        spi-lsb-first;        max-frequency = <33000000>;  // 遵循对应SOC的Slave速率限制    };};

3)从机模式关键须知

 

 

传输顺序:Slave需先启动读写操作,Master再发起传输(避免数据丢失)

 

 

DMA建议:Slave模式默认启用DMA,不建议关闭(大长度传输需依赖DMA避免缓存溢出)

 

 

性能模式:Master速率>5MHz8位)/10MHz16位)时,需开启performance模式

 

 

3. cs-gpios片选扩展(Linux4.19+

 

 

当硬件片选不足时,可通过GPIO模拟片选,配置步骤如下:

 

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
// 1. 定义GPIO引脚功能&pinctrl {    spi1 {        spi1_cs2n: spi1-cs2n {            rockchip,pins = <0 RK_PC4 RK_FUNC_GPIO &pcfg_pull_up_drv_level_0>;        };    };};// 2. SPI节点引用扩展片选&spi1 {    status = "okay";    cs-gpios = <&gpio0 RK_PC2 GPIO_ACTIVE_LOW>,  // 原有片选0               <&gpio0 RK_PC3 GPIO_ACTIVE_LOW>,  // 原有片选1               <&gpio0 RK_PC4 GPIO_ACTIVE_LOW>;  // 扩展片选2};

四、驱动开发与测试验证

 

 

1. 内核态驱动开发示例

 

 

核心实现probe函数(设备匹配与初始化)和读写接口,参考代码:

 

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
#include static int spi_test_probe(struct spi_device *spi) {    int ret;    if (!spi) return -ENOMEM;
    spi->bits_per_word = 8;  // 设置数据宽度    ret = spi_setup(spi);    // 初始化SPI配置    if (ret < 0) {        dev_err(&spi->dev, "SPI配置失败n");        return ret;    }    return 0;}// 设备树匹配表static const struct of_device_id spi_test_dt_match[] = {    {.compatible = "rockchip,spi_test_bus0_cs0"},    {.compatible = "rockchip,spi_test_bus1_cs0"},    {},};MODULE_DEVICE_TABLE(of, spi_test_dt_match);// SPI驱动结构体static struct spi_driver spi_test_driver = {    .driver = {        .name = "spi_test",        .of_match_table = of_match_ptr(spi_test_dt_match),    },    .probe = spi_test_probe,    .remove = spi_test_remove,};module_init(spi_test_init);  // 驱动注册module_exit(spi_test_exit);  // 驱动卸载

2. 测试验证步骤

 

 

1)内核态测试(使用spi-rockchip-test驱动)

 

 

1.编译驱动:在drivers/spi/Makefile中添加obj-y += spi-rockchip-test.o

 

 

2.加载驱动后,执行测试命令:

 

 

  •  
  •  
  •  
  •  
  •  
  •  
# 写测试:向ID=0的设备写入10次,每次255字节echo write 0 10 255 > /dev/spi_misc_test# 读测试:从ID=0的设备读取10次,每次255字节echo read 0 10 255 > /dev/spi_misc_test# 速率设置:将ID=0的设备速率设为1MHzecho setspeed 0 1000000 > /dev/spi_misc_test

2)用户态测试(使用spidev设备节点)

 

 

1.编译测试工具:make CROSS_COMPILE=xxx-linux-gnu- -C linux-src M=Documentation/spi

 

 

2.运行测试程序:

 

 

  •  
  •  
# 读取spidev1.1设备,传输1024字节./spidev_test -D /dev/spidev1.1 -s 24000000 -r -n 1024

3Slave模式专项测试

 

 

1.Slave端启动写操作:echo write 0 1 16 > /dev/spi_misc_test

 

 

2.Master端启动读操作:echo read 0 1 16 > /dev/spi_misc_test

 

 

3.自动化压测(Master端):echo autotest 1024 64 1 > /dev/spidev_rkmst_misc1024字节×64次,开启校验)

 

 

五、常见问题与优化方案

 

 

1. 高频问题排查

 

 

1SPI无信号输出

 

 

检查驱动加载状态:lsmod | grep spi_rockchip

 

 

确认引脚配置:验证IOMUX是否正确映射为SPI功能

 

 

排查DMA使能:串口无"Failed to request TX/RX DMA channel"DMA正常

 

 

增强驱动强度:高频场景下提高GPIO驱动能力改善信号质量

 

 

2)传输数据错误

 

 

速率匹配:确认Master/Slave速率不超过对应SOC的限制

 

 

采样延时:高速传输时添加rx-sample-delay-ns配置(如10ns

 

 

模式一致性:MasterSlaveCPOL/CPHA配置必须一致

 

 

2. 性能优化方向

 

 

1)降低CPU占用率

 

 

开启Runtime PMdts添加rockchip,autosuspend-delay-ms = <500>

 

 

调整传输模式:小数据量场景改用IRQ传输(关闭DMA

 

 

优化DMA水线:修改TX DMA水线值(如设为11)减少回调等待时间

 

 

2)提升传输速率

 

 

启用16位数据宽度:最大化FIFO利用率,加速DMA传输

 

 

开启performance模式:避免DRAM变频导致缓存溢出(参考如下代码)

 

 

  •  
  •  
  •  
  •  
  •  
  •  
// 传输前开启性能模式rockchip_set_system_status(SYS_STATUS_PERFORMANCE);// 执行SPI传输spi_read_slt(id, rxbuf, size);// 传输后关闭性能模式rockchip_clear_system_status(SYS_STATUS_PERFORMANCE);

减少传输次数:合并小数据包,降低调度开销

 

 

RK平台SPI开发的核心在于掌握DTS配置规范、模式匹配要点及性能优化技巧。通过本文的步骤拆解,无论是快速搭建基础通信链路,还是深度优化传输性能,都能找到对应的实现方案。建议开发过程中结合具体SOC的速率限制和外设需求,灵活调整配置参数,确保SPI通信稳定可靠。


审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分