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

 
 
> SAM7x256 & USB
Timofey
сообщение Jul 19 2009, 07:40
Сообщение #1


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

Группа: Участник
Сообщений: 119
Регистрация: 3-07-06
Пользователь №: 18 528



Код на прием такой
Код
uint AT91F_UDP_Read(AT91PS_CDC pCdc, char *pData, uint length)
{
AT91PS_UDP pUdp = pCdc->pUdp;
uint packetSize, nbBytesRcv = 0, currentReceiveBank = pCdc->currentRcvBank;
if ((pUdp->UDP_CSR[AT91C_EP_OUT] & AT91C_UDP_RX_DATA_BK0)||(pUdp->UDP_CSR[AT91C_EP_OUT] & AT91C_UDP_RX_DATA_BK1))
{
  return 0;//то есть, если не было ни одного пакета принято, то просто выходим
}
while (length) {
  if ( !AT91F_UDP_IsConfigured(pCdc) )
   break;
  if ( pUdp->UDP_CSR[AT91C_EP_OUT] & currentReceiveBank ) {
   packetSize = MIN(pUdp->UDP_CSR[AT91C_EP_OUT] >> 16, length);
   length -= packetSize;
   if (packetSize < AT91C_EP_OUT_SIZE)
    length = 0;
   while(packetSize--)
    pData[nbBytesRcv++] = pUdp->UDP_FDR[AT91C_EP_OUT];
   pUdp->UDP_CSR[AT91C_EP_OUT] &= ~(currentReceiveBank);
   if (currentReceiveBank == AT91C_UDP_RX_DATA_BK0)
    currentReceiveBank = AT91C_UDP_RX_DATA_BK1;
   else
    currentReceiveBank = AT91C_UDP_RX_DATA_BK0;</P> <P>  }
}
        pUdp->UDP_CSR[AT91C_EP_OUT] &= ~(AT91C_UDP_TXCOMP);
pCdc->currentRcvBank = currentReceiveBank;
return nbBytesRcv;</P> <P>}

код на передачу
Код
uint AT91F_UDP_Write(AT91PS_CDC pCdc, const char *pData, uint length)
{
AT91PS_UDP pUdp = pCdc->pUdp;
uint cpt = 0;</P> <P>        if ((pUdp->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXPKTRDY))
{
  return 0;//если усб готово к передаче, то начинаем её
}
pUdp->UDP_CSR[AT91C_EP_IN] &= ~(AT91C_UDP_TXCOMP);
cpt = MIN(length, AT91C_EP_IN_SIZE);
length -= cpt;
while (cpt--) pUdp->UDP_FDR[AT91C_EP_IN] = *pData++;
pUdp->UDP_CSR[AT91C_EP_IN] |= AT91C_UDP_TXPKTRDY;</P> <P> while (length) {
  cpt = MIN(length, AT91C_EP_IN_SIZE);
  length -= cpt;
  while (cpt--) pUdp->UDP_FDR[AT91C_EP_IN] = *pData++;
  while ( !(pUdp->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXCOMP) )
   if ( !AT91F_UDP_IsConfigured(pCdc) ) return length;
  pUdp->UDP_CSR[AT91C_EP_IN] &= ~(AT91C_UDP_TXCOMP);
  while (pUdp->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXCOMP);
  pUdp->UDP_CSR[AT91C_EP_IN] |= AT91C_UDP_TXPKTRDY;
}
return length;
}

в основном цикле я поочередно вызываю сначала чтение, потом запись. И получается, что посылка отправляется только тогда, когда произойдет прием посылки. Если убрать чтение в основном цикле, то передача идет всегда. Почему так? Мне нужно принимать контроллером всего 2 байта, а передавать 256, друг за другом. Причем 2 байта могут быть посланы контроллеру не всегда.
получается следующее
Код
pCDC.Read(&pCDC, ((char *) &data_comp), 2);
if ((length>256))
      {
pCDC.Write(&pCDC, data, length);
}

