Раньше все никак руки не доходили. Попробую развивать тему по мере возможностей.
Итак, кто хотел дешевых интерфейсов с РС и устал моргать диодиками на мощных современных камнях, пришла пора попробовать на зуб USB. Для начала самый простой вариант - USB HID. В данной библиотеке предусмотрена передача пакета данных длинной от 1 до 64 байт с периодом от 1 до 1000мс.
Сразу забегу вперед. Инициатором передачи всегда является хост. В нашем случае это РС. Т.е. при подключении хост запрашивает конфигурации и репорты от нашего устройства. Библиотека только распознает принятый пакет и отвечает на него нужным репортом. Можно особо не вдаваться в смысл как именно это все работает и сразу приступить к передаче данных на хост. Для того мы тут и собрались. Вопросы будут потом.
Итак, качаем проект во вложении (под Keil) и адаптируем его под свое железо. А именно:
- Тип процессора
- Частота кварца
- Нога, которая включит нам подтяжку 1.5к на линию USBDP.
По первому пункту вопросов быть не должно. Для 103их просто сменить тип камня в конфигурации проекта.
Частота кварца - вопрос не простой. У меня кварц 16 МГц. У вас, вероятнее всего, 8 МГц. В файле STM32_Init воспольуемся wizard'ом и в параметрах тактирования изменим HSE Devider для PLL на 1 вместо 1/2. Проц заработает на частоте 72МГц, USB на частоте 48МГЦ. Возможны небольшие вариации с частотой проца, но частота USB должна быть именно такой.
Далее нога USB ON. Я не стал использовать pnp транзистор для включения PULL UP и просто завел через резистор 1.5к с первой попавшейся свободной ноги подпитку для USBDP. Поэтому сигнал USBON у меня положительный. В вашем случае, возможно, его придется инвертировать.
Далее вероятнее всего проект заработает. Что с ним делать?
Открываем файл usbcfg.h и видим привычный нам wizard (Dosicus!!! Wizard - не SPL
![Прикольно](images/smilies/icon_wink3.gif)
Это именно та причина, по которой я пользую Keil. У меня половина проектов на визардах. Это удобно, наглядно и очень красиво
![Очень смешно](images/smilies/icon_veryhappy.gif)
)
Там мы можем изменить размер репорта, если 4 байта в пакете для вас не удобная цифра. В данном случае измерялась температура. 4 байта ее прекрасно переправляли на хост (2 байта на номер измерения и 2 байта само значение).
После всего проделанного у вас в
main.c заработают две процедуры:
void GetReportToPC (void)
и
void ReportFromPCHandle (void)
Первая будет вызываться тогда, когда хост захочет получить с вас репорт. Т.е. в данном случае ваши 4 байта. Закоменнтированная процедура передаст только угрожающее слово "HELL". Остальные байты будут пропущены.
Вторая процедура тогда, когда хост что-то вам передаст. Т.е. это обработчик входящей информации. Не стоит затягивать с выполнением этой процедуры. Лучше положить данные в буфер приема, поднять флаг и позже спокойно обработать данные в теле программы.
Данные от хоста будут размещаться в массиве EP0Buf[USB_MAX_PACKET0], где USB_MAX_PACKET0 - размер репорта, о котором я говорил ранее.
Проверить ваше устройство и покидать туда-сюда пакеты с данными можно в привычном консольном режиме с помощью утилиты от MikroE.
Для этого качаем второе вложение
Hid Terminal.rar
На этом пока все. На вопросы постараюсь ответить. В личку долбить не надо, если вы не Dosicus или не Крамольенович.