Колесная робоплатформа. Часть 3а — Мультимодульный USART. Теория.
Удивительно мало написано про такой простой и удобный инструмент, как связь по USART нескольких модулей. Эта тема требует отдельного рассмотрения физической, протокольной и программной части. Поскольку я в конце 2007 года увлекся микроконтроллерами фирмы Atmel, связывать мы будем по их методике. Тут существуют и промышленные решения, к примеру RS-485 или его дуплексные близнецы, но они совершенно не подходят для мобильной робототехники. Там обычно к каждому узлу ставится свой блок, одной стороной подключенный к общей шине, другой к приемопередатчику. Сейчас я хочу описать свой вариант связи нескольких устройств по USART.
В целом. Как я уже упоминал, требуется определить физический уровень, протокол передачи и программную часть. Если про последнюю еще сказано в документации Atmel, то про две предыдущие гугл дает только разбитые, разрозненные данные. Про USART можно много что прочитать в интернете, в той же документации на контроллеры AVR и даже в . Что же, начнем изобретать.
Физический уровень. Итак, нам нужно соединить несколько передатчиков и приемников. С приемниками все просто — это входные линии, как я понимаю, высокоомные, поэтому ничего не мешает просто взять и соединить приемники вместе.
Передатчики, само собой так соединять нельзя. Оно и понятно. Пока один передатчик находится в режиме ожидания, он выставляет высокий уровень сигнала на линии. Если другой передатчик попытается что-то передать… Ток хлынет большой, и кто-то откинется первым. Первое, что можно сделать — соединить приемники, подтянуть к плюсу, а передатчики закинуть на транзисторы, которые будут тянуть линию к земле. Так вполне можно делать.
Теперь у нас есть некий хаб, коммутирующий устройства. Всем он хорош, да вот завалялось у меня на полке несколько микросхем стандартной логики, воспользуюсь-ка я ими. Это же по большому счету реализация элемента И на транзисторах с высоким уровнем на входах по умолчанию. Получается нечто такое:
Вот и добро не пропадает и работать должно как следует. Только завалялась у меня HEF4081, в которой четыре отдельных элемента И с двумя входами у каждой. Не дела. Придется их каскадировать. Самый рациональный способ, который я знаю выглядит так:
Теперь осталось подтянуть большим резистором каждый вход к плюсу и получим USART хаб на пять устройств.
Протокол. Atmel в своей документации предлагает простой протокол для мультимодульной связи, который аппаратно поддерживается AVR контроллерами.
А я надеюсь, что читатель уже в курсе того, каким бывает UART и что в нем летает. Если нет — читать. Это полезно. Выглядит он так:
Как видно из диаграммы, фрейм адреса от фрейма данных отличается девятым битом: адресный — высокий уровень, данные — низкий. Так вот если переключить приемопередатчик в мультипроцессорный режим, то он будет аппаратно отсеивать все фреймы данных, пока не получит адресный фрейм. Получив адресный фрейм, данные из него можно будет прочитать, сравнить с адресом устройства, и если адрес совпадет, принимать все данные дальше, до тех пор, пока не встретится другой адресный фрейм. Или если адрес не совпадет — то и не нам говорят. Ждем дальше. Это со стороны приемника. Со стороны передатчика мы шлем адресный фрейм получателя, а затем просто отправляем данные как обычно во фреймах данных. И так до тех пор, пока не потребуется обратиться к другому устройству. Тогда снова отправляем адрес, затем данные.
Это не единственный вариант реализации мультимодульного режима связи, но и рекомендуемый в документации и просто самый удобный. Можно слать меньше бит, тогда шестой или к примеру восьмой бит будет выполнять роль адресного флага. Это совсем не удобно по двум причинам: читать придется за раз меньше байта, а также выковыривать адресный флаг из принятых данных. В девятибитном режиме данные принимаются также, как и при связи двух устройств, а адресный флаг находится в отдельном бите RX8 регистра управления и статуса (UCSRB для AtMega8).
Содержание серии: 3а — Мультимодульный USART. Теория.
3б — Мультимодульный USART. Реализация.