Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Манчестер на STM32
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
ArthurS
Дано: есть плата на STM32F070, на которой надо поднять передачу данных с манчестерским кодированием со скоростью 100 кбит/с (200 кГц). Хорошо бы без аппаратных доработок.
Вопрос: можно ли это как-то сделать просто софтом или при помощи несложной дополнительной схемы (какой)?
zhevak
Цитата(ArthurS @ Jul 9 2018, 20:34) *
Дано: STM32F070, 100 кбит/с (200 кГц)
Вопрос: можно ли это как-то сделать просто софтом или при помощи несложной дополнительной схемы (какой)?

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

По сути, МК должен через каждые 5 мкс изменять состояние одного какого-то бита в порте. МК -- достаточно быстрый, способен работать на 48 МГц. Мне кажется, что такого времени -- 5 мкс -- вполне достаточно для программного управления ногой.

Но вообще задача решается куда проще на МК фирмы Atmel (бывш.) -- на AVR и на AT91Sxxx. Они умеют генерировать меандр синхронный с выходом UART. Сигнал называется XCK. Причём генерируют даже в паузах между передачами байт. На приёмном конце это весьма актуально.

А вот, STM32, к сожалению, выдают меандр только для информационных битов USART. Во время вывода стартового и стопового битов меандр не вырабатывается. Я так думаю, что такое немного странное функционирование USART-ов в STM32 продиктовано не тем, что ST хотела предоставить разработчикам работать с Манчестером (как это было у Atmel), а возможностью перевести USART в режим, совместимый с SPI. Странное решение. Но, какое уж есть.

У меня вот тут https://wp.me/p1H7g0-1Qm кое-что есть на эту тему.

aiwa
Application note от Atmel. "Manchester Coding Basics".
Atmel-9164-Manchester-Coding-Basics_Application-Note.pdf

Программа для AVR на С, поэтому легка для переноса. Используется ногодрыг.
Там два варианта.
Первый - универсальный. Используется таймер, выдающий прерывания через равные промежутки времени и соответственно чтение данных с пина порта (или запись) и соответствующая обработка.
И второй вариант: использование прерывания от порта при изменении состояния пина и таймер для измерения интервалов между событиями.
Priest_89
Реализовывали и на гораздо более медленных 8-битных PIC16, и не только передачу, просто переключением ножек порта, но и прием. Так что с STM32 проблем быть не должно. Внешняя схема зависит от физической среды передачи.
kovigor
Цитата(ArthurS @ Jul 9 2018, 18:34) *
надо поднять передачу ...

Только передача нужна, прием не нужен ? А то, если подразумевается прием из реальной линии связи, никакого STMa может не хватить, понадобится модем делать ...
vladec
Цитата
передачу данных с манчестерским кодированием со скоростью 100 кбит/с (200 кГц).

А почему 200кГц? Вроде как те же 100кГц должны быть.
k155la3
Цитата(ArthurS @ Jul 9 2018, 18:34) *
Дано: есть плата на STM32F070, на которой надо поднять передачу данных с манчестерским кодированием со скоростью 100 кбит/с (200 кГц). Хорошо бы без аппаратных доработок.
Вопрос: можно ли это как-то сделать просто софтом или при помощи несложной дополнительной схемы (какой)?
Модулятор для манчестера очень простой, помнится даже один элемент XOR.
Учитывая достаточно большую скорость, как для софт-реализации, я бы рассматривал SPI узел + простой внешний аппаратный модулятор.
Приемник - где-то аналогично.


KRS
манчестер легко реализуется на отправку через free run timer и ногу output compare, а прием через input capture
если dma подключить к output compare возможна большая скорость

можно и SPI приспособить без модулятора, главное чтобы пауз в отправке не было просто будет 2 бита spi на один бит манчестера
Tarbal
Цитата(KRS @ Jul 17 2018, 00:05) *
манчестер легко реализуется на отправку через free run timer и ногу output compare, а прием через input capture
если dma подключить к output compare возможна большая скорость

можно и SPI приспособить без модулятора, главное чтобы пауз в отправке не было просто будет 2 бита spi на один бит манчестера


Лучший ответ про output compare и input capture sm.gif

Еще можно DMA использовать. Правда на начало приема для синхронизации придется прерывание использовать. Зато передавать можно сразу несколько каналов sm.gif Опять же буферизация получится естественным образом..
Arlleex
Помню как-то нужно было за вечер сварганить приблуду, которая промышленному кондиционеру в составе стойки с оборудованием должна была команды подавать без пульта. Пультик такой, как от телевизора. Сначала подумал накопать информации по пульту и его кодам, но как-то плюнул на все это и быстренько написал дешифратор кнопок пульта - какая-то STM32 самая мелкая, естественно на захвате таймера сделал определение длительностей переключения выхода инфракрасного приемника, выплюнул их в UART, подкорректировал ручками эти числа из-за входного тристабильного внешнего буфера. И в общем получились у меня три массива чисел-команд: включение, перевод в режим обдува и снижение температуры. Теперь обратная задача - эту последовательность скармливаю регистру сравнения и в прерывании по совпадению подсовываю следующий код длительности. В итоге при включении питания я параллельно ИК-датчику выдаю кондиционеру три команды, а он и не в курсе, что роботы захватили мир батарейки в пульте уже давно сели и никто им не пользуется biggrin.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.