SPI DMA循环收发示例
源码路径: example/hal/spi_dma
支持的平台
例程可运行在以下开发板:
sf32lb52-lcd_n16r8
sf32lb58-lcd_n16r64n4
概述
该例程演示 SPI HAL 在 DMA环形模式(Circular) 下的持续收发:
SPI1 主模式,
2Lines,8bit,默认SPI MODE0TX DMA + RX DMA 同时工作,持续触发时钟并循环搬运数据
通过 DMA 半满/全满回调统计运行状态
通过错误回调统计异常并打印错误码
本示例重点是验证“DMA循环链路是否稳定”,不是阻塞方式读 NOR ID。
例程的使用
编译和烧录
以 sf32lb52-lcd_n16r8 开发板为例
切换到例程project目录,运行scons命令执行编译对应命令:
scons --board=sf32lb52-lcd_n16r8 -j8
运行`build_sf32lb52-lcd_n16r8_hcpu\uart_download.bat`,按提示选择端口即可进行下载:
> build_sf32lb52-lcd_n16r8_hcpu\uart_download.bat
Uart Download
please input the serial port num:5
关于编译、下载的详细步骤,请参考上手指南的相关介绍。
在 project/proj.conf 中打开 SPI1 DMA 相关开关:
CONFIG_BSP_SPI1_TX_USING_DMA=y
CONFIG_BSP_SPI1_RX_USING_DMA=y
硬件连接
仅短接
MOSI(DIO/DO)与MISO(DI)CLK、CS保持正常输出,不需要再接外部从设备
也可连接真实从设备(另一块板 SPI Slave),此时按标准四线连接并共地。
开发板 |
功能引脚 |
信号 |
物理引脚(CONN2) |
|---|---|---|---|
sf32lb52-lcd |
PA_24 |
SPI1_MOSI(DIO) |
19 |
PA_25 |
SPI1_MISO(DI) |
21 |
|
PA_28 |
SPI1_CLK |
23 |
|
PA_29 |
SPI1_CS |
24 |
|
sf32lb58-lcd |
PA_21 |
SPI1_MOSI(DO) |
8 |
PA_20 |
SPI1_MISO(DI) |
10 |
|
PA_28 |
SPI1_CLK |
5 |
|
PA_29 |
SPI1_CS |
3 |
sf32lb52-lcd_n16r8硬件原理图参考如下图:

例程输出结果展示:
启动日志
Start spi dma circular demo!
spi dma running, tx/rx circular started.
tip: short SPI1 MOSI(DIO/DO) to MISO(DI) for loopback verification.
运行日志(示例)
half=1234, full=1233, err=0
rx[0..7]: 00 01 02 03 04 05 06 07, rx[mid..mid+7]: 80 81 82 83 84 85 86 87
half=2470, full=2469, err=0
rx[0..7]: 00 01 02 03 04 05 06 07, rx[mid..mid+7]: 80 81 82 83 84 85 86 87
说明:
half/full会持续增加,表示 DMA 在环形工作err正常应保持0回环短接时,
rx常见为 0x00~0xFF 的循环序列(可能有相位偏移)
功能流程
配置 SPI1 pinmux 与时钟
初始化 SPI1(Master, 2Lines, 8bit)
初始化 RX/TX DMA,模式均为
DMA_CIRCULAR调用
HAL_SPI_TransmitReceive_DMA()启动持续收发在 DMA 半满/全满回调里统计状态
主循环打印状态并抽样显示 RX 数据
异常诊断
half/full长时间不增长检查 SPI1 DMA 开关是否在
proj.conf打开检查 DMA IRQ 是否被正确使能
err持续增加打印
spi_err错误码定位(日志已输出)检查 DMA request/channel 与板级配置是否匹配
回环场景下数据无规律
检查 MOSI 与 MISO 是否确实短接
检查引脚电平和连接可靠性
参考文档
EH-SF32LB52X_Pin_config_V1.3.0_20231110.xlsx
DS0052-SF32LB52x-芯片技术规格书 V0p3.pdf
PY25Q128HA_datasheet_V1.1.pdf
更新记录
版本 |
日期 |
发布说明 |
|---|---|---|
0.1.0 |
03/2026 |
初始版本 |