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

 
 
> Не могу передать пакеты хосту по усб, at91sam7s256
Bulat
сообщение Dec 29 2007, 07:06
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241



Использую стандартную прошивку AT91SAM7S256-USART_USB_SAM7S-IAR4_31A-1_00 для связи контроллера с усб, только переписал дескрипторы,
чтобы работала с моим драйвером и убрал код связанный с усарт. Нумерация проходит нормально. Writefile тоже работает. Пакеты благополучно
доставляются моему девайсу. Не могу реализовать передачу пакетов от девайса хосту. Readfile возвращает ошибку.
В стандартной прошивке в файле cdc_enumerate.c я нашел функцию AT91F_UDP_IsConfigured(AT91PS_CDC pCdc), которая, как я понял отвечает за обработку
источников прерываний isr. Туда я добавил свой код, кот обрабатывает прерывания от ер1 и ер2 (ер1 - in, ep2 - out).
Вот этот код:
Код
//*----------------------------------------------------------------------------
//* \fn    AT91F_UDP_IsConfigured
//* \brief Test if the device is configured and handle enumeration
//*----------------------------------------------------------------------------
static uchar AT91F_UDP_IsConfigured(AT91PS_CDC pCdc)
{
    AT91PS_UDP pUDP = pCdc->pUdp;
    AT91_REG isr = pUDP->UDP_ISR;

    if (isr & AT91C_UDP_ENDBUSRES) {
        pUDP->UDP_ICR = AT91C_UDP_ENDBUSRES;
        // reset all endpoints
        pUDP->UDP_RSTEP  = (unsigned int)-1;
        pUDP->UDP_RSTEP  = 0;
        // Enable the function
        pUDP->UDP_FADDR = AT91C_UDP_FEN;
        // Configure endpoint 0
        pUDP->UDP_CSR[0] = (AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_CTRL);
    }
    else if (isr & AT91C_UDP_EPINT0) {
        pUDP->UDP_ICR = AT91C_UDP_EPINT0;
        AT91F_CDC_Enumerate(pCdc);
    }
             else if (isr & AT91C_UDP_EPINT1){
             pUDP->UDP_ICR = AT91C_UDP_EPINT1;
         pUDP->UDP_CSR[1]=0; //подтверждает, что хост принял данные
             }
                  else if (isr & AT91C_UDP_EPINT2){
                  pUDP->UDP_ICR = AT91C_UDP_EPINT2;
                  AT91F_CDC_ReadData(pCdc);
                  }  
    return pCdc->currentConfiguration;
}


Т.е. при получении данных от хоста возникает прерывание от ер2 и вызывается функция AT91F_CDC_ReadData(pCdc). Ее код приведен ниже:
Код
  extern struct _AT91S_CDC     pCDC;
  static char adrRT[64];
  AT91PS_UDP pUDP = pCdc->pUdp;
  
  pCDC.Read(&pCDC, adrRT,64);
  uint nbytes = AT91F_UDP_Read(pCdc, adrRT, 64);
  pUDP->UDP_CSR[2]=pUDP->UDP_CSR[2]&0x7FFFFFD;/*сброс бита  RX_DATA_BK0 -
подтвердение того, что данные из FIFO считаны*/  
  static char CWord[64];
  CWord[1] = nbytes;
  pCDC.Write(&pCDC,CWord,64);


Т.е. я считываю данные из буфера, а потом пытаюсь передать количество полученных байт обратно на хост, но они не передаются, т.к. device monitoring studio не показывает принятых байт от моего девайса.

Привожу код функции main() из файла main.c
Код
// Enable User Reset and set its minimal assertion to 960 us
     AT91C_BASE_RSTC->RSTC_RMR = AT91C_RSTC_URSTEN | (0x4<<8) | (unsigned int)(0xA5<<24);
    
    // Init USB device
    AT91F_USB_Open();
    // Init USB device
    // Wait for the end of enumeration
    while (!pCDC.IsConfigured(&pCDC));  
    
    while(1);


Как правильно воспользоваться этой стандартной прошивкой, чтобы считывать и записывать данные в конечные точки? Может я свой код не туда добавил, вроде кроме как в AT91F_UDP_IsConfigured(AT91PS_CDC pCdc) и некуда, она же прерывания обрабатывает или я не прав?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Bulat
сообщение Jan 16 2008, 05:09
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241



Цитата
А где сам обработчик IRQ? Что-то вроде c1ec1#pragma vector = 0x18__irq __arm void IRQ_Switch() {    void (*Handler)() = (void(*)())AT91C_BASE_AIC->AIC_IVR;    Handler();    AT91C_BASE_AIC->AIC_EOICR = 0;                    // Reset AIC logic}c2ec2Где в main() глобальное разрешение разрешение прерываний ( __enable_interrupt(); )?хотя, возможно вы это просто не показали, тогда извиняюсь.


Если я добавляю обработчик IRQ, девайс вообще перестает определяться! Я же за основу взял готовый пример USB-USART вот и пытаюсь его под себя переделать.
Вот как выглядит код с обработчиком IRQ, с main и самим хандлером:
Код
#pragma vector = 0x18
__irq __arm void IRQ_Switch()
{
    void (*udp_c_irq_handler)() = (void(*)())AT91C_BASE_AIC->AIC_IVR;
    udp_c_irq_handler();
    AT91C_BASE_AIC->AIC_EOICR = 0;                    // Reset AIC logic
}

int main ( void )
{
  __ramfunc __arm void udp_c_irq_handler(void);  
  // Enable User Reset and set its minimal assertion to 960 us
     AT91C_BASE_RSTC->RSTC_RMR = AT91C_RSTC_URSTEN | (0x4<<8) | (unsigned int)(0xA5<<24);    
    // Init USB device
    AT91F_USB_Open();
    // Init USB device
    // Wait for the end of enumeration
    while(!pCDC.IsConfigured(&pCDC));
    
    AT91C_BASE_AIC->AIC_IECR |= (1<<AT91C_ID_UDP);
    AT91C_BASE_AIC->AIC_IDCR = ~AT91C_BASE_AIC->AIC_IECR;
    
    pCDC.pUdp->UDP_ICR = 0xff00;
    AT91F_UDP_DisableIt ( pCDC.pUdp, 0xFFFF);
    AT91F_UDP_EnableIt (pCDC.pUdp, AT91C_UDP_EPINT2);
    AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_UDP, UDP_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_HIGH_LEVEL, udp_c_irq_handler);
    AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_UDP);  
}

//udp_c_irq_handler
    __ramfunc __arm void udp_c_irq_handler(void)
    {
      char buff_r[64];
      static char buff_w[64];
      //pCDC.Write = UDP_Write;      
      //pCDC.Read = UDP_Read;
      
      unsigned int ret_val = UDP_Read(&pCDC, buff_r,64);
      for(int i=0;i<64;i++)
      {
        buff_w[i] = i;
      }  
      UDP_Write(&pCDC, buff_w,64);    
    }

Т.е. добавив обработчик __irq __arm void IRQ_Switch() девайс перестает даже нумероваться! Почему?
Go to the top of the page
 
+Quote Post
DimitryB
сообщение Jan 17 2008, 00:01
Сообщение #3





Группа: Новичок
Сообщений: 4
Регистрация: 19-07-07
Пользователь №: 29 255



Потому что он у вас уходит в прерывание по END BUS RESET и вы не сбрасываете прерывание В итоге оно все время повторяется и enumeration устройства так и не происходит.

Вы должны знать как использовать прерывание:
1. Объявить прерывание задав соответствующим регистрам 1-цы:
AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_UDP, UDP_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_HIGH_LEVEL, udp_c_irq_handler);

2. Активировать прерывания
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_UDP);

3. В процедуре udp_c_irq_handler установить какое прерывание сработало

4. По окончании вызова процедуры сбросить прерывание в его статус-регистре иначе оно будет повторяться вновь и вновь

Вот Вам еще подсказка Это сбрасывает прерывание

//Clear interruptions by:
// 1. USB Resume Interrupt 2. USB End Of Bus Reset Interrupt
// because they traps programm inside this subrounte
AT91F_UDP_InterruptClearRegister(AT91C_BASE_UDP, AT91C_UDP_RXRSM);
AT91F_UDP_InterruptClearRegister(AT91C_BASE_UDP, AT91C_UDP_ENDBUSRES);
//AT91F_UDP_InterruptClearRegister clears Interrupt Register

А это функция из библиотеки
__inline void AT91F_UDP_InterruptClearRegister (
AT91PS_UDP pUDP, // \arg pointer to UDP controller
unsigned int flag) // \arg IT to be clear
{
pUDP->UDP_ICR = flag;
}

библиотека зовется lib_AT91SAM7S64.h
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Bulat   Не могу передать пакеты хосту по усб   Dec 29 2007, 07:06
- - Bulat   Всех с Новым Годом! Извиняюсь, что поднимаю те...   Jan 1 2008, 15:49
- - DimitryB   Мне кажется, Вы вообще не стой стороны зашли. Почи...   Jan 3 2008, 16:19
- - Bulat   ЦитатаМожет, кто знает как их из main {...} в прер...   Jan 3 2008, 17:28
|- - DimitryB   Цитата(Bulat @ Jan 3 2008, 21:28) Да меня...   Jan 3 2008, 20:45
- - KAlex   Цитата(Bulat @ Dec 29 2007, 10:06) Как пр...   Jan 4 2008, 09:11
|- - Bulat   Цитата(KAlex @ Jan 4 2008, 14:11) AT91F_U...   Jan 9 2008, 06:34
|- - KAlex   Цитата(Bulat @ Jan 9 2008, 09:34) Спасибо...   Jan 10 2008, 10:46
- - Bulat   ЦитатаА для device monitoring studio не поделетесь...   Jan 6 2008, 16:24
- - Bulat   ЦитатаДа и еще вопрос. В функции AT91F_AIC_Config...   Jan 11 2008, 08:32
|- - KAlex   Цитата(Bulat @ Jan 11 2008, 11:32) Я имен...   Jan 11 2008, 08:53
- - Bulat   Может я неправильно вызываю функцию записи UDP_Wri...   Jan 14 2008, 06:22
- - Bulat   Помоему даже обработчик прерываний udp_c_irq_handl...   Jan 15 2008, 11:06
|- - Сергей Борщ   Цитата(Bulat @ Jan 15 2008, 13:06) Помоем...   Jan 15 2008, 11:17
- - Bulat   ЦитатаDimitryB Дата Сегодня, 05:01 Потому что он...   Jan 17 2008, 05:00
- - Dron_Gus   Цитата(Bulat @ Jan 17 2008, 08:00) Пробле...   Jan 17 2008, 14:09
- - nameless   2 Bulat по поводу AT91F_enable_interrupt() для пя...   Jan 18 2008, 02:17
- - Bulat   Цитатаnameless Дата Jan 18 2008, 07:17 2 Bulat п...   Jan 22 2008, 04:56
- - Bulat   Да, и, помоему, то что приведено в этом асме описа...   Jan 22 2008, 06:30


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

 


RSS Текстовая версия Сейчас: 12th August 2025 - 12:38
Рейтинг@Mail.ru


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