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