|
передача по USB в C8051F320, на элементарном уровне |
|
|
|
Nov 30 2012, 13:06
|
Частый гость
 
Группа: Участник
Сообщений: 168
Регистрация: 25-08-05
Пользователь №: 7 944

|
Делал фирмвары для C8051F320 на основе примеров от Силаба, всё работало. Решил немного углубить знания - поэкспериментировать. Взял пример для Bulk , просто поменял местами эндпойнты 1 и 2 для In - Out, поставил массив из 8 байтов на передачу. И ничего не работает. Компьютер видит контроллер, а ничего не принимает. 1. Где может быть засада? 2. Как можно проверить , кто виноват - фирмвара или некорректная программа приёма? 3. Каков вообще порядок прерываний при передаче по УСБ. Т.е. какие флаги в каком порядке выставляются. Вопросы быть может тупые, но прошу ответить подробно, а не типа "читай описание", т.к. мозги переклинило, может, я что-то понял не так.
|
|
|
|
|
 |
Ответов
(1 - 7)
|
Dec 1 2012, 09:13
|

Гуру
     
Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515

|
Цитата Делал фирмвары для C8051F320 на основе примеров от Силаба, НЕ делал, а использовал готовое. Вот тогда все становится на свои места. USB сам по себе достаточно сложный протокол. И пересказывать его вряд ли кто будет. Вернее, не будет никто.
--------------------
On the road again (Canned Heat)
|
|
|
|
|
Dec 3 2012, 16:32
|
Частый гость
 
Группа: Участник
Сообщений: 168
Регистрация: 25-08-05
Пользователь №: 7 944

|
Спасибо, значит я не совсем правильно понял этот момент работы шины. Считал, что при перемене местами эндпойнтов, хост автоматом перейдёт на приём данных с того эндпойнта, который передаст фирмвара при инициализации. Вообще, я неграмотно сформулировал начальный вопрос. Меня интересует работа на самом низком уровне - порядок выставления флагов, прерываний и подобное. Например, после записи в фифо надо программно установить бит INPRDY. После передачи пакета байтов бит сбрасывается аппаратно, вырабатывается прерывание и можно записывать новый пакет. А вот можно ли организовать передачу вообще без использования прерывания? Если, например, у меня достаточно медленный процесс, так что данные я могу "вталкивать" в фифо в основном теле программы. Тогда я могу избавиться от большого модуля, описывающего обработку прерываний. И программа меньше, и головной боли тоже.
|
|
|
|
|
Dec 3 2012, 16:51
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(NikP @ Dec 3 2012, 19:32)  А вот можно ли организовать передачу вообще без использования прерывания? Если, например, у меня достаточно медленный процесс, так что данные я могу "вталкивать" в фифо в основном теле программы. Тогда я могу избавиться от большого модуля, описывающего обработку прерываний. И программа меньше, и головной боли тоже. Можно, но вот нужно ли ? Заметьте, поставляемые с тем же Кейлом (уверен - и с ИАРом тоже) примеры (для ARM) сделаны как раз на основе прерываний, в результате исходники, возможно, чуть усложняются, но в них вполне можно разобраться, и при необходимости проект можно достаточно легко модифицировать. Отказываться от использования прерываний не следует. Для справки: примеры работы с USB для AT89C5131 построены без использования прерываний, этим путем достигается очень незначительное упрощение текста программы, но приспособить эти примеры под свои нужды заметно сложнее, и работать с ними неудобно ...
|
|
|
|
|
Dec 9 2012, 16:03
|
Частый гость
 
Группа: Участник
Сообщений: 168
Регистрация: 25-08-05
Пользователь №: 7 944

|
Так, с фирмварой вроде более-менее понятно. Т.е. данные записали в фифо относящейся к эндпойнт , работающей на передачу (самый простой вариант), выставили флаг- контроллер передал, флаг сбросил. С приёмом наоборот. Контроллер принял, выставил флаг, прочитали- флаг сбросили. Теперь дальше. Что делает драйвер? Т.е. как формируются потоки (pipe). Ведь передача данных в хост может вестись из разных ЕР, значит, где-то они формируются (описываются). Далее, как осуществляется взаимодействие программы в хосте и драйвера. Я понял, что потоки описываются в драйвере - при написании драйвера должно быть указано, какие ЕР что делают (приём-передача). Или же там просто указывается, сколько потоков формируется при работе устройства, а при инициализации это конкркетизируется ? Теперь, хост при обращении к драйверу должен указывать, из какого потока идёт чтение, а через какой идёт запись? Я это веду к началу темы. После смены номеров ЕР на приём-передачу, у нас драйвер фирмвару видит, а программа упорно ничего читать не хочет. Хочу понять, что не учли и где- в драйвере или в программе хоста. При ответе прошу учесть, что мне просто ничего толкового по этой теме не попалось, если кто может дать ссылку, где это толково и подробно описано - буду весьма признателен.
|
|
|
|
|
Dec 10 2012, 06:41
|
Местный
  
Группа: Участник
Сообщений: 356
Регистрация: 9-06-07
Пользователь №: 28 315

|
Пример делали на базе Силабовских библиотек, (софт ПиСи тоже). Силабс поставляет свой драйвер и библиотеку (DLL) для стыковки драйвера и ПО пользователя. Смотрите описание библиотеки. Скорее всего все параметры связи (номер точки, тип передачи, размер данных) передаются соответствующим функциям чтения и записи. А эти функции уже транслируют все в драйвер. Таким образом именно ПО пользователя должно определять Цитата какие ЕР что делают (приём-передача) .
--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|