реклама на сайте
подробности

 
 
> USB - AT91SAM7A3, интерфейс USB на данном девайсе
shrek
сообщение Jan 29 2009, 13:17
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



Суть проблемы состоит в том что, (слава всем Святым удалось сконфигурировать данный девайс, запустить ФАПЧ на 96 МГц, контроллер прерываний!!! и прочие нужные настройки, обеспечивающие нормальное функционирование контроллера) когда я на этой платке подключаю (благо есть возможность) с помощью ноги PB1 резистор подтягивающий шину D+ к +3,3 вольтам комп мне присылает запрос в виде набора байтов.
Конкретно 80 06 00 01 00 00 40 00 3E FC C3 0D C1 B8 69 2E.
Возникает вопрос как обработать данную последовательность байтов?...
Обратился к источнику "Агуров Интерфейс USB практика использования и программирования".
показалось что 8006 - это запрос дескриптора устройства, а 0001 - это что то связанное с очисткой девайся USB контроллера...
А остальные байты?... непонятно... В скачанной спецификации USB с офсайта не нашел или плохо искал... По крайней мере мне так показалось что там этого нет...
Вот и прошу помощи) Уважаемые Гуру форума направте пожалуйста на нужные источники для успешного освоения девайса USB и протокола USB)
Заранее спасибо)
Go to the top of the page
 
+Quote Post
3 страниц V  < 1 2 3  
Start new topic
Ответов (30 - 40)
shrek
сообщение Feb 24 2009, 08:43
Сообщение #31


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



В принципе я понял почему конфигурационный пакет не принимался
сброс прерываний при сбросе шины не нужно было делать
Код
AT91C_BASE_UDP  -> UDP_ICR     =  AT91C_UDP_CLEAR_INT & (~AT91C_UDP_ENDBUSRES);

эта строчка в коде просто не нужна была
после того как убрал эту строчку стал принимать пакет корректно)
sergeeff спасибо за инфу)
но все же если не разберешься на уровне приближенном к "машинному" и не выявишь все тонкости и проблемы... разобраться без этого будет сложновато почему девайс не работает)
Go to the top of the page
 
+Quote Post
shrek
сообщение Feb 24 2009, 10:59
Сообщение #32


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



теперь вопрос в другом... что должен содержать в себе дескриптор устройства?)

Конкретно параметры
Код
unsigned char bcdUSBL;              //версия спецификации USB в формате BCD
     unsigned char bcdUSBH;              //версия спецификации USB в формате BCD
     unsigned char bDeviceClass;         //код класса устройства USB
     unsigned char bDeviceSubclass;      //код подкласса устройства USB
     unsigned char bDeviceProtocol;      //код протокола USB
     unsigned char idVendorL;            //идентификатор изготовителя устройства
     unsigned char idVendorH;            //идентификатор изготовителя устройства
     unsigned char idProductL;           //идентификатор продукта
     unsigned char idProductH;           //идентификатор продукта
     unsigned char bcdDeviceL;           //номер версии устройства в формате BCD
     unsigned char bcdDeviceH;           //номер версии устройства в формате BCD
     unsigned char iManufacture;         //индекс дескриптора строки описывающей  изготовителя
     unsigned char iProduct;             //индекс дескриптора строки описывающей  продукт
     unsigned char iSerialNumber;        //индекс дескриптора строки описывающей  серийный номер устройства
     unsigned char bNumConfigurations;   //количество возможных конфигураций устройства



и еще я ему пытаюсь отослать дескриптор устройства 2 байта отослать удается
дальше хост сбрасывает шину и все снова...

по библиотекам (спасибо sergeeff) параметры
Код
     unsigned char bDeviceClass;         //код класса устройства USB
     unsigned char bDeviceSubclass;      //код подкласса устройства USB
     unsigned char bDeviceProtocol;      //код протокола USB

равны нулю

для HID устройств
(я пытаюсь для начала мышку реализовать)

судя по библиотекам первым младший байт отправлять не надо...

в общем я хосту пытаюсь отправить дескриптор устройства
Код
static const struct USB_DEVICE_DESCRIPTOR
     {
     unsigned char bLenth;               //0x12
     unsigned char bDescriptorType;      //0x01
     unsigned short int bcdUSBL;         //0x0200
     unsigned char bDeviceClass;         //0x00
     unsigned char bDeviceSubclass;      //0x00
     unsigned char bDeviceProtocol;      //0x00
     unsigned char bMaxPacketSize0;      //0x08
     unsigned short int idVendor;        //0x03EB
     unsigned short int idProduct;       //0x6200
     unsigned short int bcdDevice;       //0x0100
     unsigned char iManufacture;         //0x00
     unsigned char iProduct;             //0x00
     unsigned char iSerialNumber;        //0x00
     unsigned char bNumConfigurations;   //0x01

после того как девайс отправит 2ые 8 байт, то есть последнее что передает это bcdDevice, следует сброс шины и все начинается заново.
первые 8 байт девайс без проблем передает, далее следует подтверждение приема я передаю следующие 8 байт, далее следует сброс шины и все снова...???
Go to the top of the page
 
+Quote Post
amw
сообщение Feb 24 2009, 12:16
Сообщение #33


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Цитата(shrek @ Feb 24 2009, 12:59) *
теперь вопрос в другом... что должен содержать в себе дескриптор устройства?)

