понедельник, 05 ноября 2012
DMX - протокол, часто применяемый в современной осветительной технике. Обзорно я про него писал, вроде, сейчас же можно его сделать и на STM32F4. Благо, ничего сложного в нём нет.
читать дальшеПакет DMX состоит из одного байта стартового кода (всегда 0x00), и 512 байт данных. Скорость передачи 250 кбит/сек. Пакет начинается с Break (низкий уровень на линии) длиной порядка 88 мкс, после чего следует Mark after Break (высокий уровень) длиной порядка 8 мкс, а за ним уже 513 байт пакета. И так циклически.
Для того, чтобы менять направление передачи драйвера RS-485 (а он же полудуплексный, в отличие от RS-422), от контроллера требуется ещё одна нога кроме RX/TX. Высокий уровень на паре выводов ~RE/DE включает режим передачи, низкий - приёма. В простейшем случае приёмника или передатчика RS-485, можно обйтись всего одной ногой: RX или TX, в зависимости от направления, а ноги, управляющие направлением, подтянуть к питанию или земле резисторами. Однако же, сейчас появились драйверы с автоматическим контролем направления, в основном от Maxim, типа MAX13487 или иных. Но для простого DMX без поддержки протокола RDM такие сложности не нужны.
Вывод управления вешаем на любой GPIO, к сожалению STM32F4 не имеет аппаратного вывода управления направлением, зато имеет очень приятное для этого дела прерывание: передача полностью завершена, по которому можно вернуть драйвер в режим приёма. В древнем LPC23xx, например, такого прерывания нет и приходится ставить дополнительный таймер, чтоб отсчитать необходимую задержку после опустошения буера передачи (на это прерывание есть везде), что очень неудобно.
Программа в простейшем случае должна иметь функции отправки UART и организации задержки. Задержку можно сделать и программную - вычитатором, как я показывал ранее, но так впустую тратятся вычислительные ресурсы контроллера и другие задачи запустить загруднительно.
Алгоритм тупого передатчика выглядит так:
Но подобный путь не для меня. Лучше всего такой медленный процесс перенести целиком на прерывания.
Алгоритм будет тогда примерно такой (для любого контроллера будет верно)
Вот и всё. Это на Си. На ассемблере всё то же самое, проекты выложу чуть позже, пока их нет =D
Про уарт напишу отдельно, а также про данную реализацию таймера.
UPD от 24.05.2013: проект с приёмом и передачей DMX по USART1 (PA9/PA10) есть, но сделан иначе, чем написано здесь. Без использования каких-либо таймеров, онли USART. Статью накатал.
@темы:
arm,
программизмы,
электроника,
stm32f4discovery,
stm32