STM32G431 захват синхронного UART
07.08.2025, 12:41
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 25.11.2010
Адрес: г. Дзержинск Нижегородская обл.
Сообщений: 1,800
Сказал спасибо: 133
Сказали Спасибо 1,152 раз(а) в 549 сообщении(ях)
|
STM32G431 захват синхронного UART
Смотрите: есть такая задача.
Есть синхронный поток. Старт бит, 8 данных, стоп бит. Все стандартно.
Но поток синхронный. И его скорость задаётся с внешней тактовой частотой с делителем в 1000.
Соответственно линий 2: тактовая и данные.
И этот поток нужно захватить в МК. Соответственно каждые 1000 периодов мы должны проанализировать вввод на предмет 1 или 0.
Пока я делаю так: входную тактовую принимаю на таймер с нужным коэф. деления. Таймер дергает прерывание. По прерыванию я считываю информацию с входа и запихиваю значение в очередь RTOS. В другом потоке собираю все в байт с учетом стартовых и стоповых битов.
Но очень хочется использовать UART аппаратный. Но не понятно с тактированием.
Была мысль: меряем внешний клок UART. Пересчитываем в коэф. деления скорости аппаратного UART. Принимаем на UART. Но показалось сложным.
Есть варианты реализовать это красиво на аппаратном UART? Или только софтовым захватом?
Внешний клок имеет частоту в единицы мегагерц и является асинхронным к частотам МК. Теоретически по определенным командам UART может меняться. Но обычно это не используеться.
|
|
|
|
07.08.2025, 13:57
|
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО/МО
Сообщений: 12,276
Сказал спасибо: 11,856
Сказали Спасибо 4,158 раз(а) в 3,176 сообщении(ях)
|
Re: STM32G431 захват синхронного UART
А просто почитать DS и appbote в части USART в синхронном режиме?
Заодно посмотреть на реализацию в используемой RTOS работы с USART.
https://www.st.com/resource/en/produ...eral_usart.pdf
https://www.зst.com/resource/en/pro...face-USART.pdf
У STM есть готовые библиотеки.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
|
07.08.2025, 14:00
|
|
|
Гражданин KAZUS.RUN
Регистрация: 17.06.2008
Адрес: Украина
Сообщений: 838
Сказал спасибо: 379
Сказали Спасибо 942 раз(а) в 451 сообщении(ях)
|
Re: STM32G431 захват синхронного UART
Судя по RM0440 так там вроде как одно явное ограничение:

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

