Колесная робоплатформа. Часть 3а — Мультимодульный USART. Теория.

Удивительно мало написано про такой простой и удобный инструмент, как связь по USART нескольких модулей. Эта тема требует отдельного рассмотрения физической, протокольной и программной части. Поскольку я в конце 2007 года увлекся микроконтроллерами фирмы Atmel, связывать мы будем по их методике. Тут существуют и промышленные решения, к примеру RS-485 или его дуплексные близнецы, но они совершенно не подходят для мобильной робототехники. Там обычно к каждому узлу ставится свой блок, одной стороной подключенный к общей шине, другой к приемопередатчику. Сейчас я хочу описать свой вариант связи нескольких устройств по USART.

В целом.

Как я уже упоминал, требуется определить физический уровень, протокол передачи и программную часть. Если про последнюю еще сказано в документации Atmel, то про две предыдущие гугл дает только разбитые, разрозненные данные. Про USART можно много что прочитать в интернете, в той же документации на контроллеры AVR и даже в моем очень кривом переводе. Что же, начнем изобретать.

Физический уровень.

Итак, нам нужно соединить несколько передатчиков и приемников. С приемниками все просто — это входные линии, как я понимаю, высокоомные, поэтому ничего не мешает просто взять и соединить приемники вместе. Передатчики, само собой так соединять нельзя. Оно и понятно. Пока один передатчик находится в режиме ожидания, он выставляет высокий уровень сигнала на линии. Если другой передатчик попытается что-то передать… Ток хлынет большой, и кто-то откинется первым. Первое, что можно сделать — соединить приемники, подтянуть к плюсу, а передатчики закинуть на транзисторы, которые будут тянуть линию к земле. Так вполне можно делать.



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



Вот и добро не пропадает и работать должно как следует. Только завалялась у меня HEF4081, в которой четыре отдельных элемента И с двумя входами у каждой. Не дела. Придется их каскадировать. Самый рациональный способ, который я знаю выглядит так:



Теперь осталось подтянуть большим резистором каждый вход к плюсу и получим USART хаб на пять устройств.

Протокол.

Atmel в своей документации предлагает простой протокол для мультимодульной связи, который аппаратно поддерживается AVR контроллерами. А я надеюсь, что читатель уже в курсе того, каким бывает UART и что в нем летает. Если нет — читать. Это полезно. Выглядит он так:



Как видно из диаграммы, фрейм адреса от фрейма данных отличается девятым битом: адресный — высокий уровень, данные — низкий. Так вот если переключить приемопередатчик в мультипроцессорный режим, то он будет аппаратно отсеивать все фреймы данных, пока не получит адресный фрейм. Получив адресный фрейм, данные из него можно будет прочитать, сравнить с адресом устройства, и если адрес совпадет, принимать все данные дальше, до тех пор, пока не встретится другой адресный фрейм. Или если адрес не совпадет — то и не нам говорят. Ждем дальше. Это со стороны приемника. Со стороны передатчика мы шлем адресный фрейм получателя, а затем просто отправляем данные как обычно во фреймах данных. И так до тех пор, пока не потребуется обратиться к другому устройству. Тогда снова отправляем адрес, затем данные.
Это не единственный вариант реализации мультимодульного режима связи, но и рекомендуемый в документации и просто самый удобный. Можно слать меньше бит, тогда шестой или к примеру восьмой бит будет выполнять роль адресного флага. Это совсем не удобно по двум причинам: читать придется за раз меньше байта, а также выковыривать адресный флаг из принятых данных. В девятибитном режиме данные принимаются также, как и при связи двух устройств, а адресный флаг находится в отдельном бите RX8 регистра управления и статуса (UCSRB для AtMega8).

Содержание серии:
0 — Планирование.
1 — Приводы и питание.
2 — Контроллер периферии и связь.
3а — Мультимодульный USART. Теория.
3б — Мультимодульный USART. Реализация.
  • +2
  • 19 апреля 2012, 10:44
  • Ozze

Комментарии (5)

RSS свернуть / развернуть
+
0
Извините, может, я чего не понял, но логика, кажись должна быть не «И», а «ИЛИ», чтобы сигнал мог дать любой передатчик.
avatar

able

  • 19 апреля 2012, 16:46
+
0
Кстати, данный вариант включения транзисторов реализует именно логику «ИЛИ»
avatar

able

  • 19 апреля 2012, 16:51
+
0
Абсолютно верно подмечено:) Логика нужна ИЛИ. Но только перевернутая, т.е. ИЛИ по низкому сигналу. Именно это мы и делаем, притягивая входы И к высокому напряжению.

Наверное я немного не так изложил просто.

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

Можно сказать, что я сделал инвертированную функцию ИЛИ на элементе И:)
avatar

Ozze

  • 20 апреля 2012, 10:55
+
0
Кстати, изделие уже протестировано, и оно работает:)
avatar

Ozze

  • 20 апреля 2012, 11:04
+
0
О_о Вот на это я не обратил внимания. Спасибо. Буду знать )
avatar

able

  • 20 апреля 2012, 14:35

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.