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

On 11/2/2022 at 9:30 PM, Reystlin said:

Организовал в итоге работу SPI через DMA

Отрезал нули - получилось красиво и компактно. Но изначальный полный длинный вариант нужно где-то сохранить, и использовать для копирования.

Первоначально примеры были только на передачу, а сейчас ещё и чтение. Нулевой и пятый поток обращаются на один адрес периферии, в этом случае нужно использовать уровни (разные!!!) приоритета для дма.

_VAL2FLD(DMA_SxCR_PL, 1)|       /// priority level 0-3

Управление ногой перенести в прерывание дма на чтение, оно срабатывает самым последним.

Если хочется чтоб всё было красиво - реализуй все прерывания ошибок: от дма, от spi. В нормальном режиме они даже срабатывать не будут, но явно спасут от зависаний. Есно нужна функция разгребания всех возможных ошибок, отдельная функция!!!!. Отладка подобных функций достаточно прикольное занятие, я использовал для этих целей напильник. Принудительно вносил помехи в линии передачи данных. 

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


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

9 минут назад, AVI-crak сказал:

Нулевой и пятый поток обращаются на один адрес периферии, в этом случае нужно использовать уровни (разные!!!) приоритета для дма...

Количество восклицательных знаков никак не отменяет то, что Вы что-то нафантазировали с приоритетами:wink:

Зачем разные?

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


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

On 11/3/2022 at 12:22 AM, Arlleex said:

Зачем разные?

Пока в проекте используется всего два дма - проблем особых нету. Но если задействовать три и более - начинаются проблемы. Даже при использовании программной функции копирования могут быть проблемы, потому как ядро имеет приоритет выше дма. Приоритеты для дма работают весьма прикольно, они создают очередь для триггеров обмена, в данном случае от spi. На режим память-память - приоритеты ставить бесполезно. Если в проекте используется несколько периферийных узлов с одним регистром на чтение/запись - не обязательно строить лесенку из приоритетов, достаточно обеспечить разницу в пределах каждого узла. 

Чего произойдет при преждевременной записи раньше чтения данных от spi - потеря данных, и взведённый флаг ошибки.

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


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

Во-первых, с точки зрения распределения периферии - для SPI3 DMA один. Запросы (потоки) обслуживаются последовательно, параллельно они не могут быть обслужены. А во-вторых, регистр DR в SPI это не абы какая ячейка ОЗУ, это ячейка FIFO типа. Причем на чтение и запись внутри периферии это два разных регистра. А в-третьих, между взведением TXE и RXNE в SPI проходит таки огромное время (с точки зрения тактов CPU/DMA).
 

19 минут назад, AVI-crak сказал:

...могут быть проблемы, потому как ядро имеет приоритет выше дма.

Мы все еще о STM32F4 топикстартера гооворим? Тогда тоже мимо - одновременные доступы к шинам в STM32 распределены по карусельному типу.

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


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

On 11/3/2022 at 12:56 AM, Arlleex said:

параллельно они не могут быть обслужены

Могут, в случае занятости системной шины данных на то самое "таки огромное время". Хотя точнее будет не параллельно, а одновременно, в момент освобождения системной шины данных, а там как повезёт.

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


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

On 11/3/2022 at 12:56 AM, Arlleex said:

одновременные доступы к шинам в STM32 распределены по карусельному типу

Верно, кто раньше встал - того и тапки. Но есть тонкости, арбитраж шины происходит по приоритетам. Ядро может "выключить" поток дма, а дма уже нет. Более того, дма память-память в случае выигрыша - будет молотить до конца, остальные каналы будут в ожидании. Если в этот момент ядро обратится к памяти - сработает очередь.

Просто для возникновения подобных условий нужно ооочень сильно постараться, ну прям совсем сильно. В простом коде подобные события огромная редкость, а если использовать хал - исчезающая редкость. Однако полностью исключать данный вариант сбоя - глупо. Тем-более что цена не высока, всего одна запись  

_VAL2FLD(DMA_SxCR_PL, 1)
On 11/3/2022 at 1:18 AM, Arlleex said:

Мне кажется, Вы не владеете вопросом =(

Тогда просветите плиз значение поля приоритета для дма. Чего это такое и зачем оно там вообще.

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


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

1 час назад, AVI-crak сказал:

Более того, дма память-память в случае выигрыша - будет молотить до конца, остальные каналы будут в ожидании...

Нет, не до конца. При одновременных запросах к одному AHB-слейву право на транзакцию передается карусельно. Поэтому никаких бесконечных ожиданий не будет, будут псевдопараллельные транзакции CPU и DMA. И нет никаих приоритетов доступа между CPU и DMA в STM32. Принцип, как я уже сказал - карусельный, а не "тапочный".
 

Цитата

Тогда просветите плиз значение поля приоритета для дма. Чего это такое и зачем оно там вообще.

Только когда DMA уже выиграл доступ к AHB, поле приоритета PL в настройках потока определяет, чей запрос (какого потока в DMA) будет обслужен первым. Для небуферизованной периферии это может быть важно.

Если уж совсем корректно, то нужно обеспечить, чтобы при конкуррентном обслуживании Rx/Tx-событий SPI DMA-контроллер обработал сначала Rx. Поэтому важно, чтобы уровень приоритета был не просто разным, как Вы выразились, а приоритет Rx-канала был выше (логически), чем Tx. При одинаковых записанных числах в PL для Rx/Tx-каналов SPI это условие будет соблюдаться архитектурно (см. описание DMA).

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


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

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

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

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

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

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

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

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

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

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