RK 平台 SPI 开发完全指南(驱动 + 配置 + 测试 + 优化)
- 科技创新
- 2026-02-01
- 8527
在嵌入式Linux开发中,SPI(串行外设接口)凭借高速同步通信特性,广泛应用于传感器、存储芯片、显示模块等外设交互场景。瑞芯微(Rockchip)作为主流嵌入式芯片厂商,其Linux平台SPI驱动已形成完善的开发体系,支持Master/Slave双模式、多速率适配及灵活配置。本文基于Rockchip官方开发指南,从功能特性、驱动配置、测试验证到优化方案,全方位拆解RK平台SPI开发流程。
一、RK平台SPI核心特性速览
1.基础支持能力
•协议兼容:默认采用摩托罗拉SPI协议,支持4种传输模式(CPOL/CPHA组合配置)
•数据宽度:支持8位/16位传输,16位模式可提升DMA传输效率
•片选扩展:每个SPI控制器支持1-2个硬件片选,可通过cs-gpios扩展更多片选信号
•内核适配:兼容Linux4.4、Linux4.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相关支持,配置路径如下:
DeviceDrivers --->[*] 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芯片作为主机)
(1)DTS节点配置示例(以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获取。
(2)DTS节点配置示例(以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>; // 从机仅支持片选0spi-cpha;spi-cpol;spi-lsb-first;max-frequency = <33000000>; // 遵循对应SOC的Slave速率限制};};
(3)从机模式关键须知
•传输顺序:Slave需先启动读写操作,Master再发起传输(避免数据丢失)
•DMA建议:Slave模式默认启用DMA,不建议关闭(大长度传输需依赖DMA避免缓存溢出)
•性能模式:Master速率>5MHz(8位)/10MHz(16位)时,需开启performance模式
3. cs-gpios片选扩展(Linux4.19+)
当硬件片选不足时,可通过GPIO模拟片选,配置步骤如下:
// 1. 定义GPIO引脚功能&pinctrl {spi1 {spi1_cs2n: spi1-cs2n {rockchip,pins = <0RK_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函数(设备匹配与初始化)和读写接口,参考代码:
staticintspi_test_probe(structspi_device *spi){intret;if(!spi)return-ENOMEM;spi->bits_per_word =8; // 设置数据宽度ret =spi_setup(spi); // 初始化SPI配置if(ret < 0) {dev_err(&spi->dev,"SPI配置失败n");returnret;}return0;}// 设备树匹配表staticconststructof_device_idspi_test_dt_match[] = {{.compatible ="rockchip,spi_test_bus0_cs0"},{.compatible ="rockchip,spi_test_bus1_cs0"},{},};MODULE_DEVICE_TABLE(of, spi_test_dt_match);// SPI驱动结构体staticstructspi_driverspi_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字节echowrite010255> /dev/spi_misc_test# 读测试:从ID=0的设备读取10次,每次255字节echoread010255> /dev/spi_misc_test# 速率设置:将ID=0的设备速率设为1MHzechosetspeed01000000> /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
(3)Slave模式专项测试
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_misc(1024字节×64次,开启校验)
五、常见问题与优化方案
1.高频问题排查
(1)SPI无信号输出
•检查驱动加载状态: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)
•模式一致性:Master与Slave的CPOL/CPHA配置必须一致
2.性能优化方向
(1)降低CPU占用率
•开启Runtime PM:dts添加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通信稳定可靠。










