Перейти к содержанию
    

STM32WL55JCI7. Проблема с SPI

Всем привет!

Есть в наличии отладочная плата NUCLEO-WL55JC2

https://www.st.com/content/ccc/resource/technical/layouts_and_diagrams/schematic_pack/group1/5d/4c/98/a5/b4/ff/48/5b/MB1389-WL55JC-lowband-D04_Schematic/files/MB1389-WL55JC-lowband-D04_Schematic.pdf/jcr:content/translations/en.MB1389-WL55JC-lowband-D04_Schematic.pdf

на двухъядерном STM32WL55JCI7 с встроенным трансивером.

Взаимодействие CPU с трансивером внутри МК происходит по отдельному SPI (SUBGHZSPI), линии которого наружу не выходят. Отлаживая программу заметил, что при передаче по SUBGHZSPI одного байта в приемном буфере почему-то появляется не один, а два байта. Поскольку внутрь МК осциллографом не залезть и что происходит на линиях SUBGHZSPI не посмотреть, я решил посмотреть работу SPI1. 

Сконфигурировал SP1 как мастер, задал длину посылки 8 бит, записал в DR байт и увидел на осциллографе не один, а два байта. Первый байт - тот, что записал в DR, а второй - 0х00.

Стал играться длинной посылки и обнаружил, что при длинах посылки >8бит передача происходит нормально,  а при длинах <=8бит помимо слова данных дополнительно передается нулевое слово.

Полагая, что в инициализации SPI есть ошибка, я решил сконфигурировать SPI1 с помощью CubeMX и посмотреть, что получится.

Сконфигурировал одноядерный проект. В текст main после вызова функций инициализации перед while(1) добавил три строки:

  SPI1->DR = (uint8_t) 0x97;                                           
  SPI1->DR = (uint8_t) 0xAA;                                           
  SPI1->CR1 |= (1<<6);

В результате на осциллограмме увидел тоже, что и прежде:

DS0002.thumb.jpg.728aa2d737b934c09ef3159953dc8e57.jpg

Коллеги, ай нид хелп... Не понимаю, что не так.

 

 

Изменено пользователем Zuse

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

PS Если вместо константы 0x97 записать например 0xAA97 то во втором байте вместо нулей будет 0xAA.

Т.е. видимо нужно как-то дать понять компилятору, что  0x97 это байт

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Где-то в ширине доступа к регистрам (byte-/halfword-/word-access) собака порылась.
Думаю, там такие же "особенности", как, например, в других STM-ках с FIFO на SPI-модуле.

Читать тут вкупе с RM.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

44 minutes ago, Arlleex said:

Где-то в ширине доступа к регистрам (byte-/halfword-/word-access) собака порылась.
Думаю, там такие же "особенности", как, например, в других STM-ках с FIFO на SPI-модуле.

Читать тут вкупе с RM.

Помогла конструкция "*(uint_8t *)&SPI1->DR = ..." из указанной темы

Спасибо!

Изменено пользователем Zuse

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 hours ago, Arlleex said:

Где-то в ширине доступа к регистрам (byte-/halfword-/word-access) собака порылась.
Думаю, там такие же "особенности", как, например, в других STM-ках с FIFO на SPI-модуле.

Они это называют пакованием. И, кстати, на младших моделях STM оно включено по умолчанию. А нужно это для оптимизации доступа и обеспечении непрерывности передачи. Но бывает что вызывает подобные грабли, да.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, HardWareMan сказал:

Они это называют пакованием...

Кто они? И где называют? Пока что только от Вас слышу.

Цитата

И, кстати, на младших моделях STM оно включено по умолчанию...

Это где это оно еще включается?:mda:

Хоспаде, STM-овцы вырвали из APB бит ширины доступа и завязали его на кол-во записываемых байт. Проблема надумана, ситуация описана в RM.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 часов назад, Arlleex сказал:

Кто они? И где называют?

Инженеры-писатели ST. В документации:

image.thumb.png.29e69bf9fa96443f89ef905eb5c00de3.png

20 часов назад, Zuse сказал:

Взаимодействие CPU с трансивером внутри МК происходит по отдельному SPI (SUBGHZSPI), линии которого наружу не выходят.

У WLE5 есть возможность вывести сигналы этого SPI наружу для отладки:

image.thumb.png.d018279bf13b616c45180d758673d649.png

У вашего такой возможности точно нет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

23 minutes ago, Сергей Борщ said:

Инженеры-писатели ST. В документации:

image.thumb.png.29e69bf9fa96443f89ef905eb5c00de3.png

У WLE5 есть возможность вывести сигналы этого SPI наружу для отладки:

image.thumb.png.d018279bf13b616c45180d758673d649.png

У вашего такой возможности точно нет?

невнимательно читал DS... оказывается есть

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 hours ago, Arlleex said:

Кто они? И где называют? Пока что только от Вас слышу.

Именно они, которые производители. Вот вы, вроде, ссылаетесь на RM, а сами похоже его не читали. Ну или читали по диагонали.

image.png

1.png

2.png

16 hours ago, Arlleex said:

Это где это оно еще включается?:mda:

Хоспаде, STM-овцы вырвали из APB бит ширины доступа и завязали его на кол-во записываемых байт. Проблема надумана, ситуация описана в RM.

Это имеет значение не как запись сама по себе, а как взаимосвязь записи и встроенного FIFO, который нельзя выключить полностью.

4.png

И когда ты работаешь с размером слова не равным 16 бит появляются все эти странные телодвижения. Зато непрерывный поток на физической линии.

 

Изменено пользователем HardWareMan

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Понял. Вы про вторую часть моего сообщения говорили, а не про первую. Я думал что именно ширина доступа где-то STM-овцами обозвана "пакованием" и до кучи как-то включается/выключается, что и вызвало недоумение. А все эти картинки из RM я видел - дальше можно не продолжать:smile: С SPI на STM32 я знаком вдоль и поперек, а слово "особенности" я не зря выделил кавычками.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну тут же у ТС была проблема, что он использовал прямое присваивание в регистр DR, который объявлен в заголовках на чипс как __IO uint16_t. Поэтому, я думал мы в топике, и речи за размер слова не идёт, только в рамках 8/16 бит. И кстати:

On 9/22/2021 at 8:29 PM, Zuse said:

Помогла конструкция "*(uint_8t *)&SPI1->DR = ..." из указанной темы

Будет работать. Но разве не правильнее будет *(__IO uint8_t *)&SPI1->DR = ...?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...