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

 
 
> 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
Ответов
aaarrr
сообщение Oct 29 2009, 21:10
Сообщение #2


Гуру
******

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



Главное не наступить на грабли, любезно предоставленными фирмой Атмел в своих "библиотечках", не к ночи будь помянуты.
Использование такого вот макроса при разрешенных прерываниях может вызвать феерический глюкодром:
Код
// \brief  Clear flags in the UDP_CSR register and waits for synchronization
// \param  pUsb      Pointer to a S_usb instance
// \param  bEndpoint Index of endpoint
// \param  dFlags    Flags to clear
#define UDP_CLEAREPFLAGS(pUsb, bEndpoint, dFlags) { \
    while (!ISCLEARED(UDP_GetDriverInterface(pUsb)->UDP_CSR[bEndpoint], dFlags)) \
        CLEAR(UDP_GetDriverInterface(pUsb)->UDP_CSR[bEndpoint], dFlags); \
}
Go to the top of the page
 
+Quote Post
overloaded
сообщение Oct 31 2009, 03:23
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 73
Регистрация: 17-10-07
Из: Киев
Пользователь №: 31 422



Цитата(aaarrr @ Oct 30 2009, 00:10) *
Использование такого вот макроса при разрешенных прерываниях может вызвать феерический глюкодром:
.....
#define UDP_CLEAREPFLAGS(pUsb, bEndpoint, dFlags) { \
.....


А можно по подробнее пожалуйста, где такое чудо встречается? Я в USB Framework не нашел такого макроса..
Go to the top of the page
 
+Quote Post
prottoss
сообщение Oct 31 2009, 05:51
Сообщение #4


Гуру
******

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



Цитата(overloaded @ Oct 31 2009, 10:23) *
А можно по подробнее пожалуйста, где такое чудо встречается? Я в USB Framework не нашел такого макроса..

Код
/* Clear flags of UDP UDP_CSR register and waits for synchronization */
#define UDP_EP_CLR_FLAG(ep, f) { AT91C_BASE_UDP->UDP_CSR[ep] &= ~(f); while(AT91C_BASE_UDP->UDP_CSR[ep] & (f)); }

/* Set flags of UDP UDP_CSR register and waits for synchronization */
#define UDP_EP_SET_FLAG(ep, f) { AT91C_BASE_UDP->UDP_CSR[ep] |= (f); while((AT91C_BASE_UDP->UDP_CSR[ep] & (f)) != (f)); }


Выдержка из даташита на SAM7X (В других AT91, имеющих на борту блок UDP)
Цитата
WARNING: Due to synchronization between MCK and UDPCK, the software application must wait for the end of the write
operation before executing another write by polling the bits which must be set/cleared.
//! Clear flags of UDP UDP_CSR register and waits for synchronization
#define Udp_ep_clr_flag(pInterface, endpoint, flags) { \
pInterface->UDP_CSR[endpoint] &= ~(flags); \
while ( (pInterface->UDP_CSR[endpoint] & (flags)) == (flags) ); \
}
//! Set flags of UDP UDP_CSR register and waits for synchronization
#define Udp_ep_set_flag(pInterface, endpoint, flags) { \
pInterface->UDP_CSR[endpoint] |= (flags); \
while ( (pInterface->UDP_CSR[endpoint] & (flags)) != (flags) ); \
}
Note: In a preemptive environment, set or clear the flag and wait for a time of 1 UDPCK clock cycle and 1peripheral clock cycle. How-
ever, RX_DATA_BLK0, TXPKTRDY, RX_DATA_BK1 require wait times of 3 UDPCK clock cycles and 3 peripheral clock cycles
before accessing DPR.


--------------------
Go to the top of the page
 
+Quote Post
overloaded
сообщение Oct 31 2009, 14:59
Сообщение #5


Участник
*

Группа: Свой
Сообщений: 73
Регистрация: 17-10-07
Из: Киев
Пользователь №: 31 422



Это я какраз видел.. И этот насколько я понимаю нормальный в отличии от того что привел aaarrr(там постоянно пишем регистр а не раз записали и ждем его изменения). Вот и интересно где тот вариант встречается).
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
|- - 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
||- - 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 Текстовая версия Сейчас: 18th August 2025 - 15:51
Рейтинг@Mail.ru


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