STM32H7上SPI通信的一位移位

问题描述 投票:0回答:3

我正在研究两个 Nucleo-H743ZI 板之间的 SPI 通信。 我正在使用 ST 的 HAL 和 SPI 轮询 API HAL_SPI_TransmitReceive。

在带宽达到 12Mbits/s 之前都可以正常工作(SPI 内核时钟为 200Mhz,预分频器为 16,CPU 始终为 400Mhz),但在带宽以上时会失败(预分频器较小)。

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

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

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

二进制:

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

  • 已收到 0001 1000 0001 1000 1001 1001...

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

这对你有什么启发吗?难道是配置不好造成的?

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

stm32 spi
3个回答
2
投票

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

最左边一列中的二进制数是

GPIO->OSPEEDR
中的值。当 VDD=3.3V(Nucleo 板使用的电压)时,值
00
将工作到 12 MHz,这正是您的信号开始崩溃的地方。把它调到最大值就行了,没什么坏处的。 (好吧,如果你一次切换很多引脚,它可能会过载。)


0
投票

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

48MHz 有线也不容易。


0
投票

在选择从机之前尝试启用 SPI 单元

© www.soinside.com 2019 - 2024. All rights reserved.