首页 > 解决方案 > 在两个 STM32 芯片之间使用 DMA 传输的 SPI 导致结构中的数据重新排序

问题描述

将 HAL 与两个芯片一起使用:STM32F373RBT6STM32F042K6T6. SPIwithDMA设置在两者上。

我在每个处理器的代码中使用以下结构:

typedef __packed struct {
    u16 command;
    u16 status;
    s32 motorPos;

} motorParams;

在调试(ST-LINK)中,我可以看到第一个数据包正确进入,然后结构中的字节更改顺序。所有的数据都在那里,只是顺序错误。

例子:

收到的第一个数据包,

该命令是一个用于电机启用的命令,然后是下一个数据包:

收到第二个数据包,

启用显示在位置字段中。最后,

收到的最终数据包,

该位置现在在命令和状态字段之间划分。

我检查了示波器上 SPI 总线上的输出,查看了芯片选择和数据信号。所有数据都在那里,并以正确的顺序进入 M0 芯片。

在接收中M0,SPI 有一个指针直接指向一个变量来接收结构。

我可以做任何中间检查来查看为什么数据在结构中改变位置吗?谢谢你。

标签: cstructstm32spidma

解决方案


我的建议是你应该真正改变你做序列化的方式,我猜你假设因为你正在打包结构并用一个 u8 指针指向它,结果将被很好地打包成 8 个字节。此代码不可移植,并且将依赖于字节序。只有原始类型应直接序列化为字节(即 u8、s8、u16 等)

您应该首先定义通信协议的字节序,然后对于该结构,您应该创建一个 8 字节的缓冲区(如果您想一次发送多个包,则更大),然后将每个结构字段作为所需字节序的字节复制到该缓冲区. 该缓冲区是通过 DMA 发送的缓冲区。


推荐阅读