Программный USB на STM8 (Часть 2)
Продолжаем описание программного USB на базе микроконтроллеров STM8 (первая часть читать).
Сегодня расскажу о коде приемника и о первом включении устройства:
Передача данных
В процессе “подключения” устройства к ПК пришлось поправить код передатчика, теперь в подпрограмму передается адрес (указатель) на массив данных.
Прием данных
К сожалению на текущий момент не удалось на лету и вырезать незначащие биты, реализовано только декодирование NRZI.
При приеме так же используются обе линии, это позволяет декодировать NRZI буквально двумя командами.
Вот краткий алгоритм работы приемника (декодера):
Использование тестового сигнала избыточно, да и проверку можно делать по другому, например декодирование и проверка конца пакета, может быть выполнено вот так:
С данным кодом я работал последний раз когда пытался, все таки реализовать вырезку незначащих бит.
Важная часть в декодировании захват сигналов всегда в одно и тоже время.
К сожалению у STM8 команды могут выполнятся длительное время от 1 до 6 тактов, для устранения этого недостатка пришлось использовать один таймер.
По первому фронту сигнала запускается таймер 1, после вхождения в обработчик прерывания считывается счетный регистр и выполняется переход в перед на кол-во циклов (комманд nop).
Таким образом получается, что чем больше задержка на вход в прерывания тем дальше переход по коду.
Данный подход позволяет “удерживать” точку захвата в пределах одного такта микроконтроллера.
Это пожалуй ключевой момент, без него не возможно обеспечить начала захвата сигнала в одно и тоже время.
Вот как это выглядит на ассемблере:
Прошу извинить за столь сумбурное описание реализации.
Из протокола я реализовал чтение дескриптора и то, не полностью.
Описывать его не буду, так как сам плохо понимаю, что там происходит
Записал небольшой видеоролик с подключением тестового устройства к ПК:
Исходный код
Скачать [2014-02-STM8S-USB.zip]
Внимание!!! Код СЫРОЙ, без оформления и тщательной проверки.
Код собран компилятором Cosmic версии 4.3.7, к сожалению IAR-ом не пользуюсь.
Код можете использовать без ограничений, одна только просьба ссылаться на данный сайт, ну и указывать автора, т.е. меня
Будут вопросы пишите, форма обратной связи в меню сайта (см. выше).
comments powered by Disqus