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

 
 
> 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
 
Start new topic
Ответов
shrek
сообщение Feb 19 2009, 11:53
Сообщение #2


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

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



Кое что выяснилось...
После, как ни странно, трех сбросов шины) обработчику прерываний все таки удается принять управляющий пакет)
выяснил что прерывание поступает от нулевой конечной точки...
дальше пытаюсь выяснить от чего же поступило прерывание...
прерывание поступает по принятию пакета управления...
питаюсь прочитать его из буфера... и вот тут то проблема...
контроллер говорит мне ( по самопально организованному через USART0 порту отладки :-) ) что в буфере 0 байт...
???
могу причести листинг моего обработчика прерываний
Код
#include "ioat91sam7a3.h"

#define UP        0x00000200
#define LEFT      0x00002000
#define DOWN      0x00000100
#define RIGHT     0x00001000
#define BUTTON    0x00004000
#define LED_1     0x00100000
#define LED_2     0x00200000
#define LED_3     0x01000000
#define LED_4     0x02000000

//---Коды стандартных запросов (bRequest)---------------------------------------
#define GET_STATUS        0x00           //Запрос статуса
#define CLEAR_FEATURE     0x01           //Сброс устройства
#define SET_FEATURE       0x03           //Установить устройство
#define SET_ADRESS        0x05           //Установить адрес
#define GET_DESCRIPTOR    0x06           //Получить дескриптор
#define SET_DESCRIPTOR    0x07           //Загрузить дескриптор
#define GET_CONFIGURATION 0x08           //Получить код текущей конфигурации
#define SET_CONFIGURATION 0x09           //Установить конфигурацию
#define GET_INTERFACE     0x0A           //Получить код интерфейса
#define SET_INTERFACE     0x0B           //Установить интерфейс
#define SYNC_FRAME        0x0C           //Кадр синхронизации

//---Структура управляющего пакета----------------------------------------------
struct TSetupPacket
     {
     unsigned char bmRequestType;        //Тип запроса
     unsigned char bRequest;             //Код запроса
     unsigned char ValueL;               //Тип дескриптора
     unsigned char ValueH;               //Индекс дескриптора
     unsigned char IndexL;               //Номер интерфейса или конечной точки
     unsigned char IndexH;               //Номер интерфейса или конечной точки
     unsigned char LengthL;              //Число байт для передачи
     unsigned char LengthH;              //Число байт для передачи
     } TSetupPacket;

//---Структура дескриптора устройства-------------------------------------------
const struct USB_DEVICE_DESCRIPTOR
     {
     unsigned char bLenth;               //длина дескриптора
     unsigned char bDescriptorType;      //тип дескриптора
     unsigned char bcdUSBL;              //версия спецификации USB в формате BCD
     unsigned char bcdUSBH;              //версия спецификации USB в формате BCD
     unsigned char bDeviceClass;         //код класса устройства USB
     unsigned char bDeviceSubclass;      //код подкласса устройства USB
     unsigned char bDeviceProtocol;      //код протокола USB
     unsigned char bMaxPacketSize0;      //мах размер нулевой конечной точки
     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;   //количество возможных конфигураций устройства
     } USB_DEVICE_DESCRIPTOR = {0x12, 0x01, 0x10, 0x01, 0x00, 0x00, 0x00, 0x08, 0x14, 0x11, 0x77, 0x77, 0xAA, 0xAA, 0x00, 0x00, 0x00, 0x01};

//------------------------------------------------------------------------------
const unsigned short int   BUFFER_SIZE_EP[6] = {0x08, 0x40, 0x40, 0x40, 0x100, 0x100};//размер буфера конечных точек
      unsigned short int   i = 0;                                                     //индикатор конечной точки по умолчанию 0
      unsigned short int   COUNT;                                                     //счетчик байтов при загрузке в буфер или сохранинии из буфера
      unsigned short int   RX_BYTE_COUNT;                                             //колво байтов в буфере приемника
      unsigned short int   TX_BYTE_COUNT;                                             //колво байтов для передачи
      unsigned char       *DATA_OUT_ADRESS;                                           //указатель на сегмент памяти, содержащий данные для сохранения в буфер приемопередатчика
      unsigned char       *DATA_IN_ADRESS;                                            //указатель на сегмент памяти, содержащий сохраненные данные из буфера приемопередатчика


