Hello USB World 2 (или отпуск был вполне продуктивным)

Jun 12, 2014 22:12

Продолжаю издеваться над Атмега32 девелопмент бордой. Хотя, помоему, это она надо мной издевается. Цель: покорить USB. Конкретнее, научиться передавать дебажные сообщения с железяки на комп.

Традиционно для этого используют UART (в простонародии СОМ-порт), но это как то не спортивно в 2014 году юзать интерфейс сорокалетней давности. К тому же ЮСБ побыстрее будет.

В целом у меня это получилось, хотя на это ушло почти полторы недели. Думал все с наскоку получится. ЮСБ зараза жутко заумный протокол. Ошибся в одном байте - пол дня дебага обеспечено. Неверно понял спецификацию - потерял день. А уж на комбинации разных факторов можно и на неделю залипнуть.





Спасибо пацанам, которые порекомендовали отлаживаться на заводской борде, а не на собственной поделке. Тут и так теория совмещается с практикой (в смысле ничего не работает и никто не знает почему (С) анекдот), так хотя бы на железку грешить не приходится.

К тому же на борде имеются пару-восемь светодиодов. Дебажится на лампочках это то еще удовольствие, но всяко лучше чем совсем ничего. Например на стороне хоста вроде и дебаггер есть, и все делаешь как надо, но в ответ только какой нибудь GENERAL_FAILURE и сиди думай что не так. Благо процесс дебага выглядит примерно так :)



К сожалению уперся в ограничения USB для low-speed устройств. Хотя заявлено 1.5 МБит/с, реальная скорость получается не айс. И дело даже не в пропускной способности шины, а в количестве сообщений с секунду, которые могут быть инициированы со стороны устройства. Я выжал 127 пакетов в секунду (примерно один пакет в 8мс - это даже круче чем по спецификации - там минимум 10мс).

Размер пакета на скорость не влияет. В моем случае пакет в 64 байта дает скорость 8кб/с (64 кБит/с), что не на много больше 38400 через СОМ. Но, наверное. на практике для отсылки дебажных сообщений количество пакетов все таки важнее, чем их размер. Впрочем, наверное это не сложно обойти реализовав какой нибудь накопительный буффер.

Если задаться целью переслать просто большой кусок данных, то это даже проще. Главное что бы передачу инициировал хост, а направление пересылки данных не важно. Мне удалось прокачать 24кБайт/с (192 кБит/с)

Почему не заявленые 1.5МБита? А кто его знает. Во-первых ЮСБ 1.1 это полудуплекс, а значит часть времени занято пересылкой данных в обратном направлени. Во-вторых на той же шине сидят и другие устройства, в-третьих по шине бегают и другие (служебные) сообщения. А может я просто выжал максимум из вычислительных способностей атмеги :)

UPDATE: Похоже 24кб/с это какой то практический потолок, в который не только я упираюсь. Если честно, лень разбираться чем он обусловлен.

UPDATE 2: Наполнил "смыслом" все 8кб/с инициируемых железякой. Т.е. пакетов в секунду по прежнему 127, только каждый пакет наполнен под завязку полезными байтами. Например сообщений "Test" (4 байта текст + 1 байт нулевой) влазит аж 1600. Короче смело можно для дебага использовать.

программирование, электроника

Previous post Next post
Up