Аппаратное раздвоение шины UART
Дата: 4 Ноября 2016. Автор: Алексей
Всем привет!
Вот такие вопросы часто появляются в сети.
И тому подобные.
Отсюда я задался этим вопросом и решил как-нибудь его решить. Первое что пришло на ум, так это программный UART. Из плюсов только возможность использовать любые ноги МК, а вот минусов куча. Первый, это отъедание памяти на реализацию шины. Второй, это необходимость использования таймера для точных тайменгов. Конечно если у МК нет вообще данной шины, то это единственный вариант, но сейчас мы рассмотрим пример с раздвоением именно аппаратного UART. Для этих целей нам понадобится микросхема-переключатель. Порывшись в номенклатуре я нашел микруху которая подходит в самый раз по цене и качеству. Называется сей девайс CD4066BM. Это микросхема представляет собой что-то типа счетверенного слаботочного твердотельного реле с управлением на каждую линию индивидуально. То есть проще говоря, это просто четыре линии с возможностью передачи данных по ним туда-сюда и каждую можно включать, либо отключать. Давайте рассмотрим кишечник одного из каналов.
Как видно из схемы, левая часть это линия контроля. Если мы на этот вход подаем единицу, то канал открывается и дает возможность передавать данные туда-сюда. Если же мы подаем ноль, то канал закрывается. Правда тут есть один нюанс. В мануале написано, что если канал закрыт, то линии IN/OUT побоку что на нее подают, а вот в тоже время на линии этого же канала будет висеть ноль. По идее для UART это бит старта, но на практике я косяков при передаче не заметил.
Правее на схеме изображен сам канал. Выводы in и out это как раз линии входа и выхода. Правда на схеме можно подумать что канал односторонний, а нет, он работает в обе стороны.
Теперь давайте разберемся с самой микросхемой.
Глядя на картинку можно увидеть четыре канала A, B, C, D которые управляются одноименными контрольными линиями. Для теста давайте соберем схемку. Каналы A и D мы отдадим на линию один, а каналы B и C на линию два. Для управления переключения используем на втором канале транзистор для инверсии сигнала. Теперь для переключения нам нужно будет подать единицу чтобы работала первая линия и ноль для работы второй линии.
А теперь пишем код.
#include <avr/io.h> #include "main_init.h" #include "axlib/ports.h" #include "axlib/usart.h" // Здесь должны находиться ваши подключаемые файлы // Здесь должны находиться ваши глобальные переменные int main(void) { // Здесь должны находиться ваши локальные переменные // Настройка портов PORTB_OUT(0); PORTB_ON(0); // Инициализация UART usart_init(38400); while(1) { if(PORTB_RD(1)) { _delay_ms(200); while(PORTB_RD(1)); PORTB_XOR(0); } if(PORTB_RD(2)) { _delay_ms(200); while(PORTB_RD(2)); usart_str_out("UART_Switch\r\n", 13); } // Здесь должен находиться ваш код } }Что здесь за белиберда. Сначала настраиваем порты и сам UART. Далее в бесконечном цикле слушаем кнопки на пинах 1 и 2 порта В на нажатие. Если нажали кнопку на пине 1, то инвертируем управляющий вывод микросхемы. Если нажали кнопку на пине 2, то кидаем в порт пакет в виде строки. Собираем проект, прошиваем МК и радуемся. Для более понятного объяснения изложенного можно посмотреть кино ниже этажом. Смысла выкладывать проект для студии я не вижу. Если появится желание повторить, то можно просто скопировать код прям отсюда.
Ну вроде бы как и все) Удачи в покорении МК.)
Микрухи покупал тут.
Роман 09.12.16 21:38
Алексей, спасибо за статью. Не совсем понятно, как вход1 и вход2 подключать к UART МК (просто параллельно?), если не затруднит нарисуйте.
Алексей 09.12.16 21:42
Входы параллелятся. Они же идут на один UART.