обнаружилось, что данные все таки доходят до микроконтроллера, а вот он на комп ничего не отправляет. убирая строчку чтения, получаем, что данные на комп все таки идут
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
prottoss
сообщение Oct 29 2009, 05:28
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Всем доброго времени суток. Не стал открывать новую тему, потому как название как раз для моейsmile.gif С USB работал, поднимал на PDIUSBD12 по прерываниям, да и на ARM тоже по примерам от атмела (Без прерываний). Но вот с прерываниями затык полный, не получается.
После подключения девайса:
1. Два раза AT91C_UDP_ENDBUSRES;
2. Прерывание от ЕР0. Хост делает запрос GET DEVICE DESCRIPTOR, отсылаю в прерывании первые 8 байт дескриптора устройства;
3. Прерывание AT91C_UDP_TXCOMP; Отсылаю вторые 8 байт;
4. Прерывание AT91C_UDP_RX_DATA_BK0; Пока что ничего с ним не делаю, просто очищаю флаг.
5. Прерывание от ЕР0. Хост делает запрос SET ADDRESS c полем wValue = 0! smile3046.gif ; Отсылаю нулевой пакет.
6. Прерывание AT91C_UDP_TXCOMP; Очищаю.

Далее три раза то же самое, и "Устройство USB работает не правильно... бла-бла-бла". Дескриптор устройства верный, опробованный, объявлен между #pragma pack(align 8) (компилятор IAR 5.4). Перелопатил все темы форума, связанные с SAM7 и USB по прерываниям. Все вроде правильно делаю, но, похоже что то не доделываю. unsure.gif Ниже код прерывания и записи в конечную точку.
Код
/*****************************************************************************
Main UDP interrupt handler.
******************************************************************************/
static void ISR_Handler(void)
{    
      UINT32 isr;
    
      /* Read interrupt status register and check events */
      isr = AT91C_BASE_UDP->UDP_ISR;
    
    /* USB bus reset event */
    if(AT91C_UDP_ENDBUSRES & isr)    
    {    
          DBG_OUT("USB bus reset!\r\n");
        
        /* Disable and clear all interruptions, reverting to the base state */
          AT91C_BASE_UDP->UDP_IDR = MAXUINT32;
        AT91C_BASE_UDP->UDP_ICR = MAXUINT32;
          
        /* Reset all endpoints FIFOs */
          AT91C_BASE_UDP->UDP_RSTEP = MAXUINT32;    
        AT91C_BASE_UDP->UDP_RSTEP = 0;
        
        /* Reset EP0 to a basic control endpoint */
        AT91C_UDP_CSR[0] = AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_CTRL;
        while (AT91C_UDP_CSR[0] != (AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_CTRL));
        
        /* Enable interrupt for control enpoint (0) events.
        Other interrupts get enabled as the enumeration process complete */
        AT91C_BASE_UDP->UDP_IER = AT91C_UDP_EPINT0;
        
        /* Enable the function endpoints, setting address 0, and return
         immediately. Given that we've just reset everything, there's no
         point in continuing. */
        AT91C_BASE_UDP->UDP_FADDR = AT91C_UDP_FEN;
        AT91C_BASE_UDP->UDP_TXVC = 0;    /* Enable tranceiver */
        USB_State.curr_cfg = 0;    /* Clear current configuration */
    }

    /* Check endpoints events */
    if(AT91C_UDP_EPINT0 & isr)
          EV_EP0Int();
    
    AT91C_BASE_AIC->AIC_ICCR  = 1 << AT91C_ID_UDP;
}

/*******************************************************************************
Control endpoint interrupt event
*******************************************************************************/
static void EV_EP0Int(void)
{    
      UINT32 csr;
        
    csr = AT91C_BASE_UDP->UDP_CSR[0];    /* Get endpoint status and check events */
    
    /* A setup data packet has been sent by the host and is available in the FIFO */
    if(AT91C_UDP_RXSETUP & csr)
        Enumerate();    /* Call USB routine (notify that setup paket received)*/
    
    /* Receive Data from Bank's */
    if(AT91C_UDP_RX_DATA_BK0 & csr)
    {    
          DBG_OUT("ISR EP0 RX0\r\n");    
          UDP_EP_CLR_FLAG(0, AT91C_UDP_RX_DATA_BK0);    /* Notify USB peripheral device that data have been read */    
        USB_State.tx_len[0] = 0;    /* Stop Tx transfer */
    }
    if(AT91C_UDP_RX_DATA_BK1 & csr)
    {    
          DBG_OUT("ISR EP0 RX1\r\n");    
          UDP_EP_CLR_FLAG(0, AT91C_UDP_RX_DATA_BK1);    /* Notify USB peripheral device that data have been read */
        USB_State.tx_len[0] = 0;    /* Stop Tx transfer */
    }
        
    /* Host get data from device complete */
    if(AT91C_UDP_TXCOMP & csr)
    {    
          DBG_OUT("ISR Tx Comp\r\n");
          
          /* The previous message received was SET_ADDR now that the computer ACK our send_null(),
        we can set this address for real */
        if(USB_State.dev_addr > 0)
        {    
              DBG_OUT("ISR: Set new address!\r\n");
              
              AT91C_BASE_UDP->UDP_FADDR = AT91C_UDP_FEN | USB_State.dev_addr;    /* Set specified usb address in the controller */
            AT91C_BASE_UDP->UDP_GLBSTATE = AT91C_UDP_FADDEN;    /* Tell the controller that we are in addressed mode now */
            USB_State.dev_addr = 0;
        }
        
        /* Send the following data */
         if(USB_State.tx_len[0] > 0 && USB_State.tx_data[0] != NULL)
            UDP_EP_Write(0, USB_State.tx_data[0], USB_State.tx_len[0]);    /* Send data */
        UDP_EP_CLR_FLAG(0, AT91C_UDP_TXCOMP);    /* Reset Tx complete */
    }
    
    if(AT91C_UDP_ISOERROR & csr)
    {    
          DBG_OUT("ISR EP0 ISO Err\r\n");
        UDP_EP_CLR_FLAG(0, AT91C_UDP_FORCESTALL | AT91C_UDP_ISOERROR);
    }
}

/*******************************************************************************
Write data to endpoint
*******************************************************************************/
void UDP_EP_Write(UINT8 ep, void *data, INT len)
{    
      P_UINT8 ptr;
      
      /* Get actual endpoint transfer size */
    UINT32 p_size = USB_State.ep_size[ep];

      /* If there is more data than can fit in a single packet, queue the rest up. */
      if(len > p_size)
    {
        len -= p_size;
        USB_State.tx_data[ep] = (P_UINT8)data + p_size;
        USB_State.tx_len[ep] = len;
      }
    else
    {
        p_size = len;
        USB_State.tx_data[ep] = NULL;
        USB_State.tx_len[ep] = 0;
      }
    
    DBG_OUT("UDP_EP_Write: Send %d bytes: ", p_size);
    
    UDP_EP_SET_FLAG(ep, AT91C_UDP_DIR);
    
    while(AT91C_BASE_UDP->UDP_CSR[ep] & AT91C_UDP_TXPKTRDY);
    
    /* Push a packet into the USB FIFO, and tell the controller to send. */
    ptr = (P_UINT8)data;
      while(p_size--)
        AT91C_UDP_FDR[ep] = *ptr++;
    
    UDP_EP_SET_FLAG(ep, AT91C_UDP_TXPKTRDY);
    
    if(AT91C_BASE_UDP->UDP_CSR[ep] & AT91C_UDP_TXCOMP)
        UDP_EP_CLR_FLAG(ep, AT91C_UDP_TXCOMP);
}

/*******************************************************************************
Stall endpoint
*******************************************************************************/
void UDP_EP_Stall(UINT8 ep)
{
      AT91C_BASE_UDP->UDP_CSR[ep] |= AT91C_UDP_FORCESTALL;
}


При приеме SETUP-пакета проверяю поле bmRequestType:
Код
if(req_type & USB_BMREQUEST_DIR_DEV_TO_HOST)
          UDP_EP_SET_FLAG(0, AT91C_UDP_DIR);    /* Set IN direction for endpoint */

/* Notify USB peripheral device that data have been read */
    UDP_EP_CLR_FLAG(0, AT91C_UDP_RXSETUP);


--------------------
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Timofey   SAM7x256 & USB   Jul 19 2009, 07:40
- - aaarrr   Кодif ((pUdp->UDP_CSR[AT91C_EP_OUT...   Jul 19 2009, 08:08
- - Timofey   Точно .... Мда, стыдно стало ... Спасибо. Тема зак...   Jul 19 2009, 08:23
- - aaarrr   В процедуре установки адреса криминала действитель...   Oct 29 2009, 12:47
|- - prottoss   Цитата(aaarrr @ Oct 29 2009, 19:47) Уж не...   Oct 29 2009, 13:06
|- - aaarrr   Цитата(prottoss @ Oct 29 2009, 16:06) Да ...   Oct 29 2009, 13:19
|- - prottoss   Цитата(aaarrr @ Oct 29 2009, 20:19) Распе...   Oct 29 2009, 14:19
|- - aaarrr   Цитата(prottoss @ Oct 29 2009, 17:19) Ну ...   Oct 29 2009, 15:04
|- - prottoss   Цитата(aaarrr @ Oct 29 2009, 22:04) Т.е. ...   Oct 29 2009, 15:31
- - aaarrr   Пардон, по невнимательности не понял источник проб...   Oct 29 2009, 15:56
|- - prottoss   Цитата(aaarrr @ Oct 29 2009, 22:56) Пардо...   Oct 29 2009, 16:16
- - sergeeff   В свое время, занимаясь отладкой USB на at91rm9200...   Oct 29 2009, 17:00
|- - prottoss   Цитата(sergeeff @ Oct 30 2009, 00:00) В с...   Oct 29 2009, 17:10
|- - aaarrr   Цитата(sergeeff @ Oct 29 2009, 20:00) В с...   Oct 29 2009, 17:12
|- - prottoss   Цитата(aaarrr @ Oct 30 2009, 00:12) Жжоте...   Oct 29 2009, 17:19
|- - aaarrr   Цитата(prottoss @ Oct 29 2009, 20:19) пол...   Oct 29 2009, 17:22
- - sergeeff   Увы, я нанятый работник на частной фирме. Посему к...   Oct 29 2009, 17:13
|- - prottoss   Цитата(sergeeff @ Oct 30 2009, 00:13) Увы...   Oct 29 2009, 17:21
- - aaarrr   2 prottoss: Еще присутствует косяк с передачей де...   Oct 29 2009, 17:20
|- - prottoss   Цитата(aaarrr @ Oct 30 2009, 00:20) Еще п...   Oct 29 2009, 17:29
- - sergeeff   Мои наблюдения показали, что в atmel'овских пр...   Oct 29 2009, 19:24
- - aaarrr   Главное не наступить на грабли, любезно предоставл...   Oct 29 2009, 21:10
|- - prottoss   Цитата(aaarrr @ Oct 30 2009, 04:10) Главн...   Oct 29 2009, 21:30
||- - aaarrr   Цитата(prottoss @ Oct 30 2009, 00:30) Ста...   Oct 29 2009, 21:37
||- - mikki   Цитата(prottoss @ Oct 30 2009, 01:30) Кур...   Oct 30 2009, 01:22
||- - AHTOXA   А фраза "чёрный кот" - скрытая пропаганд...   Oct 30 2009, 02:31
|- - overloaded   Цитата(aaarrr @ Oct 30 2009, 00:10) Испол...   Oct 31 2009, 03:23
|- - prottoss   Цитата(overloaded @ Oct 31 2009, 10:23) А...   Oct 31 2009, 05:51
||- - overloaded   Это я какраз видел.. И этот насколько я понимаю но...   Oct 31 2009, 14:59
||- - singlskv   Цитата(overloaded @ Oct 31 2009, 17:59) В...   Oct 31 2009, 15:42
|- - aaarrr   Цитата(overloaded @ Oct 31 2009, 06:23) А...   Oct 31 2009, 16:55
- - prottoss   Поднял наконец то на SAM7X USB полностью на прерыв...   Nov 8 2009, 19:45
|- - aaarrr   Цитата(prottoss @ Nov 8 2009, 22:11) Это ...   Nov 8 2009, 19:46
|- - prottoss   Цитата(aaarrr @ Nov 9 2009, 02:46) Вообще...   Nov 8 2009, 19:52
|- - aaarrr   Цитата(prottoss @ Nov 8 2009, 22:52) Где ...   Nov 8 2009, 20:05
|- - prottoss   Цитата(aaarrr @ Nov 9 2009, 03:05) По спе...   Nov 8 2009, 20:11
- - prottoss   Продолжение темы. Решил оптимизировать прием данны...   Dec 12 2009, 06:36
- - aaarrr   Напишите, как оно по-вашему должно работать, и как...   Dec 12 2009, 13:01
|- - prottoss   Цитата(aaarrr @ Dec 12 2009, 20:01) Напиш...   Dec 12 2009, 15:03
- - ZiB   Всем, день добрый! Прошу извинить что не много...   Dec 14 2009, 06:09
|- - aaarrr   Цитата(ZiB @ Dec 14 2009, 09:09) Можно ли...   Dec 14 2009, 14:16
|- - sonycman   Цитата(ZiB @ Dec 14 2009, 10:09) Можно ли...   Dec 14 2009, 20:57
- - ZiB   Если я правильно понимаю, то для режима Bulk макси...   Dec 15 2009, 03:28
|- - sonycman   Цитата(ZiB @ Dec 15 2009, 07:28) Если я п...   Dec 15 2009, 06:22
- - ZiB   Ух, разобрался. Согласно спецификации на USB 2.0 F...   Dec 15 2009, 09:50
|- - Maximm   Цитата(ZiB @ Dec 15 2009, 12:50) Ух, разо...   Jan 25 2011, 13:52
- - kichnamid   Прошу прощения за вклинивание в эту тему, может, п...   Feb 2 2011, 11:24
|- - Maximm   Цитата(kichnamid @ Feb 2 2011, 14:24) Про...   Feb 3 2011, 15:10
- - kichnamid   у меня к ножке DP сразу припаян пулап резистор. на...   Feb 4 2011, 10:28
- - kichnamid   выявил, что выставляется прерывание ENDBUS, resume...   Feb 14 2011, 11:33
- - MiDV   Может кто знает, как реализовать хост на SAM7X256....   Apr 1 2011, 07:23
- - aaarrr   Никак. Можно только подключить внешнюю микросхему ...   Apr 1 2011, 09:27
- - boyko-alexey   Люди, может кто поделится немудрёным кодом USB-MSD...   May 16 2011, 21:02
- - kovigor   Цитата(boyko-alexey @ May 17 2011, 00...   May 17 2011, 08:22
- - boyko-alexey   Цитата(kovigor @ May 17 2011, 12:22) Есть...   May 17 2011, 08:36
- - kovigor   Цитата(boyko-alexey @ May 17 2011, 11...   May 17 2011, 08:40
- - boyko-alexey   Цитата(kovigor @ May 17 2011, 12:40) По о...   May 17 2011, 08:53
- - kovigor   Цитата(boyko-alexey @ May 17 2011, 11...   May 17 2011, 09:23


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

 


RSS Текстовая версия Сейчас: 26th June 2025 - 19:50
Рейтинг@Mail.ru


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