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

Манчестер на STM32

Дано: есть плата на STM32F070, на которой надо поднять передачу данных с манчестерским кодированием со скоростью 100 кбит/с (200 кГц). Хорошо бы без аппаратных доработок.

Вопрос: можно ли это как-то сделать просто софтом или при помощи несложной дополнительной схемы (какой)?

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


Ссылка на сообщение
Поделиться на другие сайты
Дано: STM32F070, 100 кбит/с (200 кГц)

Вопрос: можно ли это как-то сделать просто софтом или при помощи несложной дополнительной схемы (какой)?

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

 

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

 

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

 

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

 

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

 

 

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


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

Application note от Atmel. "Manchester Coding Basics".

Atmel-9164-Manchester-Coding-Basics_Application-Note.pdf

 

Программа для AVR на С, поэтому легка для переноса. Используется ногодрыг.

Там два варианта.

Первый - универсальный. Используется таймер, выдающий прерывания через равные промежутки времени и соответственно чтение данных с пина порта (или запись) и соответствующая обработка.

И второй вариант: использование прерывания от порта при изменении состояния пина и таймер для измерения интервалов между событиями.

 

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


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

Реализовывали и на гораздо более медленных 8-битных PIC16, и не только передачу, просто переключением ножек порта, но и прием. Так что с STM32 проблем быть не должно. Внешняя схема зависит от физической среды передачи.

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


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

Только передача нужна, прием не нужен ? А то, если подразумевается прием из реальной линии связи, никакого STMa может не хватить, понадобится модем делать ...

 

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


Ссылка на сообщение
Поделиться на другие сайты
передачу данных с манчестерским кодированием со скоростью 100 кбит/с (200 кГц).

А почему 200кГц? Вроде как те же 100кГц должны быть.

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


Ссылка на сообщение
Поделиться на другие сайты
Дано: есть плата на STM32F070, на которой надо поднять передачу данных с манчестерским кодированием со скоростью 100 кбит/с (200 кГц). Хорошо бы без аппаратных доработок.

Вопрос: можно ли это как-то сделать просто софтом или при помощи несложной дополнительной схемы (какой)?

Модулятор для манчестера очень простой, помнится даже один элемент XOR.

Учитывая достаточно большую скорость, как для софт-реализации, я бы рассматривал SPI узел + простой внешний аппаратный модулятор.

Приемник - где-то аналогично.

 

 

 

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


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

манчестер легко реализуется на отправку через free run timer и ногу output compare, а прием через input capture

если dma подключить к output compare возможна большая скорость

 

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

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


Ссылка на сообщение
Поделиться на другие сайты
манчестер легко реализуется на отправку через free run timer и ногу output compare, а прием через input capture

если dma подключить к output compare возможна большая скорость

 

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

 

Лучший ответ про output compare и input capture :)

 

Еще можно DMA использовать. Правда на начало приема для синхронизации придется прерывание использовать. Зато передавать можно сразу несколько каналов :) Опять же буферизация получится естественным образом..

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


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

Помню как-то нужно было за вечер сварганить приблуду, которая промышленному кондиционеру в составе стойки с оборудованием должна была команды подавать без пульта. Пультик такой, как от телевизора. Сначала подумал накопать информации по пульту и его кодам, но как-то плюнул на все это и быстренько написал дешифратор кнопок пульта - какая-то STM32 самая мелкая, естественно на захвате таймера сделал определение длительностей переключения выхода инфракрасного приемника, выплюнул их в UART, подкорректировал ручками эти числа из-за входного тристабильного внешнего буфера. И в общем получились у меня три массива чисел-команд: включение, перевод в режим обдува и снижение температуры. Теперь обратная задача - эту последовательность скармливаю регистру сравнения и в прерывании по совпадению подсовываю следующий код длительности. В итоге при включении питания я параллельно ИК-датчику выдаю кондиционеру три команды, а он и не в курсе, что роботы захватили мир батарейки в пульте уже давно сели и никто им не пользуется :biggrin:

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти