РадиоКот :: Связь микроконтроллеров семейства C8051 с компьютером через USB. Часть I.
Например TDA7294

РадиоКот >Статьи >

Теги статьи: C8051USBДобавить тег

Связь микроконтроллеров семейства C8051 с компьютером через USB. Часть I.

Автор: Сергей Безруков aka Ser60
Опубликовано 06.03.2012
Создано при помощи КотоРед.

Фирмой Silicon Laboratories выпускается несколько серий микроконтроллеров (МК) семейства C8051 со встроенным USB модулем, обеспечивающим полноскоростной трафик со скоростью, до 12 Мбит/сек. Здесь пойдет речь о самой новой серии F38x, появившейся на рынке в 2011 году. МК этой серии совместимы по выводам с МК серии F340, выпускаемым уже на протяжении 2-3 лет, и являются их дальнейшем усовершенствованием.

Отличительной особенностью семейства F38x является наличие встроенного прецезионного генератора, позволяющего МК работать с шиной USB без применения внешних кварцевых резонаторов. Сам МК также может тактироваться от этого генератора, обеспечивая максимальную производительность в 48 MIPS (большинство инструкций МК выполняются за 1-2 цикла тактовой частоты). Возможно тактирование МК и на более низких частотах. Микроконтроллеры оснащены внутренней памятью (RAM) объемом 2Кб или 4Кб в зависимости от модели, из которой до 1Кб может быть использовано под буферы USB. Объем флэш-памяти программ составляет от 32Кб до 64Кб и имеется полный джентельментский набор периферии в виде 2 компараторов, 10-битного АЦП с производительностью 500 киловыборок в секунду и опорником, 6 16-битных таймеров и 5 таймеров/счетчиков с режимом захвата и генерации ШИМ, а также интерфейсы последовательно обмена данных I2C, SPI, UART, которые могут быть использованы одновременно. Важно отметить, что все МК семейства C8051 обладают внутренним коммутатором ресурсов, позволяющим программно перенаправить аналоговые и цифровые входы/выходы периферии на практически любые выводы корпуса. Это очень удобно при разводке печатной платы. Помимо безвыводных корпусов типа QFN, МК серии F38x выпускаются и в корпусах LQFP-32 или TQFP-48, причем первые имеют шаг выводов 0,8 мм и довольно легко паяются в домашних условиях.

Как и любая другая фирма, выпускающая МК с аппаратным USB драйвером, Silicon Labs также предлагает базисное программное обеспечение для их программирования на языке C с примерами. При этом можно довольно просто реализовать USB устройства, например, класса HID (Human Interface Device), используя библиотеку SLABHIDDevice.dll, описанную в «аппноуте»  AN249. Помимо этого, для еще большего упрощения интеграции своих микроконтроллеров с шиной USB фирма разработала высоко-уровневую систему USBXpress®, использующую эксклюзивный драйвер (но только для Windows), см. «аппноут» AN169. Оба документа можно загрузить с вебсайта фирмы ( www.silabs.com ). Мы рассмотрим оба способа связи.

Тестовая схема

Приведенные здесь примеры программ адаптированы под следующую тестовую схему.

Как видно из схемы, МК подключён напрямую к разъему X1 типа mini-USB, необходимые подтягивающие резисторы для работы со скоростью full speed имеются внутри МК. Лавинные диоды D1 - D3 предохраняют входы МК от перенапряжений. Схема получает питание от порта USB компьютера и в ней отсутствует привычный для подобных схем кварцевый резонатор. Его роль выполняет встроенный в МК прецезионный генератор частоты 12 МГц. Эта частота повышается до 48 МГц модулем PLL в МК и используется для модуля USB. Сам МК тоже может работать на этой частоте от PLL, что и реализовано программно в наших примерах. Резистор R1 подтягивает линию сброса МК к питанию, а конденсаторы C1 – C3 являются блокировочными в цепях питания МК. На выводе VDD присутствует напряжение около 3,3В, получаемое из 5В встроенным в МК стабилизатором, от которого можно питать и другие части схемы. Общее токопотребление от этого стабилизатора не должно превышать 100 мА, включая собственное потребление МК. Отметим, что несмотря на питание МК от цепи 5В, максимальное напряжение на выводах портов МК равно напряжению VDD (3,3В). При необходимости МК может питаться независимо от порта USB либо напряжением 5В, подаваемым на вывод REGIN, либо напряжением в пределах 3 – 3,6В подаваемым на вывод VDD. При этом в любом случае вывод VBUS должен подключаться к разъему USB. Напряжение на этом выводе отслеживается МК и препятствует работе его USB модуля при неподключенном к компьютеру устройстве. Подробнее обо всем этом написано в секции 8 «даташита». Для визуализации передачи данных в схеме задействованы светодиоды D4 и D5, программа компьютера позволяет включать и выключать каждый из них по отдельности.

