我正在研究两个Nucleo-H743ZI板之间的SPI通信。 我正在使用ST的HAL和SPI轮询API HAL_SPI_TransmitReceive。
在带宽达到12Mbits / s(SPI内核时钟为200Mhz和预分频器16,CPU始终为400Mhz)之前工作正常,但在高于(较小的预分频器)时失败。
我想了解一下,因为即使使用质量较差的软件进行轮询,似乎也不会达到24或48 Mbit / s。
在预分频器设置为8的情况下,我没有SPI错误(如溢出或其他错误)(我直接在寄存器中检查过),但是数据不正确。看起来更接近数据,我注意到只有一个位移。
更准确地说,我应该收到(以十六进制表示):0x30 0x31 0x32 ... 我收到0x18 0x18 0x99 ...
以二进制形式:
预期为0011 0000 0011 0001 0011 0010 ...
收到0001 1000 0001 1000 1001 1001 ...
如果将接收到的比特流向左移动,我将得到正确的结果。
它向您响起什么吗?可能是由于配置错误导致的吗?
很明显,主机和从机在相位和极性方面具有相同的配置(以及其他所有内容,因为源代码基本相同)。
答案 0 :(得分:2)
检查数据表中的输出时序特性表。
最左列中的二进制数字是GPIO->OSPEEDR
中的值。在V DD = 3.3V(这是Nucleo电路板使用的电压)下,值00
将在最高12 MHz的频率下工作,这正是信号开始崩溃的地方。只要将其调高到最大值,就不会造成伤害。 (好吧,如果一次切换很多引脚,它可能会过载。)
答案 1 :(得分:0)
48mbits表示每秒6MB。即使您的uC为400MHz,每个字节也只有50个时钟。这还远远不够。对于更高的速度,尤其是使用HAL库时,绝对不可能只进行DMA轮询。
以电缆方式传输48MHz也不容易。