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

STM32F103..., SPI передача через DMA, проблема с CS

Доброго всем. Вопрос такой, есть ли "велосипед" связки передачи по SPI через DMA, чтобы можно было нескольких слейвов передергивать? Свой придумывать что-то не получается, точнее то что придумал велосипед с костылями получается...не нравится очень.

Детали: делал я как-то протокол Modbus на RS485 через DMA, там вся загвоздка при передаче была в том, чтоб в нужный момент переключать на прием. Если ловить прерывание от DMA, что данные все переданы, то по сути это еще не конец передачи, как и прерывание, что буфер отправки USART пуст, тоже не то, тк там еще сдвиговый регистр при делах, надо контролировать флаг TC (передача окончена). Так вот тут так же хотел, но обломался, тк не нашел нужного флага прерывания в регистрах SPI (тот что TXE думаю не подойдет, тк когда он появляется сдвиговый регистр все еще в работе). Учитывая что работаю с дисплеем, запрашивать у него просто так не хочется - время тратить.

Если делать без DMA тоже без проблем контролируем флаг Busy, но там мы поллингом смотрим, то есть тратим процессорное время, а хотелось бы оставить все на самоуправление, вопрос как...RTOS не предлагать.

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

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


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

On 11/27/2023 at 7:31 PM, auric said:

Доброго всем. Вопрос такой, есть ли "велосипед" связки передачи по SPI через DMA, чтобы можно было нескольких слейвов передергивать?

Если речь идет исключительно о передачи, то вы же знаете сколько байт хотите передавать.

Вы настраиваете DMA на это количество данных. Когда DMA передаст это количество, то оно само сгенерирует прерывание.

Хотя, когда DMA сгенерирует прерывание, то последний байт все еще будет передаваться.

Можно таймер настроить на One-Pulse mode рассчитать время работы таймера исходя из количества передаваемых данных

и скорости передачи. Запускать его вместе с DMA.

По прерыванию от таймера обрабатывать завершение передачи.

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


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

В 27.11.2023 в 19:31, auric сказал:

Если ловить прерывание от DMA, что данные все переданы, то по сути это еще не конец передачи, как и прерывание, что буфер отправки USART пуст, тоже не то, тк там еще сдвиговый регистр при делах, надо контролировать флаг TC (передача окончена).

а флаг, что прием закончен не годится?

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

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


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

On 11/27/2023 at 8:10 PM, mitya1698 said:

а флаг, что прием закончен не годится?

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

Смотря на кокой частоте работает SPI. Если на большой, то пока настраивает, то уже вся передача и закончится.
Тогда уж просто ждать флаг BUSY в прерывании окончания передачи DMA.

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


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

6 минут назад, dimka76 сказал:

Если речь идет исключительно о передачи, то вы же знаете сколько байт хотите передавать.

Вы настраиваете DMA на это количество данных. Когда DMA передаст это количество, то оно само сгенерирует прерывание.

Хотя, когда DMA сгенерирует прерывание, то последний байт все еще будет передаваться.

Можно таймер настроить на One-Pulse mode рассчитать время работы таймера исходя из количества передаваемых данных

и скорости передачи. Запускать его вместе с DMA.

По прерыванию от таймера обрабатывать завершение передачи.

ну вот примерно это я и планировал как костыль сделать, но вдруг что-то более интересно имеется...хочется чего-то более лаконичного, неужели на USART есть нужный флаг, а тут все так печально...

Только что, mitya1698 сказал:

а флаг, что прием закончен не годится?

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

предыдущий коллега озвучил, да и я писал - флаг TXE наверняка как и на UASRT может подвести - сдвиговый регистр еще не выдал полный пакет битов в порт MOSI, если по нему я передерну CS, то данные потеряются, если запоздаю - будет простой при передаче, что тоже не есть гут, хочется минимизировать как время процессора, так и длительность цикла связи, чтобы FPS поднять на дисплее. Проверять флаг Busy простым опросом в цикле while примерно то же...тем более это придется делать какой-то шедулер для этого, не в прерывании же этим заниматься.

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


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

On 11/27/2023 at 8:19 PM, auric said:

Проверять флаг Busy простым опросом в цикле while примерно то же...тем более это придется делать какой-то шедулер для этого, не в прерывании же этим заниматься.

А почему бы и не в прерывании ?

Максимальная тактовая МК = 72 МГц.
Максимальная частота SPI = 18 МГц.
72/18 = 4

Всего 4 такта простоя. Можно вообще четыре NOP вставить. А может уже просто времени входа в обработчик DMA хватит,

чтобы гарантировано все ушло по SPI.

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


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

2 минуты назад, dimka76 сказал:

А почему бы и не в прерывании ?

Максимальная тактовая МК = 72 МГц.
Максимальная частота SPI = 18 МГц.
72/18 = 4

Всего 4 такта простоя. Можно вообще четыре NOP вставить. А может уже просто времени входа в обработчик DMA хватит,

чтобы гарантировано все ушло по SPI.

на максимальной то да, в свое время на атмелах считал прерывание это чуть ли не 12 тактов выходили. Но хочется универсальности...в этом плане проще наверное пустой байт кинуть.

 

5 минут назад, mitya1698 сказал:

не TXE, а RXE

если память не изменяет то TXE (empty - то есть передавать нечего, намек - заполняй), а RXNE (not empty - не пустой, то есть намек надо б обработать, а то перезапишется). В любом случае жаль не TC - transfer complete.

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

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


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

On 11/27/2023 at 8:31 PM, auric said:

на максимальной то да, в свое время на атмелах считал прерывание это чуть ли не 12 тактов выходили. Но хочется универсальности...

Я ошибся.
4 такта это на один бит. На восемь бит 32 такта.
За это время можно сделать какие-то подготовительные операции для отправки данных другому ведомому. 

Как раз за это время эти 32 такта и выработаются.

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


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

так как spi синхронный, то окончание приема означает как раз окончание передачи, они же по одному клоку работают.

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


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

On 11/27/2023 at 8:34 PM, mitya1698 said:

так как spi синхронный, то окончание приема означает как раз окончание передачи, они же по одному клоку работают.

Еще раз. Прерывание на прием надо в обработчике окончания передачи DMA запускать.

Пока вы будите его настраивать - передача и завершится.

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


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

On 11/27/2023 at 8:39 PM, mitya1698 said:

можно настроить перед передачей dma

тогда это прерывание будет срабатывать по каждому байту.

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


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

Настраиваем два канала dma один на передачу по spi другой на прием. на прием можно в одну ячейку памяти без инкремента принимать.

Запускаем dma по окончанию приема dma сформирует прерывание, или что-то не так в моих рассужениях?

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


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

On 11/27/2023 at 8:45 PM, mitya1698 said:

Настраиваем два канала dma один на передачу по spi другой на прием. на прием можно в одну ячейку памяти без инкремента принимать.

Запускаем dma по окончанию приема dma сформирует прерывание, или что-то не так в моих рассужениях?

Вот сейчас все понятно стало. Просто я сначала думал, что вы предлагаете отдельное прерывание на прием по SPI использовать.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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