//==============================================================================
//---Блок выгрузки данных в буфер FIFO UDP_FDR[i]-------------------------------
void USB_TRANSMIT_EP()                                                          //Функция блока сохранения данных в буфер конечной точки 0
     {
     while ((AT91C_BASE_UDP -> UDP_CSR[i]) & AT91C_UDP_TXPKTRDY);               //ждать пока бит AT91C_UDP_TXPKTRDY станет 0
     COUNT = 0;                                                                 //обнуляем счетчик байтов
     while (COUNT < BUFFER_SIZE_EP[i])                                          //запускаем цикл загрузки байтов в буфер i-ой конечной точки
           {
           if (TX_BYTE_COUNT > 0)
                {
                AT91C_BASE_UDP -> UDP_FDR[i] = *DATA_OUT_ADRESS;                //загружаем байт в буфер
                COUNT++;                                                        //инкрементируем счетчик байтов
                TX_BYTE_COUNT--;                                                //декрементируем счетчик отправленных байтов
                DATA_OUT_ADRESS++;                                              //инкрементируем адрес для записи в буфер следующего байта
                }
           else
                {
                AT91C_BASE_UDP -> UDP_FDR[i] = 0x00;                            //Добисываем оставшиеся нули
                COUNT++;                                                        //инкрементируем счетчик байтов
                }
           }
     AT91C_BASE_UDP -> UDP_CSR[i] |= AT91C_UDP_TXPKTRDY;                        //установка бита готовности пакета к передаче
     }
//==============================================================================



//==============================================================================
//---Блок загрузки данных из буфера FIFO UDP_FDR[i]-----------------------------
void USB_RECEIVE_EP()                                                           //Функция блока сохранения данных из буфера конечной точки 0
     {
     RX_BYTE_COUNT = (((AT91C_BASE_UDP -> UDP_CSR[i]) & AT91C_UDP_RXBYTECNT) >> 16);//число байтов в буфере
     while (!((AT91C_BASE_US0 -> US_CSR) & AT91C_US_TXRDY));
     AT91C_BASE_US0  -> US_THR = RX_BYTE_COUNT & 0xFF;
     COUNT = 0;                                                                 //обнуляем счетчик байтов
     while (COUNT < RX_BYTE_COUNT)                                              //запускаем цикл сохранения байтов
           {
          *(DATA_IN_ADRESS + COUNT) = AT91C_BASE_UDP -> UDP_FDR[i];             //сохраняем инфу в память
           while (!((AT91C_BASE_US0 -> US_CSR) & AT91C_US_TXRDY));
           AT91C_BASE_US0  -> US_THR = *(DATA_IN_ADRESS + COUNT);
           COUNT++;                                                             //инкрементируем счетчик байтов
           }
     while (!((AT91C_BASE_US0 -> US_CSR) & AT91C_US_TXRDY));
     AT91C_BASE_US0  -> US_THR = 0xA3;
     }
//==============================================================================

    

