[英]SPI with DMA transfer between two STM32 chips results in reordered data in struct
將 HAL 與兩個芯片一起使用: STM32F373RBT6
和STM32F042K6T6
。 兩者都設置了帶DMA
的SPI
。
我在每個處理器的代碼中使用以下結構:
typedef __packed struct {
u16 command;
u16 status;
s32 motorPos;
} motorParams;
在調試(ST-LINK)中,我可以看到第一個數據包正確進入,然后結構中的字節更改順序。 所有的數據都在那里,只是順序錯誤。
例子:
,
該命令是一個用於電機啟用的命令,然后是下一個數據包:
,
啟用顯示在 position 字段中。 最后,
,
position 現在分為命令和狀態字段。
我檢查了示波器上SPI總線上的output,查看芯片select和數據信號。 所有數據都在那里,並以正確的順序進入 M0 芯片。
在M0
中接收,SPI 有一個直接指向變量的指針來接收結構。
我可以做任何中間檢查來查看為什么數據在結構中改變位置嗎? 謝謝你。
我的建議是你應該真正改變你做序列化的方式,我猜你假設因為你正在打包結構並用一個 u8 指針指向它,結果將被很好地打包成 8 個字節。 此代碼不可移植,並且將依賴於字節序。 只有原始類型應直接序列化為字節(即 u8、s8、u16 等)
您應該首先定義通信協議的字節序,然后對於該結構,您應該創建一個 8 字節緩沖區(如果您想一次發送多個包,則更大),然后將每個結構字段作為所需字節序的字節復制到該緩沖區. 該緩沖區是通過 DMA 發送的緩沖區。
正如 Gordon Madden 所說,嘗試閱讀 hspix.Instance->DR 一次(8 位 spi)或兩次(16 位 spi)次。 在與這個愚蠢的 DMA 錯誤斗爭了 3 天后,我找到了這個答案,ST 應該關心
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.