STM32H7上SPI通信的一位偏移



我正在研究两个Nucleo-H743ZI板之间的SPI通信。 我使用的是意法半导体的HAL和SPI轮询API HAL_SPI_TransmitReceive。

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

我想了解,因为即使在使用质量差的软件进行轮询时,24 或 48 Mbits/s 似乎也不多。

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

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

在二进制中:

预计 0011 0000 0011
  • 0001 0011 0010...

  • 收到 0001
  • 1000 0001 1000 1001 1001

    ...

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

它对你有什么影响吗?可能是由于配置错误吗?

显然,主站和从站具有相同的相位和极性配置(以及其他所有配置,因为源代码大多相同)。

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

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

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

48MHz电缆也不容易。

最新更新