Ниже выглядит правильно. Если с выравниеванием все в порядке, то вроде нормально.
Цитата
и еще я ему пытаюсь отослать дескриптор устройства 2 байта отослать удается
дальше хост сбрасывает шину и все снова...

Как два байта? Отсылать нужно по размеру конечной точки, или сколько есть если есть меньше чем размер конечной точки.
например есть дескриптор устройства 18 байт длиной. Тогда отсылается он в три приема: 8 + 8 + 2.
Как в AT91SAM7A3 я не знаю, а в SAM7S, если нужно отослать данные длиной, кратной размеру конечной точки, то после отрпавления последней порции и получения подтверждения нужно послать еще ноль байт.
Цитата
в общем я хосту пытаюсь отправить дескриптор устройства
Код
static const struct USB_DEVICE_DESCRIPTOR
     {
     unsigned char bLenth;               //0x12
     unsigned char bDescriptorType;      //0x01
     unsigned short int bcdUSBL;         //0x0200
     unsigned char bDeviceClass;         //0x00
     unsigned char bDeviceSubclass;      //0x00
     unsigned char bDeviceProtocol;      //0x00
     unsigned char bMaxPacketSize0;      //0x08
     unsigned short int idVendor;        //0x03EB
     unsigned short int idProduct;       //0x6200
     unsigned short int bcdDevice;       //0x0100
     unsigned char iManufacture;         //0x00
     unsigned char iProduct;             //0x00
     unsigned char iSerialNumber;        //0x00
     unsigned char bNumConfigurations;   //0x01

после того как девайс отправит 2ые 8 байт, то есть последнее что передает это bcdDevice, следует сброс шины и все начинается заново.
первые 8 байт девайс без проблем передает, далее следует подтверждение приема я передаю следующие 8 байт, далее следует сброс шины и все снова...???

Что-то математика не сходится. "после того как девайс отправит 2ые 8 байт, то есть последнее что передает это bcdDevice". 2 * 8 = 16, т.е. последним будет iProduct.
У Вас с выравниванием структуры все в порядке? Она должна быть упакованной.


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
shrek
сообщение Feb 24 2009, 12:48
Сообщение #34


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



Ссори правильно последний байт отсылает iProduct виноват)
Теперь что он отсылает (смотрю в отладке)
Запрос конфигурации 80 06 00 01 00 00 40 00
Посылка 1ых 8 байт дескриптора устройства 12 01 00 02 00 00 00 08
Хост подтверждает прием и посылает 2ые 8 байт EB 03 27 61 00 01 00 00
Дальше следует сброс шины и все заново
Go to the top of the page
 
+Quote Post
shrek
сообщение Feb 25 2009, 14:30
Сообщение #35


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



Форумчане...
В общем после нескольких "экспериментов"
все таки я не добился того почему после отправки 2х байтов дескриптора устройства следует сброс шины... но...
после сброса шины как ни странно следует пакет установки адреса...
принял запрос дескриптора 80 06 00 01 00 00 40 00
начинаю отсылать дескриптор устройства
1ые 8 байт 12 01 10 01 00 00 00 08
пришло подтверждение далее второй байт отсылаю
2ые 8 байт EB 03 00 62 00 01 00 00
далее приходит прерывание SOFINT и прерывание по наличию данных в банке 0
в банке данных 0 байт я сбросил бит подтвердил то что принял данные
далее следует сброс шины и приходит конфигурационный пакет 00 05 01 00 00 00 00 00
я так понимаю это установка адреса
глупый вопрос почему отправляется 16 байт а не 18?) это своеобразная особенность хоста?)

и еще 3 байт пакета 00 05 01 00 00 00 00 00 я так понимаю это адрес устройства который я должен записать?)
Go to the top of the page
 
+Quote Post
shrek
сообщение Feb 26 2009, 08:55
Сообщение #36


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



после установки адреса необходимо отослать нулевые данные?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 26 2009, 10:25
Сообщение #37


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Да, нужно.
Go to the top of the page
 
+Quote Post
shrek
сообщение Feb 26 2009, 10:54
Сообщение #38


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



