пятница, 9 января 2015 г.

Урок 5. USB. Сторона контроллера (обновлено 25.04.2015)

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

Найдена ошибка. В старом проекте для грамотной работы под бутлоадер нужно было указать --CODEOFFSET=1000 в настройках проекта. XC8 global options->additional opptions. Спасибо Глебу Галиеву. 

Это переработанная статья. В ней используется пакет MPLABX и компилятор XC8. Старую статью можно найти здесь. 
Все, теперь добрались мы до чего-то интересного. Протокол USB.
Наша схема будет аналогична приведенной в уроке 3 про бутлоадер.
Я проверял на PIC18f2550 но и на PIC18f4550 должно бы работать.


Только еще пару ножек контроллера мы будем использовать, как датчики, чтобы проверить, правда ли все у нас работает.
Файл проекта: Ссылка
Здесь вы найдете сам проект для MPLABX и программы для компьютера, через которые идет общение с USB устройством.

ВАЖНО! Проект собран для работы с бутлоадером. Если вы прошиваете через программатор, то необходимо сделать следующее: удалите строку в File->project properties->XC8 global options->additional options. Она задает смещение кода для бутлоадера.

Этот пример - копия с hid - custom demo из пакета MLA. Поскольку в оригинале он обращался к библиотекам через относительный путь как ../../../../Microchip/usb и.т.д. То для быстрой работы надо установить MLA и положить проект так же как примеры. В тот же каталог. Внизу статьи написано как запустить оригинальный файл. В моем варианте удалены все файлы, которые не относятся к нашему контроллеру, добавлены комментарии. Переделан немного код, для того, чтобы он запускался для обоих контроллеров: 2550 и 4550. и USB библиотека и некоторые настройки контроллера перенесены в папку проекта.
Контроллер наш, поскольку имеет аппаратную поддержку протокола USB имеет в своей памяти определенные места, в которые нужно записать настройки usb. это первый главный момент. В основном все это находится в файле usb_descriptors.c. Вы можете открыть этот файл и посмотреть комментарии или даже отредактировать.
И в теле программы мы будем вызывать функцию USBDeviceTasks(), которая выполняет в общем-то всю работу по обмену информации через USB.
Плюс, нужно определить некоторые стандартные функции, которые вызываются при получении нашим устройством различных команд, в момент подключения к хосту например. без них, устройство так и не сможет обнаружиться. Эти команды находятся в функции USER_USB_CALLBACK_EVENT_HANDLER файла main.c и особенно здесь не рассматриваются, так как они осуществляют рутинную стандартную работу и вы будете вряд ли их менять.
На данный момент библиотека работает следующим образом:

Функция USBDeviceTasks()

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

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

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

Файлы adc.c leds.c button.c

В этих файлах находятся простенькие функции, как например, мигнуть светодиодом, считать АЦП, проверить, нажата ли кнопка.

Файл app_device_custom_hid

В этом файле находится функция UserHIDTasks(), которая собственно и делает всю работу. Мы ее вызываем из основного цикла файла main.c. Вся обработка команд от хоста происходит в этой функции. И все действия - тоже через нее.

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

Напоминаю, что USB устройство может передать данные только по запросу с хоста.
В проекте, который залит сюда, указан сдвиг для работы с bootloader'ом. Для того чтобы его убрать - удалите строку в File->project properties->XC8 global options->additional options. Она задает смещение кода для бутлоадера.

Суть такая: у нас есть наш функции и функции usb библиотеки. Сначала в main.c происходит инициализация, потом просто крутится главный цикл программы. Через него все и работает. Через прерывания вызывается USBDeviceTasks(). Контроллер через модуль USB получает информацию от хоста (компьютера), и тот "просит" контроллер сделать то или иное действие. переключить светодиод, или отправить какую-то информацию. Если мы отправляем информацию, то она кладется в буфер, и уходит со следующим USBDeviceTasks().

Для того, чтобы проверить работу контроллера, запускайте любую из программ в приложенном файле. 
В следующем уроке мы будем рассматривать как раз эту программу для компьютера, которая пересылает информацию контроллеру. То есть USB интерфейс на стороне компьютера.

Оригинальный проект из MLA

Вот как собрать оригинальный проект. Но я надеюсь, что вам хватит и моего проекта, вверху этой страницы
Нам понадобится пакет Microchip Libraries for Applications (MLA) Ссылка зеркало
Качаем этот файл и устанавливаем.
Мы будем собирать пример HID - custom demo
лежит он в папке с установленной программой:
\microchip\mla\v2014_07_22\apps\USB\Device\HID - Custom\firmware
Внутри в папке firmware - прошивка для контроллера. В остальных - программы для компьютера.
Дело в том, что в Microchip libraries каждый проект создан для десятка разных контроллеров, и учиться на этом коде довольно проблематично. В проекте есть несколько настроек для разных контроллеров. выбираются эти настройки через File->Project properties->Manage configurations
 Изначально из наших контроллеров там присутствует только pic18f4550 и для этого нужно открыть настройку проекта PICDEM FSUSB.mcp
Это по идее для такой учебной платы picdem fsusb. Она как раз работает на контроллере pic18f4550.
Распиновка там другая. Вы увидите в таких файлах как led.c button.c. Я специально поменял используемые ножки контроллера, чтобы программа запускалась не только на pic18f4550 но и на 18f2550.
Если у вас именно 18f2550, то в настройках проекта можно поменять контроллер с pic18f4550 на 2550.
Все файлы настроек лежат в папках проекта, например, system_config\picdem_fusb

Комментариев нет:

Отправить комментарий