Программный USB на микроконтроллерах STM8 (Часть 2)

Сегодня расскажу о коде приемника и о первом включении устройства:

Передача данных
В процессе “подключения” устройства к ПК пришлось поправить код передатчика, теперь в подпрограмму передается адрес (указатель) на массив данных.
Прием данных
К сожалению на текущий момент не удалось на лету и вырезать незначащие биты, реализовано только декодирование NRZI.
При приеме так же используются обе линии, это позволяет декодировать NRZI буквально двумя командами.
Вот краткий алгоритм работы приемника (декодера):

Использование тестового сигнала избыточно, да и проверку можно делать по другому, например декодирование и проверка конца пакета, может быть выполнено вот так:
srl a xor a,(y) tnz (y) jreq L_End_Rx
С данным кодом я работал последний раз когда пытался, все таки реализовать вырезку незначащих бит.
Важная часть в декодировании захват сигналов всегда в одно и тоже время.
К сожалению у STM8 команды могут выполнятся длительное время от 1 до 6 тактов, для устранения этого недостатка пришлось использовать один таймер.
По первому фронту сигнала запускается таймер 1, после вхождения в обработчик прерывания считывается счетный регистр и выполняется переход в перед на кол-во циклов (комманд nop).
Таким образом получается, что чем больше задержка на вход в прерывания тем дальше переход по коду.
Данный подход позволяет “удерживать” точку захвата в пределах одного такта микроконтроллера.
Это пожалуй ключевой момент, без него не возможно обеспечить начала захвата сигнала в одно и тоже время.
Вот как это выглядит на ассемблере:
_usb_rx: ldw x, #L_Delay_Begin ; адрес начала таблицы задержек addw x, 21086 ; + смещение (значение таймера) cpw x, #L_Delay_End ; проверка выхода за границу таблицы (защита!) jruge L_Error jp (x) ; переход по таблице задержек L_Error: iret ; аврийный выход L_Delay_Begin: nop nop nop nop nop nop
Прошу извинить за столь сумбурное описание реализации.
Из протокола я реализовал чтение дескриптора и то, не полностью.
Описывать его не буду, так как сам плохо понимаю, что там происходит

Исходный код проекта скачать
Внимание!!! Код СЫРОЙ, без оформления и тщательной проверки.
Код собран компилятором Cosmic версии 4.3.7, к сожалению IAR-ом не пользуюсь.
Код можете использовать без ограничений, одна только просьба ссылаться на мой сайт, ну и указывать автора, т.е. меня :)
- +10
- 22 февраля 2014, 17:28
- ZiB
- 1
Файлы в топике:
2014-02-STM8S-USB.zip
Китайцы уже тоже обратили внимание:
www.amobbs.com/thread-5585137-1-1.html
www.amobbs.com/thread-5585137-1-1.html
Комментарии (11)
RSS свернуть / развернуть