перед установкой адреса или после?...
если после установки адреса
Код
case SET_ADRESS:
                    {
                    AT91C_BASE_UDP -> UDP_FADDR  |= TSetupPacket.ValueL & AT91C_UDP_FADD;//Присваиваем принятый адрес устройству
                    AT91C_BASE_UDP -> UDP_GLBSTATE = AT91C_UDP_FADDEN;          //Устанавливаем бит сигнализирующий что устройство в состоянии адреса
                    AT91C_BASE_UDP -> UDP_CSR[i] |= AT91C_UDP_DIR;              //меняем направление передачи к хосту
                    AT91C_BASE_UDP -> UDP_CSR[i] &= (~AT91C_UDP_RXSETUP & (~0x30));//Сброс бита RXSetup (данные из буфера прочитал)
                    while ((AT91C_BASE_UDP -> UDP_CSR[i]) & AT91C_UDP_TXPKTRDY);
                    AT91C_BASE_UDP -> UDP_CSR[i] |= AT91C_UDP_TXPKTRDY;
                    break;
                    }

то следует два раза прерывание SOFINT и опять сброс шины и по новой все
если перед установкой отправить нулевой пакет
Код
case SET_ADRESS:
                    {
                    AT91C_BASE_UDP -> UDP_CSR[i] |= AT91C_UDP_DIR;              //меняем направление передачи к хосту
                    AT91C_BASE_UDP -> UDP_CSR[i] &= (~AT91C_UDP_RXSETUP & (~0x30));//Сброс бита RXSetup (данные из буфера прочитал)
                    while ((AT91C_BASE_UDP -> UDP_CSR[i]) & AT91C_UDP_TXPKTRDY);
                    AT91C_BASE_UDP -> UDP_CSR[i] |= AT91C_UDP_TXPKTRDY;
                    while ((AT91C_BASE_UDP -> UDP_CSR[i]) & AT91C_UDP_TXPKTRDY);
                    AT91C_BASE_UDP -> UDP_FADDR  |= TSetupPacket.ValueL & AT91C_UDP_FADD;//Присваиваем принятый адрес устройству
                    AT91C_BASE_UDP -> UDP_GLBSTATE = AT91C_UDP_FADDEN;          //Устанавливаем бит сигнализирующий что устройство в состоянии адреса
                    break;
                    }

то приходит подтверждение приема хост ждет примерно секунды 2 и опять заново шлет запрос дескриптора устройства
по подробнее можно описать процедуру установки адреса?
в спецификации и в даташите к девайсу пишут что нулевой пакет данных необходимо отправлять до установки адреса
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 26 2009, 12:14
Сообщение #39


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Нужно отправить ZLP, дождаться TXCOMP, и уже после этого устанавливать адрес.
Go to the top of the page
 
+Quote Post
shrek
сообщение Feb 26 2009, 14:08
Сообщение #40


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



после того как принял 00 05 01 00 00 00 00 00
я отправил данные нулевой длинны
наступило прерывание TXCOMP я его сбросил установил адрес 01
далее приходит запрос дескриптора несколько иной формы 80 06 00 01 00 00 12 00
первоначально девайс принял 80 06 00 01 00 00 40 00
повинуясь своей логике девайс начинает отправлять дескриптор устройства
1ые 8 байт отправляет следует подтверждение TXCOMP
2ые 8 байт отправляет... но подтверждения не приходит... 5 секунд молчания сброс шины и все по новой...
Это какая то особенность хоста?... %)

что в этой ситуации делать непонятно... хост ничего не присылает, ждет чего то... 2ые 8 байт отправляются... подтверждения никакого
Go to the top of the page
 
+Quote Post
shrek
сообщение Feb 27 2009, 10:00
Сообщение #41


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



В общем я понял суть моей проблемы...
при обработке подтверждения приема я забыл одну деталь... менять направление передачи данных контрольной точки...
Код
//---Обработка подтверждения приема пакета хостом-------------------------------
     if ((AT91C_BASE_UDP -> UDP_CSR[i]) & AT91C_UDP_TXCOMP)                         //Если пришел пакет подтверждения от хоста доставленых ему байтов
          {
          while (!((AT91C_BASE_US0 -> US_CSR) & AT91C_US_TXRDY));
          AT91C_BASE_US0 -> US_THR = 0xF7;
          AT91C_BASE_UDP -> UDP_CSR[i] &= (~AT91C_UDP_TXCOMP) & (~0x30);            //сбрасываем бит TXCOMP
          if (TX_BYTE_COUNT > 0)
               {
               AT91C_BASE_UDP -> UDP_CSR[i] |= AT91C_UDP_DIR;                       //меняем направление передачи к хосту
               USB_TRANSMIT_EP();                                                   //если оставшиеся байты не переданы то передаем
               }
          }

Из за отсутствия этой строчки
Код
AT91C_BASE_UDP -> UDP_CSR[i] |= AT91C_UDP_DIR;

ниче не работало в общем...
после этого весь дескриптор устройства отправляется хост его подверждает и присылает далее запрос конфигурации
80 06 00 02 00 00 09 00
))) надеюсь все написанное в этой теме поможет начинающим осваивать USB с нуля
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 18:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.0149 секунд с 7
ELECTRONIX ©2004-2016