SPI с передачей DMA между двумя чипами STM32 приводит к переупорядочению данных в структуре - PullRequest
1 голос
/ 16 апреля 2020

Использование HAL с двумя чипами: STM32F373RBT6 и STM32F042K6T6. SPI с DMA установлено на обоих.

Я использую следующую структуру в коде для каждого процессора:

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

} motorParams;

В отладке (ST-LINK) я могу Посмотрите, как первый пакет поступил правильно, а затем байты меняют порядок в структуре. Все данные есть, они просто в неправильном порядке.

Пример:

first packet received,

команда одна для включения двигателя, а затем для следующей пакет:

second packet received,

- включение отображается в поле позиции. И наконец,

final packet received,

позиция теперь разделена между полями команд и состояний.

Я проверил вывод на шине SPI на оскопе , глядя на чип выбора и данных сигналов. Все данные там и в правильном порядке поступают в чип M0.

Получая в M0, SPI имеет указатель непосредственно на переменную для получения структуры.

Is Есть ли какие-то промежуточные проверки, которые я могу сделать, чтобы понять, почему данные меняются в структуре? Спасибо.

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Мой совет - вам действительно нужно изменить способ сериализации, я полагаю, что вы предполагаете, что, поскольку вы упаковываете структуру и указываете ее указателем u8, результат будет хорошо упакован в 8 байт. Этот код не является переносимым и будет зависеть от порядка байтов. Только примитивные типы должны быть сериализованы непосредственно как байты (то есть u8, s8, u16 и c et c)

Сначала вы должны определить порядковый номер вашего протокола связи, затем для этой структуры вы должны создать 8-байтовый буфер (или больше, если вы хотите отправить несколько пакетов одновременно), затем скопируйте каждое поле структуры в этот буфер в виде байтов в нужной последовательности. Этот буфер является тем, который отправляется через DMA.

0 голосов
/ 25 апреля 2020

Поскольку данные не читались в правильном порядке, я подумал, мешают ли оставшиеся данные. Я очищаю FIFO, читая DR (регистр данных) перед приемом / передачей.

enter image description here

Это все решило. У меня не было никаких проблем с тех пор. Я также попробую решение с байтовым буфером из ECO, перечисленного выше, без чтения DR, чтобы увидеть, является ли это решением.

...