реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Передача массива через bulk-точку, Не удается послать больше одного пакета данных за фрейм.
Maximm
сообщение Jan 25 2011, 12:34
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 157
Регистрация: 7-10-07
Из: Санкт-Петербург
Пользователь №: 31 137



Пришла пора подключить 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 работаю совсем недавно, поэтому наверное много еще не понимаю.


--------------------
Если работает через раз - значит не работает!
Go to the top of the page
 
+Quote Post
Maximm
сообщение Feb 8 2011, 01:50
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 157
Регистрация: 7-10-07
Из: Санкт-Петербург
Пользователь №: 31 137



Разобрался я с 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


Может кому-нибудь пригодиться эта информация.


--------------------
Если работает через раз - значит не работает!
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 02:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.01341 секунд с 7
ELECTRONIX ©2004-2016