SPI Polling 示例
源码路径:example/hal/spi/polling
支持平台
sf32lb52-lcd_n16r8sf32lb58-lcd_n16r64n4sf32lb57-lcdsf32lb56-lcd
概述
该例程演示 SPI HAL 在阻塞轮询模式下的自发自收(loopback)例程
核心行为:
SPI 主机模式、2Lines、8bit、默认 MODE0。
周期调用
HAL_SPI_TransmitReceive()。每轮发送 16 字节递增 pattern(
seed + i),并统计收发不一致个数mismatch。
编译和下载
以 sf32lb52-lcd_n16r8 为例,在 project 目录执行:
scons --board=sf32lb52-lcd_n16r8 -j8
或 sf32lb58-lcd_n16r64n4:
scons --board=sf32lb58-lcd_n16r64n4 -j8
编译后进入对应 build_* 目录运行下载脚本。
硬件连接
单板回环(推荐)
将 SPI1 或者 SPI2 MOSI 与 MISO 短接:
开发板 |
MOSI |
MISO |
CLK |
CS |
|---|---|---|---|---|
sf32lb52-lcd |
PA24 |
PA25 |
PA28 |
PA29 |
sf32lb58-lcd |
PA21 |
PA20 |
PA28 |
PA29 |
sf32lb57-lcd |
PA37 |
PA38 |
PA39 |
PA40 |
sf32lb56-lcd |
PA64 |
PA69 |
PA73 |
PA71 |
说明:
此例程用
HAL_SPI_TransmitReceive一次完成收发,不再手动TAKE/RELEASE CS。没有回环短接时,
mismatch往往较大或数据无规律。
预期日志
启动日志示例:
Start spi polling loopback demo!
tip: short SPI1 MOSI(DIO/DO) to MISO(DI) for loopback verification.
运行日志示例:
round=0 ret=0 mismatch=0 tx: 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f rx: 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
round=1 ret=0 mismatch=0 tx: 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 rx: 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10
字段说明:
ret:HAL 返回值,0表示HAL_OK。mismatch:本轮 16 字节中 TX 与 RX 不一致个数。round:轮询计数。
关键配置流程
配置 SPI1 引脚复用:
DIO/DO、DI、CLK、CS。使能 SPI1 时钟:
HAL_RCC_EnableModule(RCC_MOD_SPI1)。初始化 SPI 参数:
Direction = SPI_DIRECTION_2LINESMode = SPI_MODE_MASTERDataSize = SPI_DATASIZE_8BITCLKPhase/CLKPolarity由SPI_MODE选择
进入循环执行
HAL_SPI_TransmitReceive()并打印比较结果。
异常诊断
1) ret != 0
检查 SPI1 引脚复用是否正确。
检查 SPI 时钟与电源初始化是否完成。
2) mismatch 长期不为 0
优先检查 MOSI↔MISO 短接是否可靠。
检查线序是否接反、接触不良。
适当降低 SPI 时钟再观察(便于排除信号质量问题)。
3) 无日志刷新
确认程序确实运行到
spi_test()。确认串口打印配置正常。
参考文档
EH-SF32LB52X_Pin_config_V1.3.0_20231110.xlsxDS0052-SF32LB52x-芯片技术规格书 V0p3.pdf
更新记录
版本 |
日期 |
说明 |
|---|---|---|
0.1.0 |
03/2026 |
改为 polling loopback 自发自收示例 |