STM32 H7 / G4 SPI 数据移位三个字节

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

我有一块带有 STM32H723VG 和 STM32G473RC MCU 的 PCB。两个 MCU 通过 SPI(20 MHz 时钟、短总线)交换数据。 H7为主,G4为从。通信由从机发起,通过(附加)UART 连接发送一些信息,例如两个 MCU 都会检查数据缓冲区的大小。当双方都同意可以通信时,主机开始传输。

数据以固定大小的缓冲区(约 100 字节)的形式传输,帧速率为 5 kHz。 H7 使用低级驱动程序,在 G4 上我使用 HAL 驱动程序。 G4 上的 SPI 处于循环模式,采用双缓冲技术,我使用 G4 上的半传输完成和传输完成中断来在每个新帧上获得中断。

这一切都运行良好并且“长期稳定”(如果您可能认为在我的桌面上进行 30 分钟的测试是“长期”......)。由于这两个 MCU 之间的通信对于我的项目至关重要,因此我有一些算法来检查每个帧的数据是否一致。如果检查失败,流将停止并在 100 毫秒后重新初始化,使用与首次启动时相同的功能。

事情变得很奇怪:设法按预期启动通信且功能齐全的相同功能不会在重新初始化时产生相同的结果。在通信的第二次和所有连续启动时,主设备 (H7) 上的 SPI Rx 缓冲区将移位 3 个字节。当我按下 G4 上的重置按钮时,通信再次启动,没有错误。

出于测试目的,我使两个缓冲区仅包含 0x00,并且在每次传输时,缓冲区的第一个字节都会递增。第一次启动时,我可以清楚地看到 H7 和 G4 上的 Rx 和 TX 缓冲区的第一个字节在计数。重新启动后,我可以看到 H7 上的 Rx 缓冲区中的第 3 个字节向上计数,而 G4 上的 Rx 缓冲区的形状正确。

问题是:什么会导致位移?

在我使用的从属端(G4)

HAL_SPI_Abort(&hspi1);                  // Clear SPI
MX_SPI1_Init();                         // (re-)init SPI

当流中断时关闭 SPI 加号

HAL_SPI_TransmitReceive_DMA(&hspi1, pTx, pRx, bufSz);

之后(重新)启动它。不用说,这是第一次启动时的确切顺序。唯一的区别是:SPI_Abort() 和 SPI1_Init() 对第一次运行没有影响,因为硬件复位后 SPI 处于初始状态。

第二个问题: 谁造成了这个问题? H7还是G4?是G4延迟移出数据还是H7延迟读取数据? 我检查了G4上的SPIx->MADR寄存器,指针指向Tx缓冲区的开头。这似乎是正确的。在 H7 上,LL 驱动程序在每一帧上将地址设置为正确的值,因此也不会有问题。这意味着两侧的内存地址都是正确的,但由于某种原因缓冲区无论如何都会被移动。

到目前为止我唯一能想象的是,G4 上 TX DMA 的清理(使用 SPI_Abort() 和 SPI1_Init())并不像想象的那么干净。我怎样才能检查呢?制作所有寄存器的快照并比较它们?

stm32 spi stm32f4 stm32h7
1个回答
0
投票

我找到了解决方案。

首先,我可以在范围中清楚地看到,MISO 线上的数据晚了三个字节。原因如下:

我的SPI配置为8位数据大小,G4的SPI的FIFO是32位。这意味着当传输停止时,当 DMA(在循环模式下)与 SPI 一起停止时,FIFO 中剩余 3 个字节。停止后,没有时钟可以清空 FIFO。

在我的例子中,这3个字节都是0x00,因为我用0x00填充了Slave上的Tx缓冲区,以匹配Master上的Tx缓冲区的大小。

当 SPI 重新启动时,这 3 个剩余字节将被“首先使用”,这会导致主机的 RX 缓冲区中发生 3 个字节的可重复移位。

这不是错误,而是功能! RM0440 Rev. 7 图 583(第 1748 页)可能有助于理解这一点。

解决方案很丑陋:

__HAL_RCC_SPI1_FORCE_RESET();
__HAL_RCC_SPI1_RELEASE_RESET();
MX_SPI1_Init();

它很难看,因为没有方法通过软件访问 FIFO 并清除 FIFO 级别。在手册 [1] 中,FTLVL 寄存器被描述为 >>这些位由硬件设置和清除。<< and as in the stm32g473xx.h there is not even a symbol #define(d) for these two bits in the SR (Status Register) I did not even try to write them by software.

如果有人知道更复杂的解决方案来清除SPI的TX FIFO,请告诉我,我将不胜感激!

[1] RM0440 Rev. 7,第 1780 页,第 39.9.3 章 SPI 状态寄存器 (SPIx_SR)

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