一、硬件自发自收
1、接线方式(关键)
STM32 短线
PA7 MOSI ──┐
├── 直接短接
PA6 MISO ──┘
PA5 SCK
PA4 NSS(软件管理)
注意:
- 不要接外部 SPI 设备
- 确保 GPIO 没有复用冲突
- 上拉/下拉均可,不影响
二、CubeMX 配置(SPI1 示例)
| 参数 | 设置 |
|---|---|
| Mode | Full-Duplex Master |
| Hardware NSS | Disable |
| Frame Format | Motorola |
| Data Size | 8 bits |
| CPOL | Low |
| CPHA | 1 Edge |
| Prescaler | 8 / 16 |
| First Bit | MSB |
三、SPI 自发自收代码(HAL )
1、SPI 句柄
c
extern SPI_HandleTypeDef hspi1;
2、自发自收测试函数
c
uint8_t SPI_Loopback_Test(void)
{
uint8_t tx_data = 0x55;
uint8_t rx_data = 0x00;
HAL_SPI_TransmitReceive(
&hspi1,
&tx_data,
&rx_data,
1,
HAL_MAX_DELAY
);
if (rx_data == tx_data)
return 1; // 成功
else
return 0; // 失败
}
3、主函数测试
c
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_SPI1_Init();
while (1)
{
if (SPI_Loopback_Test())
{
// 成功:点亮 LED
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
}
else
{
// 失败:熄灭 LED
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
}
HAL_Delay(500);
}
}
四、使用 SPI 内部 Loopback(仅部分 STM32)
支持型号
- STM32F1 / F4 / L4 / G4 / H7(部分)
开启方式
c
__HAL_SPI_ENABLE(&hspi1);
hspi1.Instance->CR1 |= SPI_CR1_LOOPBACK;
说明:
- 不需要短接 MISO/MOSI
- 仅用于 调试
- 某些系列 没有该位(如 F0)
五、常见问题排查
| 现象 | 原因 |
|---|---|
| 收不到数据 | MISO/MOSI 没短接 |
| 数据为 0xFF | 没接片选 / 时钟异常 |
| 数据为 0x00 | 引脚复用冲突 |
| 偶尔错误 | SPI 速率过高 |
| 一直失败 | 外部 SPI 设备干扰 |
排查口诀:
短接 MISO--MOSI → 降速 → 不用 NSS → 不用 DMA
参考代码 STM32 SPI自发自收 www.youwenfan.com/contentcst/182293.html
六、进阶用法
DMA 自发自收
c
HAL_SPI_TransmitReceive_DMA(&hspi1, tx, rx, len);
16 位 SPI
c
hspi1.Init.DataSize = SPI_DATASIZE_16BIT;
SPI + 示波器验证
- SCK:应有连续时钟
- MOSI:应有 0x55 波形
- MISO:应与 MOSI 完全一致