Режим синхронного приёма в RM так и называют - SPI Slave. Но это "не совсем" SPI - стартовый и стоповый биты таки занимают временнОй слот. Впрочем, для приёмника это неактуально.
UPD.
Упс.. опередили..
Последний раз редактировалось j-Roger; 07.08.2025 в 14:07.
|
|
|
|
07.08.2025, 14:13
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 25.11.2010
Адрес: г. Дзержинск Нижегородская обл.
Сообщений: 1,800
Сказал спасибо: 133
Сказали Спасибо 1,152 раз(а) в 549 сообщении(ях)
|
Re: STM32G431 захват синхронного UART
В том и засада. Тактовый клок молотит постоянно. Без перехода в IDLE.
И читать нужно не каждый такт входного клока, а каждый 1000 (1024).
Последний раз редактировалось DanilinSA; 07.08.2025 в 14:28.
|
|
|
|
07.08.2025, 14:36
|
|
|
Гражданин KAZUS.RUN
Регистрация: 17.06.2008
Адрес: Украина
Сообщений: 838
Сказал спасибо: 379
Сказали Спасибо 942 раз(а) в 451 сообщении(ях)
|
Re: STM32G431 захват синхронного UART
Да, без сигнала NSS ( Slave select ) выходит засада..
UPD
А если
Сообщение от DanilinSA
|
|
Старт бит, 8 данных, стоп бит. Все стандартно.
|
то нельзя ли просто использовать стандартный асинхронный приём без синхросигнала?
Ну или с помощью таймера измерять скорость/baudrate на линии синхросигнала и уже от неё отталкиваться при асинхронном приёме?..
Видимо, я не понял задачи..
Последний раз редактировалось j-Roger; 07.08.2025 в 14:51.
|
|
|
|
07.08.2025, 15:18
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 25.11.2010
Адрес: г. Дзержинск Нижегородская обл.
Сообщений: 1,800
Сказал спасибо: 133
Сказали Спасибо 1,152 раз(а) в 549 сообщении(ях)
|
Re: STM32G431 захват синхронного UART
Теоретически можно.
Замерить скорость, выставить правильно на прием. И молиться, чтобы она не ушла при приеме особо сильно. При смене передающего девайса - повторить.
Или автоматически выделять единичные биты и автоматически подстраивать скорость "на ходу".
Но проблема в том, что скорость обмена задает внешний источник. И она в принципе может достаточно гулять. На 5-10-15%. Да-же во время одной передачи.
Логика передачи такая:
Линия "CLK" - молотит постоянно в диапазоне 1-5 МГц.
Линия "DATA" - в простое имеет логическую единицу.
Линия "DATA" упало в 0 - значит пришел стартовый бит.
Далее каждый 1000(1024) такта CLK - следующий бит.
Т.е. длительность каждого бита в посылке составляет 1000 тактов CLK.
Приняли байт - стоповый бит - опять линия "DATA" в 1 - пауза. (не будем углубляется в пакетный режим работы, где байтов может прийти много)
Соответственно длительность одного байта будет (старт+8 бит + стоп) 10 000 периодов "CLK".
Теоретически на "CLK" можно поставить аппаратный делитель на 1024 и принимать как нормальный синхронный сигнал. Но в протокол заложена возможность менять это число. Аппаратно это уже не так просто.
|
|
|
|
07.08.2025, 16:09
|
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО/МО
Сообщений: 12,276
Сказал спасибо: 11,856
Сказали Спасибо 4,158 раз(а) в 3,176 сообщении(ях)
|
Re: STM32G431 захват синхронного UART
DanilinSA, а аппаратный таймер в режиме делителя на любое заданное?
Внешней логикой преобразовать CLK в нормальный синхронный.
Где-то я такое уже встречал, но не помню подробностей про источник.
Вся обработка ЕМНИП на генерацию нужного CLK для USART аппаратным таймером в режиме делителя внешней частоты на выход с блокировкой на внешнем NAND до прихода на RX 0.
Результат - чистый синхронный прием аппаратным USART МК даже последовательности байт. 2 ноги на таймер, 1 дополнительный порт для 1 на вход NAND и 1 порт для синхронного анализа состояния RX на 1. Это можно попробовать аппаратно по спаду.
Поскольку частота внешнего CLK сильно выше CLK USART, то величина ошибки обработки невелика.
Возможно делитель при начале стоит перезапускать.
В такой логике даже при большем плавании внешнего CLK синхронность не нарушится.
В такой реализации ошибка цикла стартового бита при текущих данных 0.1…0.2%.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
Последний раз редактировалось mike-y-k; 07.08.2025 в 16:20.
|
|
|
|
07.08.2025, 16:34
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 25.11.2010
Адрес: г. Дзержинск Нижегородская обл.
Сообщений: 1,800
Сказал спасибо: 133
Сказали Спасибо 1,152 раз(а) в 549 сообщении(ях)
|
Re: STM32G431 захват синхронного UART
В принципе этот вариант прорабатывался.
Но хотелось минимизировать внешний обвес и реализовать счетчик делитель на внутреннем таймере. Тогда в аппаратном плане все получается относительно красиво.
Входные линии принимаем на внутричиповые компараторы. Уровень срабатывания (3V3/2 или 1V8/2) задаем DAC. Делим входную CLK внутренним таймером.
Может вытащить сигнал после таймера на внешнюю ногу и кинуть перемычку на ногу клока синхронного UART? Таймер/делитель дергает прерывание, прерывание инвертирует сигнал на ноге. Там в принципе частота в единицы килогерц получается. И будет нормальный синхронный прием.
|
|
|
|
07.08.2025, 19:04
|
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,313
Сказал спасибо: 2,633
Сказали Спасибо 12,076 раз(а) в 6,082 сообщении(ях)
|
Re: STM32G431 захват синхронного UART
Сообщение от DanilinSA
|
|
реализовать счетчик делитель на внутреннем таймере
|
Вот! Не успел предложить.
Нормальный вариант. Вот только без наворотов в виде компаратора с ЦАП-ом - никак? Неужто такой мусор?
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
07.08.2025, 19:16
|
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО/МО
Сообщений: 12,276
Сказал спасибо: 11,856
Сказали Спасибо 4,158 раз(а) в 3,176 сообщении(ях)
|
Re: STM32G431 захват синхронного UART
DanilinSA, тогда переход RX в 0 запускает делитель с выводом на вход CLK USART. Возврат в исходное состояние после приема байта при отсутствии следующего байта или продолжаем прием.
Это отменит внешний NAND.
Если нужен анализ нестандартного уровня - тогда ADC и через порт выводим 0/1 на вход RX USART.
Можно конечно и программное все сделать, но как-то скучно отлаживать столько дополнительного кода  вместо нескольких перемычек…
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
Последний раз редактировалось mike-y-k; 07.08.2025 в 19:28.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 21:25.
|
|