Программный USB на STM8 (Часть 2)

22 Февраля 2014 К комментариям

Продолжаем описание программного USB на базе микроконтроллеров STM8 (первая часть читать).

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

image

Передача данных

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

Прием данных

К сожалению на текущий момент не удалось на лету и вырезать незначащие биты, реализовано только декодирование NRZI.

При приеме так же используются обе линии, это позволяет декодировать NRZI буквально двумя командами.

Вот краткий алгоритм работы приемника (декодера):

2014-02-22-Блок-схема-алгоритма-приема

Использование тестового сигнала избыточно, да и проверку можно делать по другому, например декодирование и проверка конца пакета, может быть выполнено вот так:

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

Прошу извинить за столь сумбурное описание реализации.

Из протокола я реализовал чтение дескриптора и то, не полностью.

Описывать его не буду, так как сам плохо понимаю, что там происходит Улыбка

Записал небольшой видеоролик с подключением тестового устройства к ПК:


Исходный код

Скачать [2014-02-STM8S-USB.zip]

Внимание!!! Код СЫРОЙ, без оформления и тщательной проверки.

Код собран компилятором Cosmic версии 4.3.7, к сожалению IAR-ом не пользуюсь.

Код можете использовать без ограничений, одна только просьба ссылаться на данный сайт, ну и указывать автора, т.е. меня Улыбка

Будут вопросы пишите, форма обратной связи в меню сайта (см. выше).



comments powered by Disqus