auric 0 27 ноября, 2023 Опубликовано 27 ноября, 2023 (изменено) · Жалоба Доброго всем. Вопрос такой, есть ли "велосипед" связки передачи по SPI через DMA, чтобы можно было нескольких слейвов передергивать? Свой придумывать что-то не получается, точнее то что придумал велосипед с костылями получается...не нравится очень. Детали: делал я как-то протокол Modbus на RS485 через DMA, там вся загвоздка при передаче была в том, чтоб в нужный момент переключать на прием. Если ловить прерывание от DMA, что данные все переданы, то по сути это еще не конец передачи, как и прерывание, что буфер отправки USART пуст, тоже не то, тк там еще сдвиговый регистр при делах, надо контролировать флаг TC (передача окончена). Так вот тут так же хотел, но обломался, тк не нашел нужного флага прерывания в регистрах SPI (тот что TXE думаю не подойдет, тк когда он появляется сдвиговый регистр все еще в работе). Учитывая что работаю с дисплеем, запрашивать у него просто так не хочется - время тратить. Если делать без DMA тоже без проблем контролируем флаг Busy, но там мы поллингом смотрим, то есть тратим процессорное время, а хотелось бы оставить все на самоуправление, вопрос как...RTOS не предлагать. Изменено 27 ноября, 2023 пользователем auric Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 62 27 ноября, 2023 Опубликовано 27 ноября, 2023 · Жалоба On 11/27/2023 at 7:31 PM, auric said: Доброго всем. Вопрос такой, есть ли "велосипед" связки передачи по SPI через DMA, чтобы можно было нескольких слейвов передергивать? Если речь идет исключительно о передачи, то вы же знаете сколько байт хотите передавать. Вы настраиваете DMA на это количество данных. Когда DMA передаст это количество, то оно само сгенерирует прерывание. Хотя, когда DMA сгенерирует прерывание, то последний байт все еще будет передаваться. Можно таймер настроить на One-Pulse mode рассчитать время работы таймера исходя из количества передаваемых данных и скорости передачи. Запускать его вместе с DMA. По прерыванию от таймера обрабатывать завершение передачи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mitya1698 18 27 ноября, 2023 Опубликовано 27 ноября, 2023 · Жалоба В 27.11.2023 в 19:31, auric сказал: Если ловить прерывание от DMA, что данные все переданы, то по сути это еще не конец передачи, как и прерывание, что буфер отправки USART пуст, тоже не то, тк там еще сдвиговый регистр при делах, надо контролировать флаг TC (передача окончена). а флаг, что прием закончен не годится? Настроить передачу и прием, даже если он не нужен, а прием закончится, как раз когда всё физически уйдет. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 62 27 ноября, 2023 Опубликовано 27 ноября, 2023 · Жалоба On 11/27/2023 at 8:10 PM, mitya1698 said: а флаг, что прием закончен не годится? Настроить передачу и прием, даже если он не нужен, а прием закончится, как раз когда всё физически уйдет. Смотря на кокой частоте работает SPI. Если на большой, то пока настраивает, то уже вся передача и закончится. Тогда уж просто ждать флаг BUSY в прерывании окончания передачи DMA. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
auric 0 27 ноября, 2023 Опубликовано 27 ноября, 2023 · Жалоба 6 минут назад, dimka76 сказал: Если речь идет исключительно о передачи, то вы же знаете сколько байт хотите передавать. Вы настраиваете DMA на это количество данных. Когда DMA передаст это количество, то оно само сгенерирует прерывание. Хотя, когда DMA сгенерирует прерывание, то последний байт все еще будет передаваться. Можно таймер настроить на One-Pulse mode рассчитать время работы таймера исходя из количества передаваемых данных и скорости передачи. Запускать его вместе с DMA. По прерыванию от таймера обрабатывать завершение передачи. ну вот примерно это я и планировал как костыль сделать, но вдруг что-то более интересно имеется...хочется чего-то более лаконичного, неужели на USART есть нужный флаг, а тут все так печально... Только что, mitya1698 сказал: а флаг, что прием закончен не годится? Настроить передачу и прием, даже если он не нужен, а прием закончится, как раз когда всё физически уйдет. предыдущий коллега озвучил, да и я писал - флаг TXE наверняка как и на UASRT может подвести - сдвиговый регистр еще не выдал полный пакет битов в порт MOSI, если по нему я передерну CS, то данные потеряются, если запоздаю - будет простой при передаче, что тоже не есть гут, хочется минимизировать как время процессора, так и длительность цикла связи, чтобы FPS поднять на дисплее. Проверять флаг Busy простым опросом в цикле while примерно то же...тем более это придется делать какой-то шедулер для этого, не в прерывании же этим заниматься. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mitya1698 18 27 ноября, 2023 Опубликовано 27 ноября, 2023 · Жалоба не TXE, а RXE Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 62 27 ноября, 2023 Опубликовано 27 ноября, 2023 · Жалоба On 11/27/2023 at 8:19 PM, auric said: Проверять флаг Busy простым опросом в цикле while примерно то же...тем более это придется делать какой-то шедулер для этого, не в прерывании же этим заниматься. А почему бы и не в прерывании ? Максимальная тактовая МК = 72 МГц. Максимальная частота SPI = 18 МГц. 72/18 = 4 Всего 4 такта простоя. Можно вообще четыре NOP вставить. А может уже просто времени входа в обработчик DMA хватит, чтобы гарантировано все ушло по SPI. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
auric 0 27 ноября, 2023 Опубликовано 27 ноября, 2023 (изменено) · Жалоба 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. Изменено 27 ноября, 2023 пользователем auric Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 62 27 ноября, 2023 Опубликовано 27 ноября, 2023 · Жалоба On 11/27/2023 at 8:31 PM, auric said: на максимальной то да, в свое время на атмелах считал прерывание это чуть ли не 12 тактов выходили. Но хочется универсальности... Я ошибся. 4 такта это на один бит. На восемь бит 32 такта. За это время можно сделать какие-то подготовительные операции для отправки данных другому ведомому. Как раз за это время эти 32 такта и выработаются. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mitya1698 18 27 ноября, 2023 Опубликовано 27 ноября, 2023 · Жалоба так как spi синхронный, то окончание приема означает как раз окончание передачи, они же по одному клоку работают. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 62 27 ноября, 2023 Опубликовано 27 ноября, 2023 · Жалоба On 11/27/2023 at 8:34 PM, mitya1698 said: так как spi синхронный, то окончание приема означает как раз окончание передачи, они же по одному клоку работают. Еще раз. Прерывание на прием надо в обработчике окончания передачи DMA запускать. Пока вы будите его настраивать - передача и завершится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mitya1698 18 27 ноября, 2023 Опубликовано 27 ноября, 2023 · Жалоба можно настроить перед передачей dma Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 62 27 ноября, 2023 Опубликовано 27 ноября, 2023 · Жалоба On 11/27/2023 at 8:39 PM, mitya1698 said: можно настроить перед передачей dma тогда это прерывание будет срабатывать по каждому байту. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mitya1698 18 27 ноября, 2023 Опубликовано 27 ноября, 2023 · Жалоба Настраиваем два канала dma один на передачу по spi другой на прием. на прием можно в одну ячейку памяти без инкремента принимать. Запускаем dma по окончанию приема dma сформирует прерывание, или что-то не так в моих рассужениях? 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 62 27 ноября, 2023 Опубликовано 27 ноября, 2023 · Жалоба On 11/27/2023 at 8:45 PM, mitya1698 said: Настраиваем два канала dma один на передачу по spi другой на прием. на прием можно в одну ячейку памяти без инкремента принимать. Запускаем dma по окончанию приема dma сформирует прерывание, или что-то не так в моих рассужениях? Вот сейчас все понятно стало. Просто я сначала думал, что вы предлагаете отдельное прерывание на прием по SPI использовать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться