|
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 29 2009, 05:28
|

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

|
Всем доброго времени суток. Не стал открывать новую тему, потому как название как раз для моей  С 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!  ; Отсылаю нулевой пакет. 6. Прерывание AT91C_UDP_TXCOMP; Очищаю. Далее три раза то же самое, и "Устройство USB работает не правильно... бла-бла-бла". Дескриптор устройства верный, опробованный, объявлен между #pragma pack(align 8) (компилятор IAR 5.4). Перелопатил все темы форума, связанные с SAM7 и USB по прерываниям. Все вроде правильно делаю, но, похоже что то не доделываю.  Ниже код прерывания и записи в конечную точку. Код /***************************************************************************** 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);
--------------------
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|