Схема смонтирована на печатной плате, установленной на макетную. Плата разработана в системе Eagle, файл платы прилагается. Разъем SV1 служит для внутрисхемного программирования МК. В качестве программатора изпользовался описанный ранее на форуме https://radiokot.ru/articles/38/ .

Часть I: использованиe библиотеки USBXpress®

Библиотека обеспечивает быстрый старт для внедрения USB интерфейса в устройство пользователя, не требует от него никаких знаний по USB, и напоминает работу с файлами. Все, что нужно сделать для коммуникации с устройством – это открыть канал связи, записать или считать из него данные, и закрыть канал. И это все! Для работы с библиотекой следует установить на компьютере систему USBXpress Development Kit, находящуюся в свободном доступе на вебсайте фирмы https://www.silabs.com/products/mcu/Pages/USBXpress.aspx

Установка этой системы включает установку специального драйвера. При использовании Вашего устройства на другом компьютере, на нем достаточно установить лишь сам драйвер программой USBXpressInstaller.exe, находящейся в папке Driver установки системы. В системе имеются драйверы для 32- и 64-битных платформ. После установки драйвера и подключении устройства к компьютеру, оно опознается менеджером системы как USBXpress Device

Открытие окна свойств устройства покажет, среди прочих, такие детали как идентификаторы производителя (VID) и устройства (PID):

VID_10C4 – это идентификатор фирмы Silicon Laboratories, присвоенный ей организацией USB-IF (USB Implementers Forum). Фирма разрешает пользоваться своим идентификатором для USB устройств на основе ее продукции. PID_EA61- это в данном случае произвольно установленный идентификатор устройства в программном обеспечении.  Для экспериментов вполне сойдет и такой, но для массовой продукции следует обзавестись идентификатором своиx изделий, например, запросив об этом фирму (бесплатный сервис!).

Помимо драйвера установка системы USBXpress включает документацию («аппноут» AN169), библиотеки для интерфейса с программой МК компьютера (в папке USBXpress_API), позволяющие импортировать библиотеку в компьютерные программы на языках Basic, C++, и C#. Приводится также и пара примеров программирования устройств для разных типов МК с интерфейсом к ним на языках Visual C++ 6.0 и Visual Basic 6.0. Однако, для этих программ имеется лишь минимум документации и комментариев. Цель настоящей статьи восполнить этот пробел и предоставить еще один и более простой пример.

Отметим, что библиотека USBXpress также предоставляет средства для интерфейса с преобразователями USB – UART серии CP210x, но эти функции в настоящей статье не рассматриваются.

Программное обеспечения для МК

Программы для МК написаны на языке C и находятся в папке USBXpressMK в прилагаемом архиве. По открытии файла проекта USB.wsp системой Silicon Labs IDE (бесплатная загрузка с вебсайта фирмы) Вы увидите следующие его составляющие:

Все заголовочные файлы с расширением .h, а также библиотека USBX_F38X.LIB, предоставляются фирмой и изменений не требуют. Следует лишь включить их в проект. Все функционирование устройства описано в файле USB_MAIN.c.

Этот файл начинается с установки параметров USB устройства. Параметры VID  и PID прокомментированы выше, за ними идет номер версии устройства (может быть выставлен произвольно) и информация для драйвера USB компьютера о токопотреблении устройства (требуется стандартом USB) в градациях 2 мА. Для нашего устройства 40 мА будет достаточно.

