|
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); } обнаружилось, что данные все таки доходят до микроконтроллера, а вот он на комп ничего не отправляет. убирая строчку чтения, получаем, что данные на комп все таки идут
|
|
|
|
|
 |
Ответов
(45 - 58)
|
Dec 15 2009, 09:50
|

Частый гость
 
Группа: Свой
Сообщений: 122
Регистрация: 26-07-05
Из: Россия, Томск
Пользователь №: 7 109

|
Ух, разобрался. Согласно спецификации на USB 2.0 Full Speed максимальная пропускная способность канала в режиме Bulk 1 216 000 байт в секунду, у меня получилось чуть меньше, так как от начала фрейма до начала передачи есть не большая пауза. Но для меня не так критично. Сейчас летает гарантированно 512 000 байт в секунду, часик потестил
|
|
|
|
|
Jan 25 2011, 13:52
|
Частый гость
 
Группа: Свой
Сообщений: 157
Регистрация: 7-10-07
Из: Санкт-Петербург
Пользователь №: 31 137

|
Цитата(ZiB @ Dec 15 2009, 12:50)  Ух, разобрался. Согласно спецификации на USB 2.0 Full Speed максимальная пропускная способность канала в режиме Bulk 1 216 000 байт в секунду, у меня получилось чуть меньше, так как от начала фрейма до начала передачи есть не большая пауза. Но для меня не так критично. Сейчас летает гарантированно 512 000 байт в секунду, часик потестил  Это Вы получили такие скорости для CDC-устройства на драйвере usbser.sys? Читал на форумах, что этот драйвер тормозной достаточно, и его заранее нужно нагружать из пользовательского приложения, чтобы хост запланировал больше транзакций....
--------------------
Если работает через раз - значит не работает!
|
|
|
|
|
Feb 2 2011, 11:24
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 25-01-11
Из: Москва
Пользователь №: 62 467

|
Прошу прощения за вклинивание в эту тему, может, поможете. Взял пример, идущий всместе с Keil'ом, передача данных черех HID-устройство для AT91SAM7S64. Переделал чуток дескриптор и отладил на SAM7256-EK плате. При прошивке своего уже МК Windows не опознаёт USB-устройство. В проекте поменял только стартап в плане частоты и PLL, клок на UDP идёт правильный 48MHz. В чём может быть подвох?
|
|
|
|
|
Feb 3 2011, 15:10
|
Частый гость
 
Группа: Свой
Сообщений: 157
Регистрация: 7-10-07
Из: Санкт-Петербург
Пользователь №: 31 137

|
Цитата(kichnamid @ Feb 2 2011, 14:24)  Прошу прощения за вклинивание в эту тему, может, поможете.
В чём может быть подвох? Схемы подключение шины USB к МК на вашей плате и на отладке аналогичные?
--------------------
Если работает через раз - значит не работает!
|
|
|
|
|
Feb 4 2011, 10:28
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 25-01-11
Из: Москва
Пользователь №: 62 467

|
у меня к ножке DP сразу припаян пулап резистор. на отладочной схеме первоначально он подключался через транзистор, управляемый PA16 программно. но на отладочной я закоротил транзистор, и там теперь также как у меня. величины элементов взял один в один с отладочной.
единственный момент: у меня на USB разъёме перепутаны были 2 и 3 ножка, т.е. DP и DM цепи, но это исправил. всё равно устройство не распознаётся.
ещё заметил: если в стартапе к отладочному проекту отключить код для Flash-конроллера №0, устройство не опознаётся и на отладочной плате.
|
|
|
|
|
Feb 14 2011, 11:33
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 25-01-11
Из: Москва
Пользователь №: 62 467

|
выявил, что выставляется прерывание ENDBUS, resume и suspend в UDP_ISR. А вот прерывание нулевой конечной точки (младший бит в UDP_ISR) нет, хотя МК должен выставлять прерывание сам. На отладочной плате, прерывание есть. Что может быть не так?!
|
|
|
|
|
Apr 1 2011, 07:23
|
Участник

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

|
Может кто знает, как реализовать хост на SAM7X256. Поделитесь инфой, плиз.
|
|
|
|
|
May 16 2011, 21:02
|
Группа: Участник
Сообщений: 10
Регистрация: 28-02-09
Пользователь №: 45 475

|
Люди, может кто поделится немудрёным кодом USB-MSD-MMC для at91sam7? Заранее благодарен
|
|
|
|
|
May 17 2011, 08:36
|
Группа: Участник
Сообщений: 10
Регистрация: 28-02-09
Пользователь №: 45 475

|
Цитата(kovigor @ May 17 2011, 12:22)  Есть такое, но только для SAM9 и SD (MMC я не поддерживал) Да ММС и не надо, а с SAM9 по SPI или MCI? Хотя плевать - главное принцип записи\чтения флешки
|
|
|
|
|
May 17 2011, 08:53
|
Группа: Участник
Сообщений: 10
Регистрация: 28-02-09
Пользователь №: 45 475

|
Цитата(kovigor @ May 17 2011, 12:40)  По обычной 4-разрядной SD BUS Значит MCI(memory card interface) Дайте, пожалуйста. Думаю, разберусь. Ковыряюсь для себя, сделал просмотр на ls020 BMP иJPEG(исходник jpeg от пользователя DpInRock подправил, умещается в SAM7S64 свободно) теперь хочу их заливать через USB. Аппетит растёт
Сообщение отредактировал boyko-alexey - May 17 2011, 08:55
|
|
|
|
|
May 17 2011, 09:23
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(boyko-alexey @ May 17 2011, 11:53)  Значит MCI(memory card interface) Дайте, пожалуйста. Думаю, разберусь. Ковыряюсь для себя, сделал просмотр на ls020 BMP иJPEG(исходник jpeg от пользователя DpInRock подправил, умещается в SAM7S64 свободно) теперь хочу их заливать через USB. Аппетит растёт  Адресок бы ... Вот: http://zalil.ru/31056631За паролем обращайтесь ко мне: kovigor@yahoo.com
Сообщение отредактировал kovigor - May 17 2011, 09:59
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|