Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Передача массива через bulk-точку
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > AVR32
Maximm
Пришла пора подключить USB в AVR32, написал тестовое приложение на основе примера из SF 1.7, для примерной оценки скорости при передачи данных на хост при работе без прерываний и DMA. Приложение тестирую в RealTerm, устройство CDC с драйвером usbser.

Скорость передачи получилась ровно 64 Кб/с, что означает, что происходит одна транзакция передачи данных на хост за фрейм.

Проверил не приходит ли NAK от хоста - нет не приходит.

Прилагаю код:
Код
while(1)
{
       // Проверяем не пришел ли NAK от хоста
       if (Is_usb_nak_in(TX_EP))
            PORT0->ovrc = 0x00000100;
       // Ждем освобождения буфера                             
       PORT0->ovrs = 0x00000010;
       while( !Is_usb_in_ready(TX_EP) );
       PORT0->ovrc = 0x00000010;

       Usb_reset_endpoint_fifo_access(TX_EP);
       // Сбрасываем TXINI
       Usb_ack_in_ready(TX_EP);
       // Записываем данные в буфер - 64 байта, равно размеру конечной точки
       Usb_write_endpoint_data(TX_EP, 16, Data[0]);
       Usb_write_endpoint_data(TX_EP, 16, Data[1]);
       Usb_write_endpoint_data(TX_EP, 16, Data[2]);
       Usb_write_endpoint_data(TX_EP, 16, Data[3]);
       // Отсылаем данные из буфера
       Usb_ack_fifocon(TX_EP);
       
}


Конечная точка с двойным буфферизированием, по после сброса FIFOCON на второй банк не переключаемся, так TXINI не устанавливается..

Уважаемые знатоки AVR32 и USB, подскажите, что я делаю не так, может подтверждение приёма данных от хоста обрабатывать нужно?
Или может вообще проблема в драйвере usbser, читал на форму, что он очень медленный и его надо нагружать заранее, чтобы хост планировал больше bulk транзакций....сам с USB работаю совсем недавно, поэтому наверное много еще не понимаю.
Maximm
Разобрался я с CDC-устройством на AVR32:

Цитата(Maximm @ Jan 25 2011, 15:34) *
Код
{
       // Записываем данные в буфер - 64 байта, равно размеру конечной точки
       Usb_write_endpoint_data(TX_EP, 16, Data[0]);
       Usb_write_endpoint_data(TX_EP, 16, Data[1]);
       Usb_write_endpoint_data(TX_EP, 16, Data[2]);
       Usb_write_endpoint_data(TX_EP, 16, Data[3]);
       // Отсылаем данные из буфера
       Usb_ack_fifocon(TX_EP);
       
}


Тут я допустил досадную ошибку, конечно же я записывал не 64 байта в буфер конечной кочки, поэтому IN запросы приходили только раз в 1 мс.

В терминалке Realterm так и не получилось оттестировать устройство, как-то странно она работает с данными, передаваемыми на большой скорости, и видимо подвешивает драйвер CDC, после передачи 20-200 КБайт (по разному всегда) данных процесс приема данных на хосте прекращается почему-то...

Написал собственное маленькие приложение для приема данных и всё заработало как надо, максимальная скорость передачи на хост составила порядка 700 Кбайт/с. Это без прерываний и использования DMA, только с двойной буферизацией конечной точки.
Для стабильной работы приложения и передачи данных нужно изменить значение таймаута ReadTotalTimeoutConstant для соответствующего COM-порта через WINAPI функции и структуру:

Код
GetCommTimeouts(....
SetCommTimeouts(....
COMMTIMEOUTS


Может кому-нибудь пригодиться эта информация.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.