Полная версия этой страницы:
передача по USB в C8051F320
Делал фирмвары для C8051F320 на основе примеров от Силаба, всё работало. Решил немного углубить знания - поэкспериментировать. Взял пример для Bulk , просто поменял местами эндпойнты 1 и 2 для In - Out, поставил массив из 8 байтов на передачу. И ничего не работает. Компьютер видит контроллер, а ничего не принимает.
1. Где может быть засада?
2. Как можно проверить , кто виноват - фирмвара или некорректная программа приёма?
3. Каков вообще порядок прерываний при передаче по УСБ. Т.е. какие флаги в каком порядке выставляются.
Вопросы быть может тупые, но прошу ответить подробно, а не типа "читай описание", т.к. мозги переклинило, может, я что-то понял не так.
DpInRock
Dec 1 2012, 09:13
Цитата
Делал фирмвары для C8051F320 на основе примеров от Силаба,
НЕ делал, а использовал готовое.
Вот тогда все становится на свои места.
USB сам по себе достаточно сложный протокол. И пересказывать его вряд ли кто будет.
Вернее, не будет никто.
редактор
Dec 3 2012, 07:35
Если поменяли местами EndPoints в прошивке, то скорее всего, надо то же самое сделать и в программе ПК. Она ведь о ваших экспериментах не знает.
Спасибо, значит я не совсем правильно понял этот момент работы шины. Считал, что при перемене местами эндпойнтов, хост автоматом перейдёт на приём данных с того эндпойнта, который передаст фирмвара при инициализации.
Вообще, я неграмотно сформулировал начальный вопрос. Меня интересует работа на самом низком уровне - порядок выставления флагов, прерываний и подобное. Например, после записи в фифо надо программно установить бит INPRDY. После передачи пакета байтов бит сбрасывается аппаратно, вырабатывается прерывание и можно записывать новый пакет. А вот можно ли организовать передачу вообще без использования прерывания? Если, например, у меня достаточно медленный процесс, так что данные я могу "вталкивать" в фифо в основном теле программы. Тогда я могу избавиться от большого модуля, описывающего обработку прерываний. И программа меньше, и головной боли тоже.
kovigor
Dec 3 2012, 16:51
Цитата(NikP @ Dec 3 2012, 19:32)

А вот можно ли организовать передачу вообще без использования прерывания? Если, например, у меня достаточно медленный процесс, так что данные я могу "вталкивать" в фифо в основном теле программы. Тогда я могу избавиться от большого модуля, описывающего обработку прерываний. И программа меньше, и головной боли тоже.
Можно, но вот нужно ли ? Заметьте, поставляемые с тем же Кейлом (уверен - и с ИАРом тоже) примеры (для ARM) сделаны как раз на основе прерываний, в результате исходники, возможно, чуть усложняются, но в них вполне можно разобраться, и при необходимости проект можно достаточно легко модифицировать. Отказываться от использования прерываний не следует.
Для справки: примеры работы с USB для AT89C5131 построены без использования прерываний, этим путем достигается очень незначительное упрощение текста программы, но приспособить эти примеры под свои нужды заметно сложнее, и работать с ними неудобно ...
редактор
Dec 4 2012, 06:46
после того, как вы установили бит INPRDY, то есть сказали что данные готовы, точка начнет их отправку наверх, в хост.
Без установки этого бита, сколько бы в фифо не запихнули, данные не отправятся.
После того как МК пройдет идентификацию у хоста, можно запретить прерывания и работать по опросу.Но суть останется таже. Опросить флаги, принять решение кого обрабатывать.
Так, с фирмварой вроде более-менее понятно. Т.е. данные записали в фифо относящейся к эндпойнт , работающей на передачу (самый простой вариант), выставили флаг- контроллер передал, флаг сбросил. С приёмом наоборот. Контроллер принял, выставил флаг, прочитали- флаг сбросили. Теперь дальше. Что делает драйвер? Т.е. как формируются потоки (pipe). Ведь передача данных в хост может вестись из разных ЕР, значит, где-то они формируются (описываются). Далее, как осуществляется взаимодействие программы в хосте и драйвера. Я понял, что потоки описываются в драйвере - при написании драйвера должно быть указано, какие ЕР что делают (приём-передача). Или же там просто указывается, сколько потоков формируется при работе устройства, а при инициализации это конкркетизируется ? Теперь, хост при обращении к драйверу должен указывать, из какого потока идёт чтение, а через какой идёт запись? Я это веду к началу темы. После смены номеров ЕР на приём-передачу, у нас драйвер фирмвару видит, а программа упорно ничего читать не хочет. Хочу понять, что не учли и где- в драйвере или в программе хоста.
При ответе прошу учесть, что мне просто ничего толкового по этой теме не попалось, если кто может дать ссылку, где это толково и подробно описано - буду весьма признателен.
редактор
Dec 10 2012, 06:41
Пример делали на базе Силабовских библиотек, (софт ПиСи тоже). Силабс поставляет свой драйвер и библиотеку (DLL) для стыковки драйвера и ПО пользователя. Смотрите описание библиотеки.
Скорее всего все параметры связи (номер точки, тип передачи, размер данных) передаются соответствующим функциям чтения и записи. А эти функции уже транслируют все в драйвер. Таким образом именно ПО пользователя должно определять
Цитата
какие ЕР что делают (приём-передача)
.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.