Реклама ⓘ
Главная » Компьютерная электроника
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Похожие статьи:


Реклама ⓘ

Адаптер USB to USART, SPI и I2C

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

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

  • адаптер USB->USART;
  • адаптер USB->SPI;
  • адаптер USB->I2C;
  • при этом устройство должно быть HID (Human Interface Device), чтобы не морочить голову с установкой драйверов.

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

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

Схема USB в USART, SPI и I2C адаптера

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

Плата получилась вот такая:

Screenshot_4(1).png

А в спаянном виде:

Screenshot_1.png

Это был тестовый образец да еще и разведенный с ошибками. Я почему-то посчитал, что вывод CE выводить не стоит. Ну ничего, все уже исправлено и к статье приложена правильная плата.

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

UIM

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

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

  • отправка нескольких  HEX чисел, просто пишем их через пробел в неограниченном количестве, например: 01 05 fa aa ...
  • отправка строки (текст, числа и т.п.). Тут уже в начале строки пишется   идентификатор S (s), например: s www.cxem.net

SPI:

  • для отправки данных устройству формат строки такой: Адрес (кому передавать и в какую ячейку памяти) А (а) и Данные D (d). Например: aa3 dfa;
  • для запроса данных с устройства: Адрес (от кого принимать и из какой ячейки памяти) и идентификатор чтения R (r). Например: aa3 r

I2C:

  • для отправки данных устройству: Адрес устройства (бит чтения в 0) А (а) Адрес ячейки памяти M (m) Данные D (d). Например аа2 m03 d15
  • запрос данных выглядит вот так: Адрес устройства (бит чтения в 0) А (а) Адрес ячейки памяти M (m) Адрес устройства (бит чтения в 1) А (а) Идентификатор чтения с количеством ячеек памяти для чтения R (r). Например: aa2 m03 aa3 r1

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

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

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

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

Фьюзы

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

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

Список радиоэлементов

Обозначение Тип Номинал Количество ПримечаниеМагазинМой блокнот
МК AVR 8-бит
ATmega8
1 Поиск в магазине ОтронВ блокнот
VD1, VD2 Стабилитрон
BZX55C3V3
2 3.3 ВольтПоиск в магазине ОтронВ блокнот
HL1-HL3 Светодиод3 Поиск в магазине ОтронВ блокнот
C1 Электролитический конденсатор100 мкФ1 Конденсатор танталовыйПоиск в магазине ОтронВ блокнот
C2, C3 Конденсатор0.1 мкФ2 Поиск в магазине ОтронВ блокнот
C4, C5 Конденсатор22 пФ2 Поиск в магазине ОтронВ блокнот
R1 Резистор
1.5 кОм
1 Поиск в магазине ОтронВ блокнот
R2 Резистор
10 кОм
1 Поиск в магазине ОтронВ блокнот
R3, R4, R8-R13 Резистор
68 Ом
8 Поиск в магазине ОтронВ блокнот
R5-R7 Резистор
220 Ом
3 Поиск в магазине ОтронВ блокнот
R14, R15 Резистор
4.7 кОм
2 Поиск в магазине ОтронВ блокнот
Кварцевый резонатор12 МГц1 Поиск в магазине ОтронВ блокнот
Добавить все

Скачать список элементов (PDF)

Прикрепленные файлы:

Теги:

Опубликована: Изменена: 25.06.2013 0 2
Я собрал 0 5
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 5 Проголосовало: 5 чел.

Комментарии (36) | Я собрал (0) | Подписаться

0
mr_smit #
Идея класс! Ну а рукописная программа управления просто выше всяких похвал!
Только по формату запроса I2C не понял:
для отправки данных устройству: Адрес устройства (бит чтения в 0) А (а) Адрес ячейки памяти M (m) Данные D (d). Например аа2 m03 d15
Почему две буквы "а" в примере? Поподробнее про формат запроса.
Ответить
-1

[Автор]
BARS_ #
Это для PCA2129 адрес 0хА2 (запись) и 0хА3 (чтение) соответственно бит чтения/записи 0 и 1. А запись А(а) означает, что можно вводить и большие и маленькие буквы.
Ответить
0
mr_smit #
Всё, понял.
Ответить
0
Egor #
А в чем заключается ограниченность функций I2C? И как понять - «пришлось отказаться от программного I2C…»? Какой же он там у вас тогда?
Ответить
-1