//==============================================================================
//---Блок обработки прерываний от i-ой конечной точки---------------------------
void USB_EP_INT()
     {
//---Обработка управляющего пакета----------------------------------------------
     if ((AT91C_BASE_UDP -> UDP_CSR[i]) & AT91C_UDP_RXSETUP)                    //Если пришел управляющий пакет данных или команда
          {
          DATA_IN_ADRESS = (unsigned char *) &TSetupPacket;                     //присваиваем указателю адрес памяти где расположена структура управляющего пакета
          USB_RECEIVE_EP();                                                     //переход на функцию сохранения байтов в память
          while (1);
          switch (TSetupPacket.bRequest)                                        //че комп от меня хочет?
               {
               case GET_DESCRIPTOR:
                    {
                    while (!((AT91C_BASE_US0 -> US_CSR) & AT91C_US_TXRDY));
                    AT91C_BASE_US0  -> US_THR = 0xA4;
                    while (1);
                    DATA_OUT_ADRESS = (unsigned char *) &USB_DEVICE_DESCRIPTOR; //присваиваем указателю адрес памяти где расположена структура дескриптора устройства
                    TX_BYTE_COUNT   = *DATA_OUT_ADRESS;                         //присваиваем счетчику байтов длинну дескриптора устройства
                    AT91C_BASE_UDP -> UDP_CSR[i] |= AT91C_UDP_DIR;              //меняем направление передачи к хосту
                    AT91C_BASE_UDP -> UDP_CSR[i]  = !(AT91C_UDP_RXSETUP);       //Сброс бита RXSetup (данные из буфера прочитал)
                    USB_TRANSMIT_EP();                                          //Запись в буфер конечной точки дескриптора устройства
                    break;                                                      //выход из оператора switch
                    }
               case SET_ADRESS:
                    {
                    while(1);
                    }
               case GET_STATUS:
                    {
                    while(1);
                    }
               case CLEAR_FEATURE:
                    {
                    while(1);
                    }
               case SET_FEATURE:
                    {
                    while(1);
                    }
               case SET_DESCRIPTOR:
                    {
                    while(1);
                    }
               case GET_CONFIGURATION:
                    {
                    while(1);
                    }
               case SET_CONFIGURATION:
                    {
                    while(1);
                    }
               case GET_INTERFACE:
                    {
                    while(1);
                    }
               case SET_INTERFACE:
                    {
                    while(1);
                    }
               case SYNC_FRAME:
                    {
                    while(1);
                    }
               default:                                                         //если запрос не известен то выход из оператора switch
                    {
                    while(1);
                    }
               }
          //AT91C_BASE_UDP -> UDP_CSR[i]  = !(AT91C_UDP_RXSETUP);
          while(1);
          }

//---Обработка подтверждения приема пакета хстом--------------------------------
     if ((AT91C_BASE_UDP -> UDP_CSR[i]) & AT91C_UDP_TXCOMP)                     //Если пришел пакет подтверждения от хоста доставленых ему байтов
          {
          while(1);
          }

//------------------------------------------------------------------------------
     if ((AT91C_BASE_UDP -> UDP_CSR[i]) & AT91C_UDP_RX_DATA_BK0)                //Если есть данные в банке данных BK0
          {
          while(1);
          }
    
//------------------------------------------------------------------------------
     if ((AT91C_BASE_UDP -> UDP_CSR[i]) & AT91C_UDP_RX_DATA_BK1)                //Если есть данные в банке данных BK1
          {
          while(1);
          }

//------------------------------------------------------------------------------
     if ((AT91C_BASE_UDP -> UDP_CSR[i]) & AT91C_UDP_ISOERROR)                   //Хост принял останов или возникла ошибка CRC
          {
          while(1);
          }
    
//------------------------------------------------------------------------------
     }
//==============================================================================



