我正在研究两个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 00110001 0011 0010...
收到 00011000 0001 1000 1001 1001
...
如果我将接收到的比特流向左移动,我会得到正确的结果。
它对你有什么影响吗?可能是由于配置错误吗?
显然,主站和从站具有相同的相位和极性配置(以及其他所有配置,因为源代码大多相同)。
查看数据表中的输出时序特性表。
最左边列中的二进制数是GPIO->OSPEEDR
中的值。在VDD=3.3V(这是Nucleo板使用的)时,值00
将工作到12 MHz,这正是您的信号开始崩溃的地方。只需将其调高到最大值,就不会受到伤害。(好吧,如果您一次切换很多引脚,它可能会过载。
48mbits意味着每秒6MB。即使您的uC是400MHz,您每字节也只有50个时钟。这远远不够。对于更高的速度,只有DMA是可能的,绝对不是轮询,特别是使用HAL库。
48MHz电缆也不容易。