c - 在两个 STM32 芯片之间使用 DMA 传输的 SPI 导致结构中的数据重新排序
问题描述
将 HAL 与两个芯片一起使用:STM32F373RBT6
和STM32F042K6T6
. SPI
withDMA
设置在两者上。
我在每个处理器的代码中使用以下结构:
typedef __packed struct {
u16 command;
u16 status;
s32 motorPos;
} motorParams;
在调试(ST-LINK)中,我可以看到第一个数据包正确进入,然后结构中的字节更改顺序。所有的数据都在那里,只是顺序错误。
例子:
,
该命令是一个用于电机启用的命令,然后是下一个数据包:
,
启用显示在位置字段中。最后,
,
该位置现在在命令和状态字段之间划分。
我检查了示波器上 SPI 总线上的输出,查看了芯片选择和数据信号。所有数据都在那里,并以正确的顺序进入 M0 芯片。
在接收中M0
,SPI 有一个指针直接指向一个变量来接收结构。
我可以做任何中间检查来查看为什么数据在结构中改变位置吗?谢谢你。
解决方案
我的建议是你应该真正改变你做序列化的方式,我猜你假设因为你正在打包结构并用一个 u8 指针指向它,结果将被很好地打包成 8 个字节。此代码不可移植,并且将依赖于字节序。只有原始类型应直接序列化为字节(即 u8、s8、u16 等)
您应该首先定义通信协议的字节序,然后对于该结构,您应该创建一个 8 字节的缓冲区(如果您想一次发送多个包,则更大),然后将每个结构字段作为所需字节序的字节复制到该缓冲区. 该缓冲区是通过 DMA 发送的缓冲区。
推荐阅读
- sql-server - 需要帮助在 Sql 中更新主管
- c# - mvc 中的功能权限
- postgresql - Postgresql 数据库和表大小
- sql - 计算一列中不同条目之间的距离
- python - 有没有办法只向量化单词,即不是来自python中的语料库或单词包?
- powershell - 用于删除弱密码的 Powershell 脚本
- jenkins - Liveness Probe 被计时
- xamarin.ios - 滑动时如何在tableview中自定义UIContextualAction
- c# - 如何在 C# 中将当前日期和时间转换为“20181029093320-0400”这种格式?
- oracle - 我不知道如何创建日志触发器