Итак, ниже представлена первая часть перевода статьи Implementation USB into microcontroller: IgorPlug-USB (AVR) (Внедрение USB в микроконтроллер: IgorPlug-USB (AVR)), автор Игорь Чешко (Igor Cesko) из Словакии.
Внедрение USB в микроконтроллер: IgorPlug-USB (AVR) Эта статья расскажет вам о способе внедрения USB интерфейса в одночиповый микроконтроллер, который изначально не поддерживает этот интерфейс. Проще говоря: создание USB интерфейса на уровне программного обеспечения интегрированного в микроконтроллер (аналогично эмуляции интерфейса RS232 в микроконтроллерах, которые не поддерживают RS232). Этот проект включает в себя разработку программного обеспечения встраиваемого в микроконтроллер, разработку драйвера для операционной системы Windows, разработку библиотеки DLL для функций, вызываемых другими программами (уровень программистов) и разработку демонстрационной программы (уровень пользователей), которая показывает все функции этого устройства. Устройство названо IgorPlug-USB(AVR) (AVR — семейство микроконтроллеров фирмы Atmel) и является модификацией устройства для дистанционного управления компьютером IgorPlug – версии для последовательного порта. Введение:В настоящее время интерфейс USB очень популярен. Это объясняется простотой использования — подключай и используй без перезагрузки компьютера после подключения устройства. К сожалению, для разработчиков внедрение USB в их устройства затруднено, так как, по сравнению с RS232, USB — более сложный протокол. Кроме того, нужны соответствующие драйвера. Поэтому большинство устройств изготовленных мелкими производителями подключаются через RS232. Этот интерфейс является одним из самых старых и имеет хорошую поддержку со стороны операционных систем. Но в последние годы интерфейс RS232 все реже устанавливают на новые компьютеры. В таких случаях помогают только PCI платы расширения с этим интерфейсом. Внедрение USB во внешние устройства, в настоящее время, осуществляется двумя способами: а) Сначала используется микроконтроллер, который поддерживает интерфейс USB. Затем, зная, как работает USB, пишется программное обеспечение для микроконтроллера. Кроме того необходимо создать драйвер для ПК, потому что операционная система не найдет устройство в стандартных драйверах устройств USB. Главными недостатками для мелких производителей и любителей являются низкая доступность микроконтроллеров (PIC, Cypress, Atmel, Intel, ...) и их высокая цена по сравнению с микроконтроллерами на основе RS232. б) Вторая возможность заключается в использовании некоторого универсального конвертера между USB и "другим" интерфейсом. Этот "другой" интерфейс зависит от типа конвертера: здесь используются в основном RS232, 8-битная шина данных, шина I2C. В этом случае не нужно специального встроенного программного обеспечения (фактически нам не нужно знать, как работает USB) и нет необходимости в написании драйвера (продавец конвертера предлагает бесплатные драйвера). Недостаток заключается в высокой цене конвертера и его недоступность для конечного пользователя – то есть нас. Мое решение, которое я взялся разрабатывать — и успешно закончил — это внедрение USB в дешевый микроконтроллер через эмуляцию протокола USB во встроенном программном обеспечении микроконтроллера. Основной проблемой была скорость микроконтроллера. Скорость шины USB слишком высока: LowSpeed — 1.5Mbit/s, FullSpeed — 12Mbit/s, HighSpeed — 480Mbit/s. Для обычных микроконтроллеров работа на максимуме: AT89C2051 — 2MIPS = 24MHz / (12cycl/inst)., PIC16F84 — 5MIPS = 20MHz / (4cycl/inst)., AT90S23x3 — 10MIPS = 10MHz / (1cycl/inst). Конечно, существуют микроконтроллеры с более высокими скоростями, но их трудно достать в основном из-за цены. Все, что я сделал для микроконтроллеров PIC16F84 или AT90S1200/AT90S23x3, было бы "достаточно" для LowSpeed USB. Для высокоскоростных же USB — это решение не приемлемо, так как для обработки одного бита USB требуется несколько циклов микропроцессора: чтения, сравнения, хранения, и некоторых других операций. Для начала я выбрал PIC16F84-20, с которым у меня есть опыт работы. Чтобы гарантировать синхронизацию импульсов USB и увеличение скорости используется синхроимпульс микроконтроллера 24MHz = 6MIPS (PIC немного разогнан). Для обработки одного бита USB требуется 4 команды (4=6MIPS/1.5Mbit для низкоскоростного USB). Со временем я отказался от такого подхода — PIC слишком медленный, кроме того нет хорошей системы команд. Второй попыткой была AT90S1200-12, которая подошла по скорости – способна получать и передавать сигнал на LowSpeed USB. Но я также отклонил это решение – из-за малого объема памяти данных этого микроконтроллера – его просто не хватает для наших целей. Третья попытка была успешной: AT90S2313-10 (или AT90S2323-10, AT90S2343-10). Это — микроконтроллеры RISC от производителя Atmel – семьи AVR. По сравнению с PIC у них низкие частоты синхроимпульсов, но они имеют по одному синхроимпульсу на каждую команду, а PIC16F84 имеет 4 синхроимпульса на каждую команду. Кроме того, их система команд и конструкция подобна RISC. Благодаря синхронизации с синхроимпульсами USB я поднял частоту до12MHz (AT90S23x3-10 – первоначально только 10MHz). Содержание
|
Подробнее...