вторник, 20 августа 2013 г.

Урок 5. USB. Сторона контроллера

<< Назад к оглавлению

ВНИМАНИЕ!!! ЭТО УСТАРЕВШАЯ СТАТЬЯ. НОВАЯ ЗДЕСЬ

Все, теперь добрались мы до чего-то интересного. Протокол USB.
Наша схема будет аналогична приведенной в уроке 3 про бутлоадер. Только еще пару ножек контроллера мы будем использовать, как датчики, чтобы проверить, правда ли все у нас работает.
Нам понадобится пакет Microchip Libraries for applications ссылка Зеркало
(на данный момент актуальная версия v2013-06-15)
Качаем этот файл и устанавливаем. Для компиляции проекта нам понадобятся эти библиотеки.
Мы будем собирать пример HID - custom demos
лежит он в папке с установленной программой:
\microchip_solutions_v2013-06-15\USB\Device - HID - Custom Demos\
Внутри в папке firmware - прошивка для контроллера. В остальных - программы для компьютера.
Дело в том, что в Microchip libraries каждый проект создан для десятка разных контроллеров, и учиться на этом коде довольно проблематично. Он очень громоздкий и не последовательный.
Страница кода одна и та же, но в зависимости от того, какой проект вы откроете, для такого контроллера и будет создаваться прошивка. Изначально из наших контроллеров там присутствует только pic18f4550 и для этого нужно открыть файл проекта USB Device - HID - Simple Custom Demo - C18 - PICDEM FSUSB.mcp
Это по идее для такой учебной платы picdem fsusb. Она как раз работает на контроллере pic18f4550.
Я для удобства восприятия удалил "лишний" код, необходимый для настройки других контроллеров и чуть изменил программу, чтобы она корректно работала под pic18f2550 ссылка. Для того, чтобы программа работала, архив нужно распаковать в
\microchip_solutions_v2013-06-15\USB\Device - HID - Custom Demos\любойкаталог
, поскольку пути к библиотекам прописаны относительно к текущему каталогу.
Не дурно бы было почитать документацию к USB библиотеке. Но почему-то microchip уже давно не выпускает новый нормальный user guide. Придется воспользоваться старым. Тем не менее он даст нам идею, как работает библиотека.
лежит он по адресу ссылка  зеркало
Этот файл за 2007 год! Так что уже многие функции библиотеки даже называются по-другому.
Примерно философия работы следующая:
Контроллер наш, поскольку имеет аппаратную поддержку протокола USB имеет в своей памяти определенные места, в которые нужно записать настройки usb. это первый главный момент. В основном все это находится в файле usb_descriptors.c. Вы можете открыть этот файл и посмотреть комментарии или даже отредактировать.
Потом, важно грамотно настроить биты конфигурации. И в теле программы мы будем вызывать функцию USBDeviceTasks(), которая выполняет в общем-то всю работу по обмену информации через USB.
Плюс, нужно определить некоторые стандартные функции, которые вызываются при получении нашим устройством различных команд, в момент подключения к хосту например. без них, устройство так и не сможет обнаружиться. Эти команды находятся в самом низу файла main.c и особенно здесь не рассматриваются, так как они осуществляют рутинную стандартную работу и вы будете вряд ли их менять.
На данный момент библиотека работает следующим образом:

Функция USBDeviceTasks()

Для того, чтобы поддерживать работу USB, когда хост обращается к устройству с сообщением, в течение определенного времени устройство должно дать ответ. В случае, если это не происходит, хост может просто отключить наше устройство, посчитав его сломанным.
Чтобы обработать usb сообщение и выслать ответ, нужно вызвать функцию этой библиотеки:
USBDeviceTasks(); ну и чтобы отправилось правильное сообщение надо подготовить буферы вывода и прочее.
В нашем примере мы просто циклически будем вызывать эту функцию. Есть и другой выбор: для того, чтобы вовремя давать ответ хосту, можно использовать прерывания, но я опишу это потом, если будет время.
Если мы просто периодически вызываем функцию USBDeviceTasks(), то обычно ее надо вызывать не реже, чем 1.8мс. Иногда бывают исключения из этого правила. Смотри комментарии usb_device.c для тог, чтобы узнать, что это за исключения.
Обычно вызвать USBDeviceTask() не требует много времени. Около 100 тактов процессора.

USB дескрипторы

Для корректной работы нашего устройства нужно будет задать USB дескрипторы. В общем-то это описание нашего устройства. Они содерждат класс устройства, в нашем случае это - HID (Human Interface Device, которым могут быть мышки, клавиатуры, или вообще любое устройство) и имя устройства. Все эти параметры заданы в файле usb_descriptors.c, который уже добавлен в проект. Перед началом работы хост с устройством обмениваются дескрипторами, это дает понять, каким образом будет осуществляться взаимодействие устройств.

Hardware profile

Файл hardware profile содержит информацию о том, какой контроллер или плату мы используем. Плюсо к нему microchip обычно добавляет файл конкретного контроллера. Например HardwareProfile - PICDEM FSUSB.h. В этом файле хранятся различные функции и адреса, связанные с аппаратной частью контроллера. Например, функция инициализации АЦП. В ней непосредственно указано, какое значение должно быть присвоено регистрам АЦП и на какую ножку будет подаваться напряжение.

Комментарии к программе

Все основные комментарии приведены мной в коде в файле main.c. Здесь лишь пара слов.
Когда мы открываем проект, перед нами будет следующий набор файлов:
lkr файл - файл линковщика. Он говорит о том, как и которую память можно использовать.
Плюс некоторые настройки usb протокола задаются в файле usb_config.h
На мой взгляд это дерево файлов и логика - далеко не идеальные, но это то, что предлагает microchip.
Далее логика работы программы сохранена, чтобы разобравшись с этой программой вам было легче понять другой похожий пример от microchip.
Основные функции программы:
void YourHighPriorityISRCode() - прерывание высокого уровня
void YourLowPriorityISRCode() - прерывание низкого уровня
void main(void) - главная функция
static void InitializeSystem(void) - инициализация контроллера (задание настроек)
void UserInit(void) - то же самое
void ProcessIO(void) - тело программы, где происходит вся обработка и расчеты
WORD_VAL ReadPOT(void) - функция вызова Аналого Цифрового Преобразователя
Далее будем рассматривать файл main.c, в котором находится наш исполняемый код. это сделано в самом файле в комментариях. 

проект для контроллеров pic18f4550 и pic18f2550 ссылка
Здесь для поддержки USB интерфейса используются прерывания.
Так же выкладываю проект, где еще больше кода удалено, чтобы дать идею, как программа работает. Здесь прерывания не используются, а просто периодически вызывается функция поддержки usb интерфейса.
Уменьшенный вариант: ссылка
Проект обязательно нужно распаковать в папку 
\microchip_solutions_v2013-06-15\USB\Device - HID - Custom Demos\любойкаталог
потому что там довольно жестко задаются пути к библиотекам
Этот проект работает с обоими контроллерами (только что проверил) с бутлоадером и без него.
Для того, чтобы проверить, работает ли наш пример, запускаем утилитку 
\microchip_solutions_v2013-06-15\USB\Device - HID - Custom Demos\HID PnP Demo.exe
она должна найти ваш контроллер.
В следующем уроке мы будем рассматривать как раз эту программу для компьютера, которая пересылает информацию контроллеру. То есть USB интерфейс на стороне компьютера.