РадиоКот >Схемы >Цифровые устройства >Примочки к ПК >

Теги статьи:

USB to USART и не только...

Автор: КАШАК, neo-bars@ya.ru
Опубликовано 16.07.2013
Создано при помощи КотоРед.

Все началось с того, что мне надо было подключиться к одному устройству по USART. Я сразу взял спаянный когда-то адаптер USB to UASRT (ибо в ноутбуке COM порт не предусмотрен) на AtTiny2313 (рекламой заниматься не буду, схема легко находится в интернете), подключил, запустил и внезапно понял, что у адаптера фиксированная скорость 9600, а у девайса, к которому требовалось подключиться, скорость 57600. Дело, естественно, было поздним вечером, и купить что-нибудь вроде FT232 возможности не было. Поэтому после непродолжительного почесывания хвостом за ухом, было решено изменить скорость UASRT в адаптере обычной перепрошивкой. В итоге соединение было успешно налажено. Но согласитесь - это ведь не выход, программатора может под рукой не оказаться, да и неудобно каждый раз с прошивкой шаманить. После этого случая я серьезно задумался о создании нормального адаптера, с регулируемой скоростью (и не только).

Конечно, самый простой вариант – купить FT232, но сравнив ее стоимость со стоимостью Mega8, я пришел к выводу, что этот вариант мне не нравится. Поэтому было решено сделать адаптер на МК. А раз он на МК, то делать только USART как-то не рационально. Поэтому неплохо было бы в этот адаптер засунуть еще несколько интерфейсов, если уж делать, то что-то универсальное и полезное. Почти сразу в памяти всплыли “приятные” воспоминания об установке драйверов для адаптера на Tiny2313 (для Windows7 x64 это довольно мучительно). А это значит, что от устройства “виртуальный COM” придется отказаться, следовательно, надо будет написать программу для ПК, иначе работа с устройством будет невозможна. В общем, после обдумывания в течение некоторого времени, сформировалась окончательная идея девайса. Функционал получился вот таким:

Объектом издевательств для создания девайса стал МК Mega8, т.к. в TQFP корпусе он занимает совсем мало места (намного меньше, чем AtTiny2313) и обладает целыми 8 Кб. памяти (можно помимо программы адаптера засунуть туда... например бегущий огонек, ну или то-нибудь более полезное). Сначала планировалось сделать все интерфейсы программными, но после разводки платы пришлось отказаться от программного I2C, т.к. на односторонней плате вывести его никак не получалось (спасибо создателям этого МК, которые по какой-то причине вывели его сверху, как раз рядом с USART и входом внешних прерываний INT0). Но в будущем все-таки надо будет решить этот вопрос, может отдельно вывести сбоку платы или еще как. Поэтому функциональность I2C несколько ограничена, зато USART и SPI остались полнофункциональными.

Схема устройства получилась вот такой:



Как видно, ничего сложного в ней нет. МК питается напряжением 5 В., согласование уровней для USB выполнено при помощи делителей напряжения резистор 68 Ом. + стабилитрон 3.3 В.. Тактовая частота МК – 12 МГц. Это минимальная частота для работы с шиной USB. Так же в схеме присутствуют три светодиода для индикации режимов работы. Один из светодиодов показывает, какй режим работы включен, а два других индицируют прием/передачу данных. Никаких кнопок и переключателей в устройстве не предусмотрено, и все настройки выполняются программно, прямо с ПК. Кроме этого на все выводы, используемые для работы интерфейсов, включены резисторы на 68 Ом. для защиты МК от КЗ. А то перепаивать TQFP копуса не особенно интересное занятие. 
Как уже было отмечено выше, устройство представляется ПК как HID и не требует установки драйверов (ОС наивно думает, что работает с устройством ввода). Обеном данными по USB управляет извсетсная многим библиотека V-USB. Она работает как на микроконтроллере, так и на ПК. VID и PID были выбраны из предоставляемых V-USB: VID - 0x16c0PID - 0x05df. В противном случае пришлось бы отдать кругленькую сумму за покупку индивидуального идентификатора для USB устройства, или пользоваться им единолично, не выкладывая на обозрение публики. Но т.к. проект Open Source и некоммерческий, совершенно свободно можно использовать идентификаторы, предложенные V-USB. Все это безобразие собрано на плате размерами 23х34 мм. Выглядит вот так:

А если вытравить ее и немного потыкать паяльником, получится примерно так:



Это была пробная версия устройства, поэтому есть небольшие отличия от чертежа платы, приведенного выше. Дело в том, что я почему-то решил, что вывод SS мне для работы SPI не нужен и не стал его выводить. Как оказалось в последствии я жестоко ошибался, ибо режим Slave  без него работать не будет. Ну да ладно, плата исправлена, и все режимы работают нормально.

Итак, со схемой все понятно, он простая до предела и паяется за один вечер. Но, как было сказано выше, получившееся устройство определяется ПК как HID, т.е. ОС подбирает под него драйвер из своей базы. Проще говоря, Windows думает, что работает с устройством ввода. Это делает возможным работу на любом ПК без мороки с драйверами. Но с этим связана одна небольшая проблема, ни одна из существующих программ для обмена данными через USART работать с этим устройством не будет. А значит нужна какая-то специальная программа для работы с модулем, иначе он никакой ценности из себя не представляет. Поэтому я открыл свой любимый C++ Builder (нынче его обозвали CodeGear RAD Studio, что в прочем не меняет смысла), версия 2007, и написал вот такую программу:

Ничего особо сложного в ней нет, для каждого интерфейса присутствует некоторое количество настроек. Да, одновременно несколько интерфейсов работать не могут, только по одному. Работает все это дело очень просто, при подключении устройства к ПК в окне программы активизируются кнопки, нажатие на которые запускает соответствующий интерфейс. Потом достаточно написать данные в поле ввода в определенном формате и нажать кнопку "Send". Для каждого интерфейса свой формат данных. Сейчас рассмотрим их более подробно:

USART: (прием данных идет все время, пока активен режим, так сказать, на автомате)

 

SPI:

 

I2C:

 

Для SPI  в режиме Slave никаких команд не предусмотрено, просто сидим и ждем, пока нам что-нибудь пришлют. Для работы с девайсом подключаем его к ПК, ждем некоторое время, пока ОС не сообщит, что драйвера успешно найдены и установлены, запускаем программу и начинаем обмен данными. Все предельно просто, ведь простота и была одним из критериев при создании устройства.

Да, кстати, программа совместима со всеми версиями Windows, начиная с Windows XP и заканчивая Windows 8, и не требует для работы различной экзотики, типа NetFramework и т.п. Как, впрочем, и сам модуль.

Вот, собственно, и все, программа, плата и исходники прилагаются.

Фьюзы выставляются для работы от внешнего кварца с высокой частотой. Выглядят вот так:

На картинке LOW фьюзы в 1, когда не отмечены, и в 0, когда отмечены. HIGH фьюзы наоборот. В шестнадцатеричном виде это выглядит вот так: HIGH: D9LOW: FF.

Ну и конечно же видео, а то без него как-то совсем неинтересно получается. (USART работает в режиме эхотест (Rx и Tx соединены), а SPI и I2C тестируются с микросхемой RTC PCA2129T, у нее есть и SPI и I2C интерфейсы, так что было очень удобно):



Все вопросы в Форум.