Сдвиг бита в связи SPI на STM32H7 - PullRequest
1 голос
/ 18 июня 2019

Я работаю над SPI-связью между двумя платами Nucleo-H743ZI.Я использую ST HAL и API опроса SPI HAL_SPI_TransmitReceive.

Работает нормально до полосы пропускания 12 Мбит / с (тактовая частота ядра SPI 200 МГц и прескалер 16, ЦП всегда на 400 МГц), но не работает выше(меньший прескалер).

Я хочу понять, поскольку скорость 24 или 48 Мбит / с невелика даже при опросе с некачественным программным обеспечением.нет ошибки SPI, такой как переполнение или другое (я проверял непосредственно в регистрах), однако данные не верны.Глядя ближе к данным, я заметил, что есть только сдвиг в один бит.

Точнее, я должен получить (в гекса): 0x30 0x31 0x32 ... И я получаю 0x18 0x18 0x99 ...

В двоичном формате:

  • ожидается 0011 0000 0011 0001 0011 0010 ...

  • получено 0001 1000 0001 1000 10011001 ...

Если я смещу полученный битовый поток влево, я получу абсолютно правильный результат.

Это вам что-то говорит?Может ли это быть из-за неправильной конфигурации?

Очевидно, что главный и подчиненный имеют одинаковую конфигурацию в отношении фазы и полярности (и всего остального, поскольку исходный код в основном идентичен).

Ответы [ 2 ]

2 голосов
/ 18 июня 2019

Проверьте таблицу Временные характеристики в таблице.

Двоичное число в крайнем левом столбце - это значение, которое входит в GPIO->OSPEEDR. При V DD = 3,3 В (это то, что использует плата Nucleo), значение 00 будет работать до 12 МГц, именно там ваш сигнал начинает разрушаться. Просто включите его до максимального значения, это не больно. (Ну, это может что-то перегрузить, если вы переключите много контактов одновременно.)

0 голосов
/ 18 июня 2019

48 Мбит / с означает 6 МБ в секунду. Даже если ваш uC 400 МГц, у вас есть только 50 тактов на байт. Это далеко не достаточно. Для более высоких скоростей возможен только DMA, а не опрос, особенно с использованием библиотек HAL.

48 МГц по кабелю тоже не легко.

...