//==============================================================================
//---Обработчик прерываний USB--------------------------------------------------
usb_main()
     {
//------------------------------------------------------------------------------
     switch ((AT91C_BASE_UDP -> UDP_ISR) & AT91C_UDP_ALL_EP_INT)                //выбор конечной точки, которая вызвала прерывание
          {
          case AT91C_UDP_EPINT0: {i = 0; USB_EP_INT(); break;}
          case AT91C_UDP_EPINT1: {i = 1; USB_EP_INT(); break;}
          case AT91C_UDP_EPINT2: {i = 2; USB_EP_INT(); break;}
          case AT91C_UDP_EPINT3: {i = 3; USB_EP_INT(); break;}
          case AT91C_UDP_EPINT4: {i = 4; USB_EP_INT(); break;}
          case AT91C_UDP_EPINT5: {i = 5; USB_EP_INT(); break;}
          }
//------------------------------------------------------------------------------
     if ((AT91C_BASE_UDP -> UDP_ISR) & AT91C_UDP_RXRSM)
          {
          while (!((AT91C_BASE_US0 -> US_CSR) & AT91C_US_TXRDY));
          AT91C_BASE_US0  -> US_THR = 0xF1;
          AT91C_BASE_UDP -> UDP_ICR = AT91C_UDP_RXRSM;
          }
     if ((AT91C_BASE_UDP -> UDP_ISR) & AT91C_UDP_RXSUSP)
          {
          while (!((AT91C_BASE_US0 -> US_CSR) & AT91C_US_TXRDY));
          AT91C_BASE_US0  -> US_THR = 0xF2;
          AT91C_BASE_UDP -> UDP_ICR = AT91C_UDP_RXSUSP;
          }
     if ((AT91C_BASE_UDP -> UDP_ISR) & AT91C_UDP_SOFINT)
          {
          while (!((AT91C_BASE_US0 -> US_CSR) & AT91C_US_TXRDY));
          AT91C_BASE_US0  -> US_THR = 0xF3;
          AT91C_BASE_UDP -> UDP_ICR = AT91C_UDP_SOFINT;
          }
     if ((AT91C_BASE_UDP -> UDP_ISR) & AT91C_UDP_ENDBUSRES)
          {
//---Конфигурация USB при сбросе шины-------------------------------------------
          AT91C_BASE_UDP  -> UDP_FADDR   =  AT91C_UDP_FEN;
          AT91C_BASE_UDP  -> UDP_RSTEP   =  AT91C_UDP_ALL_EP;                                  //Сброс всех конечных точек
          AT91C_BASE_UDP  -> UDP_ICR     =  AT91C_UDP_CLEAR_INT & (~AT91C_UDP_ENDBUSRES);      //Сброс прерываний кроме прерывания по сбросу шины
          AT91C_BASE_UDP  -> UDP_IDR     =  AT91C_UDP_ALL_INT;                                 //Запрещаем все прерывания
          AT91C_BASE_UDP  -> UDP_IER     =  AT91C_UDP_EPINT0;                                  //Разрешить прерывание от 0 конечной точки
          AT91C_BASE_UDP  -> UDP_CSR[AT91C_UDP_EP0] =  AT91C_UDP_EPTYPE_CTRL | AT91C_UDP_EPEDS;//0 конечная контрольная точка
          AT91C_BASE_UDP  -> UDP_ICR     = AT91C_UDP_ENDBUSRES;
          //while (!((AT91C_BASE_US0 -> US_CSR) & AT91C_US_TXRDY));
          //AT91C_BASE_US0  -> US_THR = 0xF4;
          }
     if ((AT91C_BASE_UDP -> UDP_ISR) & AT91C_UDP_WAKEUP)
          {
          while (!((AT91C_BASE_US0 -> US_CSR) & AT91C_US_TXRDY));
          AT91C_BASE_US0  -> US_THR = 0xF5;
          AT91C_BASE_UDP -> UDP_ICR = AT91C_UDP_WAKEUP;
          }
//------------------------------------------------------------------------------
     AT91C_BASE_AIC -> AIC_EOICR = 0xF1F1F1F1;                                  //Сообщаем AIC прерывание обработал :-)
     }
//==============================================================================


причина почему так много While(1), потому как код в стадии отладки)

хотя у меня есть такое предположение что приемопередатчик просто не успевает принять данные...
контроллер тактируется от PLL частота 48 МГц...

