0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

jf_44130326 来源:Linux1024 作者:Linux1024 2026-01-30 22:35 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

wKgZO2l8wsGAc-2qAAA6BBWzM7k065.png

一、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相关支持,配置路径如下:

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芯片作为主机)

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 = <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函数(设备匹配与初始化)和读写接口,参考代码:

#includestaticintspi_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

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通信稳定可靠。


审核编辑 黄宇

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

    关注

    5212

    文章

    20763

    浏览量

    338734
  • Linux
    +关注

    关注

    88

    文章

    11854

    浏览量

    219819
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    RK3562 单板机多媒体开发完全手册:视频输入输出与 GStreamer 案例详解(二)

    800x480@60fps 视频解码与 LVDS 显示。文档详解 GStreamer 元件配置、管道链接及测试步骤,明确关键代码逻辑。创龙科技通过硬件能力解析与实操案例,帮助开发者高效掌握视频解码技术,适用于智能终端、工业可视
    的头像 发表于 03-17 09:49 241次阅读
    <b class='flag-5'>RK</b>3562 单板机多媒体<b class='flag-5'>开发完全</b>手册:视频输入输出与 GStreamer 案例详解(二)

    瑞芯微RK3506 Flexbus技术开发指南,从原理、内核配置测试的完整攻略

    基于触觉智能的RK3506核心板/开发板,介绍FlexBus总线的技术架构、设备树配置驱动实现与测试方法,为嵌入式
    的头像 发表于 03-14 07:24 782次阅读
    瑞芯微<b class='flag-5'>RK</b>3506 Flexbus技术<b class='flag-5'>开发指南</b>,从原理、内核<b class='flag-5'>配置</b>到<b class='flag-5'>测试</b>的完整攻略

    RK3562 单板机图形用户界面开发完全手册:Qt Creator 配置与 LVGL 案例详解(二)

    本节为创龙科技RK3562 单板机 Qt 开发指南,核心包含开发环境配置、工程编译、网络调试及实战案例。详细说明 Qt Creator 交叉编译工具链、Debuggers、Kits
    的头像 发表于 02-27 10:42 6975次阅读
    <b class='flag-5'>RK</b>3562 单板机图形用户界面<b class='flag-5'>开发完全</b>手册:Qt Creator <b class='flag-5'>配置</b>与 LVGL 案例详解(二)

    RK3562 单板机图形用户界面开发完全手册:Qt Creator 配置与 LVGL 案例详解(一)

    本节为创龙科技RK3562 单板机 Qt 开发指南,核心包含开发环境配置、工程编译、网络调试及实战案例。详细说明 Qt Creator 交叉编译工具链、Debuggers、Kits
    的头像 发表于 02-26 11:41 2187次阅读
    <b class='flag-5'>RK</b>3562 单板机图形用户界面<b class='flag-5'>开发完全</b>手册:Qt Creator <b class='flag-5'>配置</b>与 LVGL 案例详解(一)

    RK3562 单板机 Linux-RT 系统开发指南:内核配置、实时性优化与案例详解

    本文为创龙科技RK3562 单板机 Linux-RT 开发指南,核心聚焦实时内核的性能测试开发应用。内容包括 Linux 与 Linux-RT 实时性对比、CPU 负载
    的头像 发表于 02-10 11:49 1.9w次阅读
    <b class='flag-5'>RK</b>3562 单板机 Linux-RT 系统<b class='flag-5'>开发指南</b>:内核<b class='flag-5'>配置</b>、实时性<b class='flag-5'>优化</b>与案例详解

    RK平台新声卡添加与驱动调试指南

    在瑞芯微(RK平台的嵌入式系统开发中,音频功能的实现核心依赖于 Sound Card(声卡)的正确配置驱动调试。
    的头像 发表于 02-09 16:42 1136次阅读
    <b class='flag-5'>RK</b><b class='flag-5'>平台</b>新声卡添加与<b class='flag-5'>驱动</b>调试<b class='flag-5'>指南</b>

    RK3562 单板机系统开发完全手册:U-Boot/Kernel/Rootfs 开发与性能优化

    本文为创龙科技RK3562 单板机 Linux 系统开发指南,核心包含 SDK 配置、内核与文件系统开发、分区配置及 CPU/GPU/NPU
    的头像 发表于 02-05 17:20 637次阅读
    <b class='flag-5'>RK</b>3562 单板机系统<b class='flag-5'>开发完全</b>手册:U-Boot/Kernel/Rootfs <b class='flag-5'>开发</b>与性能<b class='flag-5'>优化</b>

    RK平台UART开发!从驱动配置测试全流程

    完善的 UART 开发支持,本文将结合官方开发指南,从功能特点、驱动配置测试验证三个维度,带大家快速掌握
    的头像 发表于 02-04 17:44 2259次阅读
    <b class='flag-5'>RK</b><b class='flag-5'>平台</b>UART<b class='flag-5'>开发</b>!从<b class='flag-5'>驱动</b><b class='flag-5'>配置</b>到<b class='flag-5'>测试</b>全流程

    深入解析RK平台GPIO驱动:从原理到调试,开发者必看指南

    平台上,GPIO 驱动的实现直接影响着硬件交互的稳定性与效率。本文将带你深入剖析 RK 平台 GPIO 驱动的核心逻辑、使用方法,以及对调
    的头像 发表于 02-03 15:53 1398次阅读
    深入解析<b class='flag-5'>RK</b><b class='flag-5'>平台</b>GPIO<b class='flag-5'>驱动</b>:从原理到调试,<b class='flag-5'>开发</b>者必看<b class='flag-5'>指南</b>

    RK 平台升级开发:全场景方案与实践指南,覆盖常规系统和ab系统

                在嵌入式 Linux 开发领域,瑞芯微( Rockchip )平台凭借其稳定的性能和丰富的生态支持,被广泛应用于各类智能设备中。而设备的升级功能作为保障产品生命周期、优化
    的头像 发表于 01-13 15:35 1661次阅读
    <b class='flag-5'>RK</b> <b class='flag-5'>平台</b>升级<b class='flag-5'>开发</b>:全场景方案与实践<b class='flag-5'>指南</b>,覆盖常规系统和ab系统

    释放多屏潜能:迅为RK3588开发板Android多屏同显开发完全指南

    释放多屏潜能:迅为RK3588开发板Android多屏同显开发完全指南
    的头像 发表于 12-16 16:11 1209次阅读
    释放多屏潜能:迅为<b class='flag-5'>RK</b>3588<b class='flag-5'>开发</b>板Android多屏同显<b class='flag-5'>开发完全</b><b class='flag-5'>指南</b>

    避坑指南RK3568开发板选型,这5点没看清千万别下手!(附迅为驱动开发指南资源)

    避坑指南RK3568开发板选型,这5点没看清千万别下手!(附迅为驱动开发指南资源)
    的头像 发表于 10-30 15:49 1202次阅读
    避坑<b class='flag-5'>指南</b>!<b class='flag-5'>RK</b>3568<b class='flag-5'>开发</b>板选型,这5点没看清千万别下手!(附迅为<b class='flag-5'>驱动</b><b class='flag-5'>开发指南</b>资源)

    迅为RK3568 重制版RK3568驱动指南全面升级

    迅为RK3568 重制版RK3568驱动指南全面升级
    的头像 发表于 07-28 15:25 3933次阅读
    迅为<b class='flag-5'>RK</b>3568 重制版<b class='flag-5'>RK</b>3568<b class='flag-5'>驱动</b><b class='flag-5'>指南</b>全面升级

    迅为RK3568开发驱动指南GPIO子系统GPIO子系统API函数的引入

    迅为RK3568开发驱动指南GPIO子系统GPIO子系统API函数的引入
    的头像 发表于 05-29 14:05 1284次阅读
    迅为<b class='flag-5'>RK</b>3568<b class='flag-5'>开发</b>板<b class='flag-5'>驱动</b><b class='flag-5'>指南</b>GPIO子系统GPIO子系统API函数的引入

    迅为RK3568开发驱动指南GPIO子系统三级节点操作函数实验

    迅为RK3568开发驱动指南GPIO子系统三级节点操作函数实验
    的头像 发表于 05-26 15:39 1744次阅读
    迅为<b class='flag-5'>RK</b>3568<b class='flag-5'>开发</b>板<b class='flag-5'>驱动</b><b class='flag-5'>指南</b>GPIO子系统三级节点操作函数实验