Эти установки завершаются дополнительной информацией об имени производителя, названии устройства, и его серийного номера. В нашем случае эти параметры имеют лишь информационный характер. Вот, к примеру, как выглядит информационная структура о производителе. Первые 2 ее байта (0x1A, 0x03) говорят драйверу USB к чему эта структура относится, а остальные символы строки производителя должны быть представлены в кодировке Unicode. Именно поэтому каждый символ требует двух байтов и после каждой буквы из Латинского алфавита присутствует 0 (в соответствии с порядком байтов little endian):

Подпрограмма Port_Init(), в соотвтествии с ее именем, инициализирует порты ввода/вывода МК. Для упрощения конфигурации портов (и других модулей МК) фирма предостявляет систему Config2, доступную с ее вебсайта. В нашем устройстве эта функция вызывается обработчиком прерываний МК после инициализации модуля USB, но ее можно вызывать и явно из программы пользователя. Главная программа пользователя main() в данном случае чрезвычайно проста. Она начинается с отключения сторожевого таймера и инициализации USB модуля USB_Init. Перед этим фирма рекомендует вызывать функцию USB_Clock_Start(), т.к. перед инициализацией USB модуля его генератор должен работать. Однако, запуск генератора в нашем случае осуществляется стартовым кодом компилятора, который вычисляется до передачи управления функции main(). Программа скомпилирована средствами разработки фирмы Keil. При использовании другого компилятора может потребоваться раскомменировать вызов функции USB_Clock_Start().

Главная функция заканчивается установкой тактирующей частоты МК (CLKSEL), разрешением сброса МК по питанию (RSTSRC), и разрешением прерываний от USB модуля. После этого программа входит в бесконечный цикл и управляется прерываниями. Обработчик прерываний также состоит лишь из нескольких строчек. Он настроен на прием и обработку запросов из компьютера.

В нашем случае управления светодиодами МК получает 3 байта из компьютера. Если первый из них равен 0, то происходит прием и обработка данных (включение и отключение светодиодов), а если 1 – то это запрос на передачу состояния светодиодов в компьютер. Первый байт пакета (Packet[0]), таким образом, регламентируется системой USBXpress. Второй и третий байты пакета в нашем случае информационные. Второй из них (Packet[1]) управляет состоянием красного светодиода (0 – не менять состояние, 1 – изменить на противоположное), а третий (Packet[2]) аналогичным образом управляет зеленым светодиодом. При передаче в компьютер нулевое значение этих байтов соответствует выключенному состоянию соответствующего светодиода, а значение 1 – включенному. Такой формат данных используется программой компьютера.

При необходимости можно передавать и большее число байтов в пределах одного пакета, но не более 63. Это ограничение накладывается стандартом USB на размер пакета в транзакциях типа Bulk Transfer, используемых системой USBXpress.  При передаче еще большего числа данных их следует программно разбивать на пакеты меньшей длины перед передачей. В примерах использования библиотеки USBXpress имеется пример передачи длинных файлов между компьютером и МК. Все неопределенные здесь функции типа Block_Read(), Block_Write() и т.п. подробно описаны в «аппноуте» AN169. Загрузочный модуль программы занимает около 3,8Кб в памяти МК из 32Кб имеющихся.

Программное обеспечение для компьютера

Демонстрационная программа для компьютера имеет графический интерфейс,  написана на языке C# с использованием WPF (Windows Presentation Foundation) и отлажена в среде Microsoft Visual Studio 2010 с установленной системой .NET версии 4.0. Работа программы проверена в операционных системах Windows XP (32-битная версия) и Windows 7 (64-битная версия). При описании программы предполагается, что читатель обладает хотя-бы начальными знаниями в области объектно-ориентированного программирования.

В прилагаемом архиве программы находятся в папке проекта USBXpressComputerTestUSBXpress. Файлы App.xaml и App.xaml.cs – стандартные стартовые и генерируются Visual Studio автоматически. Файл MainWindow.xaml также генерируется системой и содержит описание графического интерфейса программы. Вопросы создания графического интерфейса в Visual Studio с использованием WPF выходят за рамки настоящей статьи и здесь не рассматриваются. Для открытия проекта в Visual Studio кликните мышкой на файл TestUSBXpress.sln. В окне менеджера проекта Вы увидите следующее:

