簡體   English   中英

在兩個 STM32 芯片之間使用 DMA 傳輸的 SPI 導致結構中的數據重新排序

[英]SPI with DMA transfer between two STM32 chips results in reordered data in struct

將 HAL 與兩個芯片一起使用: STM32F373RBT6STM32F042K6T6 兩者都設置了帶DMASPI

我在每個處理器的代碼中使用以下結構:

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 發送的緩沖區。

由於沒有以正確的順序讀取數據,我想知道剩余數據是否有干擾。 我通過在接收/發送之前讀取 DR(數據寄存器)來清除 FIFO。

在此處輸入圖像描述

那確實解決了。 從那以后我沒有任何問題。 我也將嘗試上面列出的 ECO 的字節緩沖解決方案,無需讀取 DR,看看這是否是一個解決方案。

正如 Gordon Madden 所說,嘗試閱讀 hspix.Instance->DR 一次(8 位 spi)或兩次(16 位 spi)次。 在與這個愚蠢的 DMA 錯誤斗爭了 3 天后,我找到了這個答案,ST 應該關心

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM