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

Продолжаем описание программного 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


 

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

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

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

Исходный код проекта скачать

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

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



Код можете использовать без ограничений, одна только просьба ссылаться на мой сайт, ну и указывать автора, т.е. меня :)
  • +10
  • 22 февраля 2014, 17:28
  • ZiB
  • 1
Файлы в топике: 2014-02-STM8S-USB.zip

Комментарии (11)

RSS свернуть / развернуть
Классно, а возможно такое в IAR-е сделать, частично с сишным кодом?
0
Я думаю можно, наверное только асм подправить под стилистику IAR-а, но тут я не силен к сожалению.
0
А почему бы не приаттачить код к топику? Да и видео сюда вполне можно вставить.
0
  • avatar
  • Vga
  • 22 февраля 2014, 18:24
Видео не знаю, как :(
0
Сделано :)
0
Еще ссылки на первую часть и «скачать» желательно перенаправить на местную копию и на приаттаченный файл соответственно.
0
сделано :)
0
Свершилось чудо!!! Это фантастика! Этого так долго ждали! :)

ZiB, я готов внести Донейт, скажи куда и как! Можно в ЛС, а лучше по почте.

Azzzooo@gmail.com
0
Там до усб ещё пилить и пилить, я только показал возможность реализации.
0
Китайцы уже тоже обратили внимание:
www.amobbs.com/thread-5585137-1-1.html
0
Да, они уже давно меня заваливают сообщениями. Но похоже ни кто из них не смог запустить :( Хотя я просил двух не зависимых человек проверить у себя. Проблем ни у кого не было, моя демка работала как и положено.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.