|
SAM7x256 & USB |
|
|
|
Jul 19 2009, 07:40
|
Частый гость
 
Группа: Участник
Сообщений: 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); } обнаружилось, что данные все таки доходят до микроконтроллера, а вот он на комп ничего не отправляет. убирая строчку чтения, получаем, что данные на комп все таки идут
|
|
|
|
|
 |
Ответов
|
Oct 31 2009, 03:23
|
Участник

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

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

Гуру
     
Группа: Свой
Сообщений: 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.
--------------------
|
|
|
|
|
Oct 31 2009, 14:59
|
Участник

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

|
Это я какраз видел.. И этот насколько я понимаю нормальный в отличии от того что привел aaarrr(там постоянно пишем регистр а не раз записали и ждем его изменения). Вот и интересно где тот вариант встречается).
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|