STM32H7 SPI从机DMA发送MISO输出0xFF的排查与解决

STM32H7 SPI从机DMA发送MISO输出0xFF的排查与解决 Nucleo-H753ZI 上SPI 从机打开 DMA 准备发数据结果主机那边一读回来四个字节全是 0xFF 0xFF 0xFF 0xFF。这不是个例STM32 社区里隔三差五就有人贴出这个问题。别急着怀疑线接错了先把 MISO 为什么会一直是高电平这件事想明白再往下查。先说结论SPI 从机的 MISO 在空闲状态下就是高电平主机读到 0xFF 意味着“这条线上没有有效数据”。连续 0xFF 说明从机已经被选中、SCK 时钟也进来了但发送路径上根本没数据可移出去。问题基本锁定在三个方向DMA 配置没有真正生效、H7 平台特有的传输长度设置没做、或者发送缓冲区放到了 DMA 够不到的内存区域。这篇文章把原理、配置和排错流程完整讲一遍照着做基本一次能通。1. 先搞清楚 0xFF 是怎么来的1.1 从机 MISO 的空闲状态SPI 是同步全双工协议主机提供 SCK 时钟从机在时钟边沿把数据一位一位移出到 MISO。站在主机侧的视角MISO 上有两种情况都会表现为高电平第一种是 NSS 为高、从机没有被选中。此时从机的 MISO 引脚是高阻态主机侧如果没有下拉电阻线上被上拉或者空载读数自然就是 1。第二种是从机被选中了SCK 也在跑但 TX 移位寄存器里没有有效数据。此时 H7 的 SPI 外设会保持 MISO 的默认输出电平主机读到的还是 0xFF。所以看到 0xFF不要去怀疑“数据被干扰成 FF 了”它更可能是“从机压根没发数据”。1.2 TX 路径上的数据是怎么流动的从机发送不是主动把数据推出去而是配合主机的时钟往外供数据。主机来一个字节的时钟从机把 TX FIFO 的头一个字节搬进移位寄存器再从 MISO 一位一位移出去。这里有个关键点SPI 外设只有在 TX FIFO 里有数据时才会启动内部发送逻辑。如果你没开 DMA、没开 TXE 中断、也没手动往发送寄存器写数据TX FIFO 就是空的。主机来的每个字节时钟从机都只能输出空数据。H7 的 SPI 在这种情况下会置起 UDRUnderrun欠载标志MISO 输出默认电平也就是 0xFF。1.3 先把 DMA 摘掉用轮询做定位遇到这个问题第一步不是去调 DMA 参数而是把 DMA 整个摘掉用最笨的阻塞式发送验证链路。uint8_t tx_buf[4] {0xA5, 0x5A, 0x01