Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871

Stm32f407 и SPI

06.05.2016, 22:25. Показов 2271. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
начал запускать дисплейчик на ST7735
на программным SPI все работает, на железном глюки
везде видел такую конструкцию( посылка с ожиданием окончания передачи)

C
1
2
3
while((SPI_LCD->SR&SPI_I2S_FLAG_TXE) ==0){__nop();}// ждем опустошения буфера передатчика
 SPI_LCD->DR=data;// закидываем данные 
 while(SPI_LCD->SR & SPI_SR_BSY){__nop()}// ждем пока освободится SPI
вот она и глючила.
если ставил задержку после/перед вторым циклом глюки пропадали
подумал что ядро намного быстрее чем модуль и модуль просто не успевает выставить бит занятости
сделал так
C
1
2
3
4
while((SPI_LCD->SR&SPI_I2S_FLAG_TXE) ==0){__nop();}// ждем опустошения буфера передатчика
 SPI_LCD->DR=data;// закидываем данные 
while((SPI_LCD->SR&SPI_I2S_FLAG_TXE) ==0){__nop();}// ждем опустошения буфера передатчика, т.е SPI перекинул данные в пердатчик
 while(SPI_LCD->SR & SPI_SR_BSY){__nop()}// ждем пока освободится SPI
все заработало нормально, даже при оптимизации O3(Keil)

кто, что думает по этому поводу?
2
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.05.2016, 22:25
Ответы с готовыми решениями:

STM32F407 SPI NSS
Почему контроллер передав данные по spi, подав 0 на ногу NSS(chip select) не возвращает её в 1?

STM32F407+mcp3201(spi)
Доброго времени суток. Заблудился в элементарном.Суть проблемы в следующем. Читается не верное напряжение с mcp3201. показывает то 21V...

Прием с SPI 16bit STM32F407 DISCOVERY
Всем доброго времени суток! Может ли кто-то подсказать как считать данные по SPI, которые приходят в 16bit ном режиме.

11
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
07.05.2016, 16:52
Хорошая тема для обсуждения. Подобные вещи встречались с другими интерфейсами (например, с CAN). Причем, везде говорилось, что это очень плохо описано в документации.
Я себе это объяснил так, что периферия работает на сниженных частотах шины, поэтому, при переключении режима его соответствующие флаги выставляются не сразу, относительно тактов ЦП (ядра). Соответственно, вы можете, к примеру, на первом такте отправить данные в уарт, но на следующем такте (если есть рассинхронихация) вполне возможно, не сбросится флаг TXE, т.к. UART еще просто не дождался своего такта. То же самое и с SPI. Эффективнее всего у меня получалось использовать штатные прерывания и DMA - эта штука работала лучше всего.
2
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
07.05.2016, 17:07  [ТС]
Цитата Сообщение от Voland_ Посмотреть сообщение
у меня получалось использовать штатные прерывания и DMA
ну DMA здесь наверное сложно прикрутить размеры посылок разные, каждый раз настраивать буфер и DMA дольше будет
и куча посылок однобайтовые, причем есть команда а есть данные, отдельную ножку нужно на данные посадить на 1 а на команды на 0, вот здесь то и нужно ожидание конца посылки, чтобы синхронно дергать
а насчет прерываний пока не думал
1
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
07.05.2016, 18:53
ну просто DMA, прерывания работают в такт с периферией. Здесь у вас не случится неправильного вызова, все флаги выставляются вовремя, и периферия запускается тоже вовремя. А так - меня, если честно, доставало настроить правильную работу, скажем RTC, т.к. низкочастотный клок (40кГц в STM32 или 32768 с внешним кварцем), потому что после каждой команды управления пришлось ждать, пока он поймет что ему отправили.

ЗЫ: что касается "сложных обменов" - то можно глянуть как это было сделано у CHAN'а в библиотеке работы STM32 с SDCARD через DMA ). В принципе он комбинировал - часть команд отправляется напрямую, а часть работает через буферы. Но все равно есть ожидание окончания, то есть такие решения будут хорошо работать в RTOS.

