STM32H7上SPI通信的一位移位

One bit shift in SPI communication on STM32H7

我正在研究两个 Nucleo-H743ZI 板之间的 SPI 通信。 我用的是ST的HAL,SPI polling API HAL_SPI_TransmitReceive.

带宽为 12Mbits/s(SPI 内核时钟为 200Mhz,预分频器为 16,CPU 始终为 400Mhz)之前工作正常,但高于(较小的预分频器)时失败。

我想了解,因为 24 或 48 Mbits/s 即使在使用质量较差的软件进行投票时也显得不多。

预分频器设置为 8 时,我没有出现溢出或其他 SPI 错误(我直接在寄存器中检查),但是数据不正确。仔细观察数据,我注意到只有一位移位。

更准确地说我应该收到(十六进制):0x30 0x31 0x32 ... 我收到 0x18 0x18 0x99...

二进制:

如果我将接收到的比特流向左移动,我会得到完全正确的结果。

它对你有什么影响吗?可能是因为配置不正确?

显然主从在相位和极性方面具有相同的配置(以及其他所有内容,因为源代码大部分相同)。

检查数据表中的输出时序特性 table。

最左边一列的二进制数是GPIO->OSPEEDR中的值。在 VDD=3.3V(这就是 Nucleo 板使用的电压)下,值 00 最高可达 12 MHz,这正是您的信号开始崩溃的地方。只需将它调到最大值,它不会造成伤害。 (好吧,如果你一次切换很多引脚,它可能会过载。)

48mbits 表示每秒 6MB。即使您的 uC 是 400MHz,您每个字节也只有 50 个时钟。这还远远不够。对于更高的速度,只有 DMA 绝对是可能的,而不是轮询,尤其是使用 HAL 库。

48MHz cablewise 也不容易。