Цитата(aaarrr @ Dec 2 2009, 18:48)

Ставится, естественно. И на каком графике это не так?
6175I–ATARM–24-Dec-08
Figure 35-8. Data IN Transfer for Ping-pong Endpoint
Картинку прикладываю.
Наверное корректнее было фразу сформулировать так:
На графике видно что после первой установки TX_PKTRDY флаг TX_COMP взводится когда TX_PKTRDY уже сброшен и очистить этот флаг
нельзя.Цитата(aaarrr @ Dec 2 2009, 18:48)

Код
AT91C_BASE_UDP->UDP_CSR[2] |= AT91C_UDP_TXPKTRDY; // передаем
AT91C_BASE_UDP->UDP_CSR[2] &= ~(AT91C_UDP_TXCOMP); // обязательно сбрасываем
Так делать нельзя - нужно в обязательном порядке дождаться установки TXPKTRDY, иначе он будет сброшен вместе с TXCOMP.
Я пробовал и такой вариант:
Код
while (AT91C_BASE_UDP->UDP_CSR[2] & AT91C_UDP_TXPKTRDY);
TXcount=64;
while (TXcount--) AT91C_BASE_UDP->UDP_FDR[2] = *bufer++;
AT91C_BASE_UDP->UDP_CSR[2] |= AT91C_UDP_TXPKTRDY;
while (!(AT91C_BASE_UDP->UDP_CSR[2] & AT91C_UDP_TXPKTRDY));
while (!(AT91C_BASE_UDP->UDP_CSR[2] & AT91C_UDP_TXCOMP));
AT91C_BASE_UDP->UDP_CSR[2] &= ~(AT91C_UDP_TXCOMP);
while (AT91C_BASE_UDP->UDP_CSR[2] & AT91C_UDP_TXCOMP);
Одиночные пересылки проходят успешно.
Пересылка 7 пакетов проходит только один раз.
Из алгоритма явно видно что при первом вызове функции сброс TXCOMP произойдет при низком уровне TXPKTRDY.
Цитата(aaarrr @ Dec 2 2009, 18:48)

И зачем вводить какие-то программные счетчики банков?
Работа с двумя банками на передачу предельно проста:
1. Загружаем в FIFO самый первый пакет, ставим TXPKTRDY, переходим к п.2
2. Загружаем в FIFO следующий пакет, переходим к п.3
3. Ждем установки TXCOMP, ставим TXPKTRDY, снимаем TXCOMP, переходим к п.2
И все.
Во первых вы нарисовали бесконечный цикл. ;-)
Что в реальных проектах бывает очень редко.
В указаном алгоритме при выходе из цикла в UDP остается не переданные данные.
После передачи которых будет взведен флаг TXCOMP.
При повторном вызове в пункте 3 получается неоднозначность:
TXCOMP это оставшийся от прошлой передачи или "свежий"?
---------------------
P.S.
Может я не там копаю?
http://www.embeddedrelated.com/groups/AT91SAM/show/3815.phpВопросI have usbsniffers and can view my bulk out endpoint working
correctly. When i transmit a character out of the hyperterm I can
view it using a breakpoint at my bulk out int handler. I then put
this character into UDPRegisters->UDP_FDR[AT91C_EP_IN] and set
AT91C_UDP_TXPKTRDY.
It works once then stops transmitting. TXPKTRDY
never clears TXCOMP interrupt never fires.РешениеYes, you do.

> // Endpoint 1 descriptor
> 0x07, // bLength
> 0x05, // bDescriptorType
> 0x83, // bEndpointAddress, Endpoint 01 - IN 333333
> 0x03, // bmAttributes INT
> 0x0a, // wMaxPacketSize
> 0x00,
> 0x00, // bInterval
The comment is wrong, this is an Endpoint 3 (the 4th endpoint)
descriptor, and it's being configured as an interrupt in. I believe
the interrupt in is required for the serial class driver whether you
use it or not (I'm not 100% sure about that).
Now make sure you have something like this in the init code:
pUDP->UDP_CSR[3] = AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_INT_IN;
That was the line that got me. I believe it was originally
indicating that endpoint 3 was an ISO endpoint.
У меня объявлены в дескрипторе только две конечные точки в режиме bulk.
Их я и инициализирую и управляю.
Я пробовал вставлять в код инициализации pUDP->UDP_CSR[3] = AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_INT_IN
Но безрезультатно.
Может конечную точку нужно "заглушить" по другому?
Эскизы прикрепленных изображений