在嵌入式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通信穩定可靠。
審核編輯 黃宇
-
嵌入式
+關注
關注
5198文章
20442瀏覽量
333961 -
Linux
+關注
關注
88文章
11758瀏覽量
219001
發布評論請先 登錄
RK3562 單板機圖形用戶界面開發完全手冊:Qt Creator 配置與 LVGL 案例詳解(二)
RK3562 單板機圖形用戶界面開發完全手冊:Qt Creator 配置與 LVGL 案例詳解(一)
RK3562 單板機 Linux-RT 系統開發指南:內核配置、實時性優化與案例詳解
RK3562 單板機系統開發完全手冊:U-Boot/Kernel/Rootfs 開發與性能優化
深入解析RK平臺GPIO驅動:從原理到調試,開發者必看指南
RK?平臺升級開發:全場景方案與實踐指南,覆蓋常規系統和ab系統
【北京迅為】iTOP-RK3568開發板鴻蒙OpenHarmony系統南向驅動開發實操-HDF驅動配置UART
RK?平臺?SPI?開發完全指南(驅動?+?配置?+?測試?+?優化)
評論