[Автор]
BARS_ #
Упс, опечатка, пришлось отказаться от аппаратного... А ограниченность в том, что нельзя настраивать скорость и нет режима Slave, да и вообще никаких настроек нет...
Ответить
-1

[Автор]
BARS_ #
Статью исправил, спасибо за замечание.
Ответить
0
Egor #
Поправьте тогда уж и здесь:
Сначала планировалось сделать все интерфейсы программными
А какова частота тактирования шины (SCL) в вашем случае? И что такое "Interval", и в каких единицах он устанавливается – mC, uC? Это время удержания "Мастером" SCL и SDA в единице (STOP) или удержание SCL в нулевом состоянии при опросе медленных устройств? Возможность синхронизации, как я понял из вашего ответа, на шине отсутствует.
Ответить
-1

[Автор]
BARS_ #
Это интервал автоматической отправки сообщений устройству, измеряется в миллисекундах. I2C пока умеет только подключиться к устройству и отправить/принять данные. Никаких дополнительных функций у него нет... Как свободного времени побольше будет (примерно август), переделаю плату и добавлю полноценный, аппаратный I2C.
Ответить
0
OlegG #
Я померял. У меня SCL частота около 290 кГц.
Ответить
0
Никита #
Скажите, возможно ли увязать эту программу с другими на компьютере, так, чтобы получение и передачу данных можно было организовать в автоматическом режиме? Возможно ли создание программного костыля, который из программы будет создавать виртуальный COM и перенаправлять поток данных между ним и устройством? Ведь множество связок "устройство-программа" организованы именно через COM. Это несомненно повысило бы универсальность.
Ответить
-1

[Автор]
BARS_ #
Можно попробовать, но нужна какая-то конкретная программа, из которой брать данные. На счет виртуального СОМ надо подумать, скорее всего такое возможно. Но, как уже писал выше, ориентировочно в августе.
Ответить
0
Никита #
На счет другой программы... Я имел ввиду организацию в Вашем модуле оснастки (набор идентификаторов, сообщений - я не очень силен в программировании), описав которые, Вы предоставите юному (или не очень) изобретателю простой бездрайверный доступ к своему устройству в железе. Но с другой стороны, Ваша программа будет использоваться, как библиотека, только сейчас подумал, и по функционалу будет не сильно отличаться от драйвера. В любом случае такая штука будет очень полезна для армии начинающих разработчиков экзотических устройств!
Ответить
-1

[Автор]
BARS_ #
А, т.е. возможность перевести программу в дополнительный режим, в котором можно будет отправлять данные модулю напрямую, из любой проги?
Ответить
0
Никита #
Да, я именно это имел ввиду. Два дополнительных режима. В одном, при инициализации, в системе появляется ком-порт. А в другом режиме. В систему выбрасываются (и отлавливаются из системы) определенного вида сообщения, указатели, несущие с собой пакеты сообщений из нашей приблуды. Этот режим, естественно, можно и нужно увязать со всеми тремя протоколами.
Вот так я это вижу: Собрал я в железе устройство, которое включает и выключает лампочку по приходу по UART определенных байт (конечно в жизни принципы работы, оправдывающие применение контроллера, гораздо изощренней - сбор параметров с датчиков, управление с использованием вычислительной мощности ПК и др.). Дальше я беру Delphi и накидываю окошко с выводом/выводом/анализом данных (графики, ползунки, кнопочки). А для того, чтобы увязать это все с железом, пользуюсь двумя-тремя четко обозначенными функциями при запущенном модуле-драйвере. Для меня это бы был просто праздник!
Ответить
-1

[Автор]
BARS_ #
Хм, очень интересная мысль, сейчас как раз каникулы начинаются, попробую сделать.
Ответить
0
Никита #
Ждем с нетерпением! Было бы здорово, если бы к модулю прилагалось описание организации связи с самопальной прогой на Delphi (мне кажется, что на Delphi больше начинающих). Успехов Вам! Спасибо за Ваш труд!
Ответить
0
kost #
Спаял и стал прошивать. Dопрос - в какой среде программа? Чем из исходников в hex согнать? Я пользуюсь CVAVR. Если не затруднит - можно куда-то hex выложить? Заранее спасибо!
Ответить
-1