Важно отметить следующие 2 обстоятельства. Первое - для компиляции проекта в Studio следует добавить класс System.Management (через меню Project -> Add Reference и закладку .NET). Этот класс уже добавлен в установках нашего проекта, но при создании нового это добавление может понадобится, т.к. этот класс не включен в список активных по умолчанию. Второе – для запуска программы необходимо поместить файл SiUSBXp.dll в папку  bin проекта (в нашем проекте этот файл уже тоже помещен куда следует). При запуске программы и неподключенном устройстве на экране появится следующее окно:

Кнопки служат для изменения состояния соответствующего по цвету светодиода. Если сейчас вставить в компьютер USB кабель от устройства или запустить программу с подключенным заранее устройством, окно программы будет выглядеть так (при запуске программы МК оба светодиода загораются):

Ниже приводится краткое описание программ проекта. C# класс SIUSBXP описанный в файле SiUSBXp.cs из пакета USBXpress состоит из определения констант и импортирует функции библиотеки в C#. Его менять не стоит. На основе этого класса создан подкласс USBDevice, наследуюший весь функционал от класса SIUSBXP и содержащийдополнительные методы, необходимые для реализации нашего устройства. Он имеет 4 собственных поля – ссылки на буферы ввода bufferIn и вывода bufferOut для коммуникации с устройством,  устанавливаемых конструктором класса, ссылку handle на само устройство, и булево поле isConnected, хранящую статус подключения устройства к компьютеру.

Помимо конструктора класс имеет 7 простых собственных методов, созданных на основе API функций библиотеки, имена которых говорят сами за себя. Это методы для подсоединения и отключения устройства (open() и close()), получения числа подключенных к компьютеру USBXpress устройств getDevices(), и получения VID и PID (getVID() и getPID()) первого устройства в списке. Предполагается, что одновременно к компьютеру будет подключено не более одного USBXpress устройства. Наконец, там-же имеются методы посылки массива байтов в устройство - sendToDevice() и запроса и приема массива из устройства – getFromDevice(). Все методы генерируют исключения (exceptions) если что-то «выйдет криво», сообщения которых показываются в окне программы в графе Status. Файл главного класса программы начинается с установки переменных vID и pID в соответствии с их значениями в программе МК. Настоящая программа устанавливает связь только с первым в списке устройством с такими параметрами. Список формируется  автоматически операционной системой. Помимо этого, в начале класса создаются буферы ввода/вывода и мониторы событий cWatcher и rWatcher для автоматического распознавания подключения и, соответственно, отключения устройства.

В конструкторе класса вызывается метод создания графического интерфейса InitializeComponent() и созданные выше мониторы настраиваются на проверку подключения  или отключения устройства каждую секунду. Кроме, того для мониторов декларируются функции обработчиков их прерываний HandleDeviceConnect() и HandleDeviceDisconnect(), соответственно.

В конце конструктора производится проверка подключения устройства к компьютеру функцией DetectDevice. Она открывает первое устройство, обслуживаемое драйвером USBXpress и проверяет наше-ли оно по vID и pID. Если устройство наше, то производится соединение с ним. В противном случае генереруется исключение.

Функции обработчиков прерываний мониторов аналогичны и комментариев не требуют. Они также отображают статус подключения устройства в верхней части окна программы функцией getLEDstates(). Эта функция формирует и посылает в МК запрос о состоянии светодиодов и показывает эти состояния под кнопками в окне программы.

Наконец, обработчики прерываний нажатий кнопок формируют пакеты для отправки в устройство. Оба обработчика аналогичны по структуре, ниже приведен один из них. Параметер 3 метода sendToDevice() устанавливает длину передаваемого массива и возвращает число посланных успешно байтов.

Как видно все программы достаточно прозрачные по структуре и не требуют абсолютно никаких знаний из области USB. Это сильно упрощает широкое внедрение USB интерфейса во многие конструкции.



Файлы:
Архив программ


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




Как вам эта статья?

Заработало ли это устройство у вас?

36 3 1
3 0 0

Эти статьи вам тоже могут пригодиться: