NikP 0 30 ноября, 2012 Опубликовано 30 ноября, 2012 · Жалоба Делал фирмвары для C8051F320 на основе примеров от Силаба, всё работало. Решил немного углубить знания - поэкспериментировать. Взял пример для Bulk , просто поменял местами эндпойнты 1 и 2 для In - Out, поставил массив из 8 байтов на передачу. И ничего не работает. Компьютер видит контроллер, а ничего не принимает. 1. Где может быть засада? 2. Как можно проверить , кто виноват - фирмвара или некорректная программа приёма? 3. Каков вообще порядок прерываний при передаче по УСБ. Т.е. какие флаги в каком порядке выставляются. Вопросы быть может тупые, но прошу ответить подробно, а не типа "читай описание", т.к. мозги переклинило, может, я что-то понял не так. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DpInRock 0 1 декабря, 2012 Опубликовано 1 декабря, 2012 · Жалоба Делал фирмвары для C8051F320 на основе примеров от Силаба, НЕ делал, а использовал готовое. Вот тогда все становится на свои места. USB сам по себе достаточно сложный протокол. И пересказывать его вряд ли кто будет. Вернее, не будет никто. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Edit2007 3 3 декабря, 2012 Опубликовано 3 декабря, 2012 · Жалоба Если поменяли местами EndPoints в прошивке, то скорее всего, надо то же самое сделать и в программе ПК. Она ведь о ваших экспериментах не знает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NikP 0 3 декабря, 2012 Опубликовано 3 декабря, 2012 · Жалоба Спасибо, значит я не совсем правильно понял этот момент работы шины. Считал, что при перемене местами эндпойнтов, хост автоматом перейдёт на приём данных с того эндпойнта, который передаст фирмвара при инициализации. Вообще, я неграмотно сформулировал начальный вопрос. Меня интересует работа на самом низком уровне - порядок выставления флагов, прерываний и подобное. Например, после записи в фифо надо программно установить бит INPRDY. После передачи пакета байтов бит сбрасывается аппаратно, вырабатывается прерывание и можно записывать новый пакет. А вот можно ли организовать передачу вообще без использования прерывания? Если, например, у меня достаточно медленный процесс, так что данные я могу "вталкивать" в фифо в основном теле программы. Тогда я могу избавиться от большого модуля, описывающего обработку прерываний. И программа меньше, и головной боли тоже. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kovigor 6 3 декабря, 2012 Опубликовано 3 декабря, 2012 · Жалоба А вот можно ли организовать передачу вообще без использования прерывания? Если, например, у меня достаточно медленный процесс, так что данные я могу "вталкивать" в фифо в основном теле программы. Тогда я могу избавиться от большого модуля, описывающего обработку прерываний. И программа меньше, и головной боли тоже. Можно, но вот нужно ли ? Заметьте, поставляемые с тем же Кейлом (уверен - и с ИАРом тоже) примеры (для ARM) сделаны как раз на основе прерываний, в результате исходники, возможно, чуть усложняются, но в них вполне можно разобраться, и при необходимости проект можно достаточно легко модифицировать. Отказываться от использования прерываний не следует. Для справки: примеры работы с USB для AT89C5131 построены без использования прерываний, этим путем достигается очень незначительное упрощение текста программы, но приспособить эти примеры под свои нужды заметно сложнее, и работать с ними неудобно ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Edit2007 3 4 декабря, 2012 Опубликовано 4 декабря, 2012 · Жалоба после того, как вы установили бит INPRDY, то есть сказали что данные готовы, точка начнет их отправку наверх, в хост. Без установки этого бита, сколько бы в фифо не запихнули, данные не отправятся. После того как МК пройдет идентификацию у хоста, можно запретить прерывания и работать по опросу.Но суть останется таже. Опросить флаги, принять решение кого обрабатывать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NikP 0 9 декабря, 2012 Опубликовано 9 декабря, 2012 · Жалоба Так, с фирмварой вроде более-менее понятно. Т.е. данные записали в фифо относящейся к эндпойнт , работающей на передачу (самый простой вариант), выставили флаг- контроллер передал, флаг сбросил. С приёмом наоборот. Контроллер принял, выставил флаг, прочитали- флаг сбросили. Теперь дальше. Что делает драйвер? Т.е. как формируются потоки (pipe). Ведь передача данных в хост может вестись из разных ЕР, значит, где-то они формируются (описываются). Далее, как осуществляется взаимодействие программы в хосте и драйвера. Я понял, что потоки описываются в драйвере - при написании драйвера должно быть указано, какие ЕР что делают (приём-передача). Или же там просто указывается, сколько потоков формируется при работе устройства, а при инициализации это конкркетизируется ? Теперь, хост при обращении к драйверу должен указывать, из какого потока идёт чтение, а через какой идёт запись? Я это веду к началу темы. После смены номеров ЕР на приём-передачу, у нас драйвер фирмвару видит, а программа упорно ничего читать не хочет. Хочу понять, что не учли и где- в драйвере или в программе хоста. При ответе прошу учесть, что мне просто ничего толкового по этой теме не попалось, если кто может дать ссылку, где это толково и подробно описано - буду весьма признателен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Edit2007 3 10 декабря, 2012 Опубликовано 10 декабря, 2012 · Жалоба Пример делали на базе Силабовских библиотек, (софт ПиСи тоже). Силабс поставляет свой драйвер и библиотеку (DLL) для стыковки драйвера и ПО пользователя. Смотрите описание библиотеки. Скорее всего все параметры связи (номер точки, тип передачи, размер данных) передаются соответствующим функциям чтения и записи. А эти функции уже транслируют все в драйвер. Таким образом именно ПО пользователя должно определять какие ЕР что делают (приём-передача). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться