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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> USB - AT91SAM7A3, интерфейс USB на данном девайсе
shrek
сообщение Feb 10 2009, 14:37
Сообщение #16


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

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



ну не совсем в помойке)
да в даташите этот бит в регистре присутствует)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 10 2009, 14:40
Сообщение #17


Гуру
******

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



Цитата(shrek @ Feb 10 2009, 17:37) *
ну не совсем в помойке)

Именно там, в лучшем случае на пункте приема макулатуры. Неоднократно обсуждались на форуме его творения. Сказать, что качество "материала" отвратительное - это ничего не сказать.
Go to the top of the page
 
+Quote Post
shrek
сообщение Feb 19 2009, 08:24
Сообщение #18


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

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



Все-таки непонятна работа USB девайса
Я запрещаю все прерывания
Код
AT91C_BASE_UDP  -> UDP_IDR     =  AT91C_UDP_ALL_INT;//Запрещаем все прерывания

Сбрасываю все прерывания, которые можно сбросить
Код
AT91C_BASE_UDP  -> UDP_ICR     =  AT91C_UDP_CLEAR_INT;//Сброс прерываний

разрешаю прерывания только для 0 конечной точки
Код
AT91C_BASE_UDP  -> UDP_IER     =  AT91C_UDP_EPINT0;//Разрешить прерывание от 0 конечной точки

в обработчике прерываний если поступил сброс шины сбрасываю прерывание
Код
if ((AT91C_BASE_UDP -> UDP_ISR) & AT91C_UDP_ENDBUSRES)
          {
          while (!((AT91C_BASE_US0 -> US_CSR) & AT91C_US_TXRDY));
          AT91C_BASE_US0  -> US_THR = 0xF4;//это для отладки шлю в ком порт инфу что именно это прерывание обработанно
          AT91C_BASE_UDP -> UDP_ICR |= AT91C_UDP_ENDBUSRES;
          }

и все равно ядро постоянно обрабатывает прерывание!!
фактически постоянно в нем висит...
?????

Сообщение отредактировал shrek - Feb 19 2009, 08:26
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 19 2009, 09:25
Сообщение #19


Гуру
******

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



Цитата(shrek @ Feb 19 2009, 11:24) *
и все равно ядро постоянно обрабатывает прерывание!!
фактически постоянно в нем висит...
?????

Правильно будет написать так:
Код
AT91C_BASE_UDP->UDP_ICR = AT91C_UDP_ENDBUSRES;


Вы учитываете, что BUS_RESET действительно сбрасывает модуль UDP?

Цитата
Once the ENDBUSRES interrupt has been triggered, the device enters Default State. In this
state, the UDP software must:
• Enable the default endpoint, setting the EPEDS flag in the UDP_CSR[0] register and,
optionally, enabling the interrupt for endpoint 0 by writing 1 to the UDP_IER register. The
enumeration then begins by a control transfer.
• Configure the interrupt mask register which has been reset by the USB reset detection
• Enable the transceiver clearing the TXVDIS flag in the UDP_TXVC register.
In this state UDPCK and MCK must be enabled.
Warning: Each time an ENDBUSRES interrupt is triggered, the Interrupt Mask Register and
UDP_CSR registers have been reset.
Go to the top of the page
 
+Quote Post
shrek
сообщение Feb 19 2009, 09:47
Сообщение #20


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

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



А вот этого я как раз и не учитывал....

то есть фактический после каждого сброса шины мне заново необходимо сконфигурировать мое устройство?)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 19 2009, 09:57
Сообщение #21


Гуру
******

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



Цитата(shrek @ Feb 19 2009, 12:47) *
то есть фактический после каждого сброса шины мне заново необходимо сконфигурировать мое устройство?)

Да, то есть по сбросу шины и имеет смысл конфигурировать прерывания и нулевую точку.
Go to the top of the page
 
+Quote Post
shrek
сообщение Feb 19 2009, 10:06
Сообщение #22


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

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



будем пробовать по тому как что то получается)
Спасибо за очень ценный совет!
Go to the top of the page
 
+Quote Post
shrek
сообщение Feb 19 2009, 11:53
Сообщение #23


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

Группа: Участник
Сообщений: 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
aaarrr
сообщение Feb 19 2009, 12:03
Сообщение #24


Гуру
******

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



Цитата(shrek @ Feb 19 2009, 14:53) *
хотя у меня есть такое предположение что приемопередатчик просто не успевает принять данные...
контроллер тактируется от PLL частота 48 МГц...

Не успевать он не может по определению. Попробуйте поставить затычку, и просто сбрасывать RXSETUP, если длина 0. На каких-то хостах у меня такое встречалось, насколько я помню.
Go to the top of the page
 
+Quote Post
shrek
сообщение Feb 19 2009, 13:01
Сообщение #25


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

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



я сбрасывал бит RXSETUP если длинна равна 0. но он мне так и ничего не принял... все время равны 0...
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 19 2009, 13:43
Сообщение #26


Гуру
******

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



Еще забыли FEN поставить:
Код
AT91C_BASE_UDP->UDP_FADDR = AT91C_UDP_FEN;
Go to the top of the page
 
+Quote Post
shrek
сообщение Feb 19 2009, 14:07
Сообщение #27


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

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



так яж этот бит ставлю при сбросе шины
Код
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;
          }
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 19 2009, 14:10
Сообщение #28


Гуру
******

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



Да, не заметил. Тогда проверьте, что у Вас i == 0.
Кстати, зачем использовать всюду глобальные переменные?
Go to the top of the page
 
+Quote Post
shrek
сообщение Feb 19 2009, 14:22
Сообщение #29


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

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



к вопросам по глобальности переменных я пока не подходил и всегда делал их глобальными...
i пока не проверял... думаю завтра....
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Feb 20 2009, 10:11
Сообщение #30


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



На сайте Atmel'a появилась свежая версия библиотеки at91lib_softpack_1.5. Там есть модуль 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 Текстовая версия Сейчас: 19th July 2025 - 10:39
Рейтинг@Mail.ru


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