Сообщение отредактировал shrek - Feb 19 2009, 11:44
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- shrek   USB - AT91SAM7A3   Jan 29 2009, 13:17
- - mempfis_   Цитата(shrek @ Jan 29 2009, 17:17) Конкре...   Jan 29 2009, 13:50
- - shrek   Спасибо за ответ) Я вчера тоже понял в чем суть пе...   Jan 30 2009, 07:51
|- - mempfis_   Цитата(shrek @ Jan 30 2009, 10:51) Спасиб...   Jan 30 2009, 08:11
- - Zayac   Для атмела существуют примеры кода по работе с USB...   Jan 30 2009, 08:03
- - shrek   В общем вопрос еще такой возник... Вот этот дескри...   Feb 10 2009, 09:53
|- - aaarrr   Цитата(shrek @ Feb 10 2009, 12:53) Или же...   Feb 10 2009, 11:30
- - shrek   после отправки каждого пакета по идее от хоста дол...   Feb 10 2009, 12:55
|- - aaarrr   Цитата(shrek @ Feb 10 2009, 15:55) после ...   Feb 10 2009, 13:22
- - shrek   То есть получается использовать USB девайс и при э...   Feb 10 2009, 14:06
- - aaarrr   Почему? Просто обрабатывайте BUSRES как надо.   Feb 10 2009, 14:09
- - shrek   Вроде бы девайс аппаратно обрабатывает сброс?... п...   Feb 10 2009, 14:21
|- - aaarrr   Цитата(shrek @ Feb 10 2009, 17:21) при чт...   Feb 10 2009, 14:28
- - shrek   МММ... В книжке Редькина этого бита нет в регистре...   Feb 10 2009, 14:30
|- - aaarrr   Цитата(shrek @ Feb 10 2009, 17:30) МММ......   Feb 10 2009, 14:35
- - shrek   ну не совсем в помойке) да в даташите этот бит в р...   Feb 10 2009, 14:37
|- - aaarrr   Цитата(shrek @ Feb 10 2009, 17:37) ну не ...   Feb 10 2009, 14:40
- - shrek   Все-таки непонятна работа USB девайса Я запрещаю в...   Feb 19 2009, 08:24
|- - aaarrr   Цитата(shrek @ Feb 19 2009, 11:24) и все ...   Feb 19 2009, 09:25
- - shrek   А вот этого я как раз и не учитывал.... то есть ф...   Feb 19 2009, 09:47
|- - aaarrr   Цитата(shrek @ Feb 19 2009, 12:47) то ест...   Feb 19 2009, 09:57
- - shrek   будем пробовать по тому как что то получается) Спа...   Feb 19 2009, 10:06
|- - aaarrr   Цитата(shrek @ Feb 19 2009, 14:53) хотя у...   Feb 19 2009, 12:03
- - shrek   я сбрасывал бит RXSETUP если длинна равна 0. но он...   Feb 19 2009, 13:01
- - aaarrr   Еще забыли FEN поставить: КодAT91C_BASE_UDP->U...   Feb 19 2009, 13:43
- - shrek   так яж этот бит ставлю при сбросе шины Кодif ...   Feb 19 2009, 14:07
- - aaarrr   Да, не заметил. Тогда проверьте, что у Вас i == 0....   Feb 19 2009, 14:10
- - shrek   к вопросам по глобальности переменных я пока не по...   Feb 19 2009, 14:22
- - sergeeff   На сайте Atmel'a появилась свежая версия библи...   Feb 20 2009, 10:11
- - shrek   В принципе я понял почему конфигурационный пакет н...   Feb 24 2009, 08:43
- - shrek   теперь вопрос в другом... что должен содержать в с...   Feb 24 2009, 10:59
|- - amw   Цитата(shrek @ Feb 24 2009, 12:59) теперь...   Feb 24 2009, 12:16
- - shrek   Ссори правильно последний байт отсылает iProduct в...   Feb 24 2009, 12:48
- - shrek   Форумчане... В общем после нескольких "экспер...   Feb 25 2009, 14:30
- - shrek   после установки адреса необходимо отослать нулевые...   Feb 26 2009, 08:55
- - aaarrr   Да, нужно.   Feb 26 2009, 10:25
- - shrek   перед установкой адреса или после?... если после у...   Feb 26 2009, 10:54
- - aaarrr   Нужно отправить ZLP, дождаться TXCOMP, и уже после...   Feb 26 2009, 12:14
- - shrek   после того как принял 00 05 01 00 00 00 00 00 я от...   Feb 26 2009, 14:08
- - shrek   В общем я понял суть моей проблемы... при обработк...   Feb 27 2009, 10:00


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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 12:11
Рейтинг@Mail.ru


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