ЗЫ2: я делал чтение данных с флешки по SPI (просто флешка, SOIC8) через DMA. Получалось сделать поток данных, и все это работало и управлялось через прерывания DMA. Но самому написать обмен по SPI с SDCARD не получилось - содрал чужой вариант. Там и как в вашем случае (с экраном, я т.п.) обмен будет сложнее, и следовательно, дольше думать надо, чтобы это заработало.
1
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
07.05.2016, 19:40  [ТС]
Voland_, "раз пошла такая пьянка" точнее DMA
вот например нужно послать кучу однотипных данных, заливка области, вот можно ли настроить DMA на определенное количество посылок, например 100 а потом 200, а в буфере будет всего один байт(слово)?
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
07.05.2016, 21:35
Цитата Сообщение от ValeryS Посмотреть сообщение
Voland_, "раз пошла такая пьянка" точнее DMA
вот например нужно послать кучу однотипных данных, заливка области, вот можно ли настроить DMA на определенное количество посылок, например 100 а потом 200, а в буфере будет всего один байт(слово)?
тут надо точнее ставить задачу ). Залейте 100 байт/слов в буфер и закиньте через DMA Одним куском. В принципе, для создания буфера тоже можно использовать DMA (в режиме M2M). Придется поискать середину, чтобы выбрать оптимальное соотношение между количеством занятой памяти и производительностью.
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
07.05.2016, 21:59  [ТС]
Цитата Сообщение от Voland_ Посмотреть сообщение
Залейте 100 байт/слов в буфер и закиньте через DMA Одним куском.
"'Это всем известно и никому не интересно" (С) Брыль "Чародеи"
интересует как раз циклическое исполнение, DMA у STM может читать из одного места, достаточно отключить дикремент/икремент, но вот как заставить его сделать пересылку определенное количество раз, я такой настройки не видел, или однократно или бесконечно, правда я еще глубоко не рыл, была в основном задача заполнить буфер
можно конечно в прерываниях от DMA заделать какой-нибудь счетчик, но тогда все преимущества DMA теряются
Цитата Сообщение от Voland_ Посмотреть сообщение
В принципе, для создания буфера тоже можно использовать DMA (в режиме M2M).
как? для того чтобы заполнить буфер из 100 байт, мне нужен источник из тех же 100 байт и так до бесконечности
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
07.05.2016, 22:50
Цитата Сообщение от ValeryS Посмотреть сообщение
как заставить его сделать пересылку определенное количество раз, я такой настройки не видел
ну надо вчитаться, я тоже не пробовал так делать. Вообще, у DMA ж есть настройка "SIZE", которая определяет количество данных в буфере. Но что будет, если сбросить флаг инкременирования в памяти, установить size=100, но отключить зацикливание? Вроде как логика подсказывает, что это как раз то, что вам нужно.

Цитата Сообщение от ValeryS Посмотреть сообщение
для того чтобы заполнить буфер из 100 байт, мне нужен источник из тех же 100 байт и так до бесконечности
если вы сбросите в источнике инкременирование адреса - то из буфера в 32 байта вы размножите этот паттерн на нужное количество байт. Для 100 байт нужно всего-то 25 циклов - не так и много, учитывая что производительность DMA будет в 3-5 раз выше, чем код на Си, без учета возможных прерываний.
1
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
07.05.2016, 23:34  [ТС]
Цитата Сообщение от Voland_ Посмотреть сообщение
ообще, у DMA ж есть настройка "SIZE", которая определяет количество данных в буфере. Но что будет, если сбросить флаг инкременирования в памяти, установить size=100, но отключить зацикливание?
вот и хочу попробовать не знаю что получится
А окончание пересылки наверно все равно прерывание ДМАшное нужно ловить?
а может ловить флаг Занято у SPI? в общем как всегда, вопросов больше чем ответов
0
75 / 66 / 12
Регистрация: 09.02.2016
Сообщений: 907
Записей в блоге: 16
31.01.2021, 00:04
гм... в документации описано что txe это не конец передачи ! а освобождение spi_dr (его значение уходит в shift и после этого txe выставляется)

а вот bsy - это именно конец передачи данных (то есть shift пустой), но есть ньюанс :-)

для определения настоящего конца передачи данных сначала надо проверять txe и потом bsy.. на СИ скорее всего проблем не будет (по крайней мере на HAL), а вот на ассемблере вас будут ждать чудные сюрпризы :-)

вот так бывает

вдумчивое чтение и смотрение в код помогли в итоге: конец передачи это txe и bsy, передача данных без пауз это проверка txe до записи данных в spi_dr
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
31.01.2021, 08:10  [ТС]
Цитата Сообщение от ВитГо Посмотреть сообщение
в документации описано что txe это не конец передачи ! а освобождение spi_dr
я где то писал о конце передачи?
Цитата Сообщение от ValeryS Посмотреть сообщение
while((SPI_LCD->SR&SPI_I2S_FLAG_TXE) ==0){__nop();}// ждем опустошения буфера передатчика
Цитата Сообщение от ВитГо Посмотреть сообщение
для определения настоящего конца передачи данных сначала надо проверять txe и потом bsy.. на СИ скорее всего проблем не будет
а тема то про что? именно проблемы на Си
0
75 / 66 / 12
Регистрация: 09.02.2016
Сообщений: 907
Записей в блоге: 16
31.01.2021, 08:14
проблемы из за работы железа..

то как вы отправляете правильно для команд (с пред/после выставлением DC/A0 и т.д.)
а данные все таки по txe надо передавать.. ну в принципе если через dma то так оно и будет скорее всего
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.01.2021, 08:14
Помогаю со студенческими работами здесь

stm32f407 + SPI MMC + usb mass storage
Прошу не ругать, за то что так часто создаю темы (вторая за 2 дня). К stm32f407 подключена карта памяти по интерфейсу SPI (SDIO здесь не...

[Решено] STM32F407 SPI slave + Cubieboard2 не работает
Добрый день! Отлаживаю связку STM32F407 SPI в режиме slave и Cubieboard2. SPI не передаёт данные, пока я не войду в режим отладки (Keil)...

[РЕШЕНО] STM32F407+LSM303C, STM32F407 (дискавери)
Доброго времени суток, форумчане. Вот уже пару дней бьюсь над проблемкой, не выходит "каменный цветок". Собственно...

ILI9341 SPI DMA, SPI, UART библиотеки
Доброго времени, форумчане... Посоветуйте библиотек плиз... 0) Либа для работы с контроллером по типу HAL (чисто ваше мнение какая вам...

ILI9341 SPI DMA, SPI, UART библиотеки
Доброго времени, форумчане... Посоветуйте библиотек плиз... 0) Либа для работы с контроллером по типу HAL (чисто ваше мнение какая вам...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru