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

 
 
> 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
сообщение Dec 12 2009, 06:36
Сообщение #2


Гуру
******

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



Продолжение темы.
Решил оптимизировать прием данных от хоста. Ранее я выгребал полностью данные из точки в софтовый ФИФО, а из него задача выгребала данных столько, сколько ей нужно. Решил избавиться от софтового буфера и забирать данные, сколько необходимо, сразу из конечной точки. При этом, если нужно данных меньше, чем находится в буфере точки, то не сбрасывать флаг приема (AT91C_UDP_RX_DATA_BK0/1) а просто запрещать прерывания. Что то опять туплю к выходным, ни как не выходит...

Описание конечной точки:
Код
/* Endpoint status setup */
typedef struct __UDP_EP_STATUS
{    
      INT size;        /* EP FIFO size */
    UINT32 type;    /* EP type (for store in CSR register) */
    UINT32 imask;    /* Interrupt flag in the IMR register (for enable/disable interrupt) */
    UINT32 banks;    /* Current receive bank for OUT endpoint, number of TX FIFO's for IN endpoint */
    
    P_UINT8 data;    /* Data buffer pointer */
    INT len;        /* Data size in buffer */
    INT inbuf;        /* For RX data count of buffered data */
    void (*fcbk)(void);    /* Optional transfer complete callback function */
    
} UDP_EP_STATUS, *P_UDP_EP_STATUS;


Обработчик прерывания по приему
Код
/* Receive Data from host host complete */
    if((AT91C_UDP_RX_DATA_BK0 | AT91C_UDP_RX_DATA_BK1) & csr)
    {    
        DBG_OUT("CSR%d RX: ", ep);
        if(p_eps->data)    /* Endpoint is in read state */
        {    
              if(p_eps->inbuf > 0)    /* Old EP FIFO not be fully readed */
                  cnt = p_eps->inbuf;
            else
                  cnt = (AT91C_UDP_RXBYTECNT & csr) >> 16;    /* Get data counter */
            
            if(p_eps->len >= cnt)    /* Room for new data exist */
            {
                p_eps->len -= cnt;    /* Add data to be readed */
                for(i = 0; i < cnt; i++)    /* Read new data */
                    *p_eps->data++ = AT91C_BASE_UDP->UDP_FDR[ep];
                p_eps->inbuf = 0;    /* No data in FIFO */
                ClrRxFlag(ep, p_eps);    /* Notify USB peripheral device that data have been read */
            }
            else    /* No room for all received bank */
            {    
                  p_eps->inbuf = cnt - p_eps->len;    /* Store number of bytes in EP FIFO */
                for(i = 0; i < p_eps->len; i++)    /* Read new data */
                    *p_eps->data++ = AT91C_BASE_UDP->UDP_FDR[ep];
                p_eps->len = 0;
            }
            
            /* Check read complete */
            if(!p_eps->len || cnt < p_eps->size)    /* OK */
            {
                p_eps->data = NULL;
                AT91C_BASE_UDP->UDP_IDR = p_eps->imask;    /* disable interrupt */
                if(p_eps->fcbk)    /* Call Rx Complete application callback */
                    p_eps->fcbk();
            }
        }
        else    /* Data buffer not set - application not wating data */
        {    
              DBG_OUT("NAK! Data buffer not set.\r\n");
            AT91C_BASE_UDP->UDP_IDR = p_eps->imask;    
        }
    }


Собственно попытка чтения
Код
/*******************************************************************************
Read data from endpoint
*******************************************************************************/
INT UDP_EP_Read(UINT8 ep, void *data, INT len, void (*fcbk)(void))
{    
      P_UDP_EP_STATUS p_eps;
        
    DBG_OUT("UDP_EP%d_Read: ", ep);
    
    if(!g_State.curr_cfg)    /* Check UDP device state */
    {    
          DBG_OUT("Device not configured!\r\n");
          return FALSE;    /* Not configured */
    }
    
    if(!ep || ep >= UDP_NUM_EP)    /* Check enpoint number */
    {    
          DBG_OUT("Invalid number %d!\r\n", ep);
          return FALSE;
    }
    
    p_eps = g_State.ep[ep];    /* Get endpoint status */
    if(!p_eps)    /* Check endpoint parameters */
    {    
          DBG_OUT("ep not inited!\r\n");
        return FALSE;
    }
    
    if(p_eps->data)
    {    
          DBG_OUT("ep busy!\r\n");
        return FALSE;
    }
    
    /* Set data fields */
    p_eps->data = data;
    p_eps->len = len;
    p_eps->fcbk = fcbk;
    
    AT91C_BASE_UDP->UDP_IER = p_eps->imask;        /* Enable interrupts from endpoint */
    DBG_OUT("\r\n");
    return TRUE;    /* Success */
}


--------------------
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
- - prottoss   Всем доброго времени суток. Не стал открывать нову...   Oct 29 2009, 05:28
- - 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
- - 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 Текстовая версия Сейчас: 9th August 2025 - 06:25
Рейтинг@Mail.ru


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