[Автор]
BARS_ #
Прорамма в Eclipse (аналог AVR Studio). hex есть в архиве с прошивкой
Ответить
0
kost #
Спасибо! Буду шить! Отпишусь о впечатлениях работы! Очень мегакрутой девайс!
Ответить
+1
civil #
А как же 1wire?
Ответить
0
SpLab #
Собрал Ваше устройство. К сожалению под рукой не оказалось кварца на 12МГц, поставил на 16МГц, поправил USB_CFG_CLOCK_KHZ на 16000 и в свойствах проекта поставил 16000000. Скомпилировал, залил - не работает (неизвестное устройство). Скажите больше нигде не надо ничего менять под этот кварц?
Ответить
0
maksms #
Кто не хочет заморачиваться с пайкой может использовать готовую плату USBasp - только необходимо поправить в коде usbdrv.h выводы на B: 0 и 1. Ради интереса попробовал -работает, хотя при переключении/выключении режимов устройство "отпадывает" .
К сожалению нет исходной части п/о и интегрировать с чем-то будет сложно. Можно использовать только для тестов и экспериментов.
Плату USBasp так же можно перепрограммировать в другие устройства, например в полноценный i2c переходник (на основе i2c tiny) и прочие..
Ответить
0
slavik #
Находит автоматически драйвера? А то у меня что-то не подключает, пишет что нашло Unknown Device... как настроить драйвера?
Ответить
0
goga_ukr #
Собрал Ваше устройство для экспериментов с термометром DS1621. Микросхему по шине I2C вижу. Вопрос: в каких единицах отображаются принятые данные? Это явно не HEX, скорее десятичная система. И что дает при этом кнопка BIN/BCD?
Ответить
0
Александр #
А на мега 48 возможен переход?
Ответить
0
Денис! #
Спасибо! Работает. Пока успел проверить только UART
Ответить
0
Ден #
Интересное устройство, но хотелось бы не использовать внешнего питания, а запитаться от usb. Реален ли такой вариант, что нужно изменить?
Ответить
0
alfik777 #
Собрал устройство только ради SPI. В итоге USART работает, I2C работает, SPI - нет. Т.е. при отправке данных ни на одном из выводов ничего- SCK,MOSI,MISO - абсолютная тишина. Ну и периодически при отправке просто "теряет связь" - No Device. У кого-то SPI работает ?
Ответить
0
iwanwas #
А где HEX файл для контроллера Atmega?
Ответить
0
Георгий #
Хороший проект! А нельзя ли перекомпилировать его под Atmega168?
Ответить
0
mobi #
Допиливание проекта заглохло? Жалко.
Ответить
0
nodir #
Вы можете дать исходники UIM чтобы я смог попробовать написать программу rad studio XE8?
Ответить
0
raxp #
...свободный JEDI - HID Component чем не устроил?
Можно и эмулировать доступ к HID через COM, если транслировать обмен между HID и виртуальным нуль-модемным com0com.
Ответить
0
Раушан #
Необходимо подключить микросхему AD7746(емкость-код, I2C) к датчику, запрограммировать и снимать информацию с датчика. Можно ли это сделать с помощью CH341(USB- I2C)?
Ответить
+1
Sreg #
В архиве нерабочий hex. После прошивки устройство определяется как программатор USBasp c VID_16C0 & PID_05DC а не как в статье PID_05DF. Соответственно ПО Universal Interface Module не видит устройство. Чтобы изменить PID нужно изменить исходник и перекомпилировать проект, а для этого еще надо установить и настроить и разобраться с Eclipse.
Ответить
0
toshhon #
Подправил PID на 05DF но софт не видит устройство
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическое сопротивление?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

USB-реле (2 канала)
USB-реле (2 канала)
DC-DC регулируемый преобразователь 1.5-37В 2А с индикатором Регулятор мощности 2 кВт
вверх