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

 
 
> at90usb1287 - малая скорость передачи по USB, Передача данных в режиме CDC USB
Mty
сообщение Nov 23 2010, 09:14
Сообщение #1


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

Группа: Свой
Сообщений: 151
Регистрация: 19-12-04
Из: Москва
Пользователь №: 1 560



Привет!

Необходимо за 0.1 сек передать с at90usb1287 в комп массив данных из 600 чисел типа int
Я пользуюсь для этого printf()

Код
    
while( buffindex < buffmax ){
printf( "%x %x\r\n", databuff[ buffindex ], databuff[ buffindex + 1 ] );  
buffindex += 2;
}


И получаю очень малую скорость - порядка 100 байт за 0.1 секунды.
А нужно порядка 20 килобайт в секунду.
Посоветуйте, как можно увеличить скорость, что я делаю не так?

За основу я взял AT90USBxxx CDC demonstration с сайта Atmel.
Функцию вывода буффера я поместил в функцию cdc_task()

Спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Xenia
сообщение Nov 25 2010, 00:02
Сообщение #2


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



А вы еще "double bank mode" включите (это в конфигурации конечных точек), если до сих пор этого не сделали. Еще быстрее станет.

А то в демонструхе установлен ONE_BANK мод.
Это функция usb_user_endpoint_init() в файле usb_specific_request.c
там надо заменить ONE_BANK на TWO_BANK для точек TX_EP и RX_EP (2-ой и 3-ий вызовы usb_configure_endpoint()), а точку INT_EP оставить, как была (1-ый вызов usb_configure_endpoint()).

После этого прогоните свой тест снова. Напишите, что изменилось. Возможно, что тогда при 80байтах буфер перестанет дробиться.
Go to the top of the page
 
+Quote Post
Mty
сообщение Nov 25 2010, 08:36
Сообщение #3


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

Группа: Свой
Сообщений: 151
Регистрация: 19-12-04
Из: Москва
Пользователь №: 1 560



Цитата(Xenia @ Nov 25 2010, 03:02) *
А вы еще "double bank mode" включите (это в конфигурации конечных точек), если до сих пор этого не сделали. Еще быстрее станет.

После этого прогоните свой тест снова. Напишите, что изменилось. Возможно, что тогда при 80байтах буфер перестанет дробиться.


Спасибо за идею, в моей версии библиотек (USBKEY_STK525-series6-cdc-2_0_3-doc.zip) похоже уже включен double bank mode.


Код
  usb_configure_endpoint(TX_EP,         \
                         TYPE_BULK,     \
                         DIRECTION_IN,  \
                         SIZE_64,       \
                         TWO_BANKS,     \
                         NYET_ENABLED);



Цитата(shrek @ Nov 25 2010, 10:08) *
Получается за кадр, период которого 1 мс, full-speed девайс может передать максимум 64 байта и это получается 64 килобайта в секунду или 512000 бит в секунду в одну сторону.


А как получается что mass storage работает на скоростях гораздо больше 60кб/сек? Там используется BULK?
Насколько я помню USB флешки на USB 1.1 выдают скорость около мегабайта в секунду.
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Nov 25 2010, 08:48
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(Mty @ Nov 25 2010, 12:36) *
А как получается что mass storage работает на скоростях гораздо больше 60кб/сек? Там используется BULK?
Насколько я помню USB флешки на USB 1.1 выдают скорость около мегабайта в секунду.


Это всё получается потому, что для BULK-передач отводится всё свободное время на шине. Если нет SETUP/ISO/INTERRUPT-передач и есть заполненные BULK EPs то USB-host будет считывать данные из них постоянно по мере их заполнения. За 1 мС BULK EP может быть заполненной и считанной несколько раз. Помогает повышению скорости двойная буфферизация.
Go to the top of the page
 
+Quote Post
shrek
сообщение Nov 25 2010, 13:02
Сообщение #5


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

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



Цитата(mempfis_ @ Nov 25 2010, 11:48) *
Это всё получается потому, что для BULK-передач отводится всё свободное время на шине. Если нет SETUP/ISO/INTERRUPT-передач и есть заполненные BULK EPs то USB-host будет считывать данные из них постоянно по мере их заполнения. За 1 мС BULK EP может быть заполненной и считанной несколько раз. Помогает повышению скорости двойная буфферизация.


А разве передача данных из точки или в точку не начинается по маркер пакету SOF?
По идее хост прислал мне SOF, потом шлет пакет с адресом конечной точки и функцией и направлением передачи, после этого если в буфере данные имелись то передаются данные. После передачи по идее хост должен прислать подтверждение. Вроде бы все передачи начинаются после "команды" хоста. Или в течении кадра 1 мс можно окромя 64 байт всунуть еще? например меняя DATA0 на DATA1 и наоборот?

Нда... оказывается так и делается... получается по теории 7 с лишним мегабит в одну сторону... 05.gif
Значит виндовый драйвер CDC можно разогнать на более чем 64 килобайта в сек)))
С другой стороны как именно организовать передачу непрерывную со сменой PID пакета... Это уже програмные проблемы...
Хотя когда я отправлял с компа данные больше 64 байт они за раз и отправлялись без подтверждений и т.д. хотя я конкретно не смотрел при отладке в течении кадра они принялись и не смотрел PID данных data0 или data1...

По проведенным только что опытам он за раз в течении кадра смог принять 1024 байта!!! Получается 8192000 мегабит в сек... blink.gif При попытке отправить ему 1025 байт уходит в непонятное зацикливание по прерываниям причем генерится перрывание и по данным банка 0 и по данным банка 1... Я хосту случайно ничего не должен отправить?... Или хост получается не разбивает отправленные байты на транзакции... Пытается все за раз отправить)))

Сообщение отредактировал shrek - Nov 25 2010, 13:17
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Nov 25 2010, 13:32
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(shrek @ Nov 25 2010, 17:02) *
С другой стороны как именно организовать передачу непрерывную со сменой PID пакета... Это уже програмные проблемы...


С at90usb не работал. Нужно смотреть какой тип EP в нём есть - с двойной буфферизацией или без. По поводу пакетов дата0/дата1 - этим занимается usb-контроллер. Ваша задача дождаться освобождения одного из буфферов конечных точек и заполнить соответствующий. Не забудьте что если длина данных кратна размеру конечной точки то надо слать пакет нулевой длины для того, чтобы показать хосту что закончилась передача данных.
Go to the top of the page
 
+Quote Post
shrek
сообщение Nov 25 2010, 13:37
Сообщение #7


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

Группа: Участник
Сообщений: 125
Регистрация: 1-12-08
Из: г. Орел
Пользователь №: 42 126



Цитата(mempfis_ @ Nov 25 2010, 16:32) *
С at90usb не работал. Нужно смотреть какой тип EP в нём есть - с двойной буфферизацией или без. По поводу пакетов дата0/дата1 - этим занимается usb-контроллер. Ваша задача дождаться освобождения одного из буфферов конечных точек и заполнить соответствующий. Не забудьте что если длина данных кратна размеру конечной точки то надо слать пакет нулевой длины для того, чтобы показать хосту что закончилась передача данных.

Ну вообще в AT91SAM7A3 контроллер этим не занимается по моему... Только вручну устанавливая и сбрасывая бит... Забрел в эту тему из-за того, что обсуждался крайне важный вопрос скорости передачи данных по USB CDC)))

Сообщение отредактировал shrek - Nov 25 2010, 13:38
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Mty   at90usb1287 - малая скорость передачи по USB   Nov 23 2010, 09:14
- - Xenia   А приём-то у вас работает? А то как-то странно: pr...   Nov 23 2010, 09:28
|- - Mty   Цитата(Xenia @ Nov 23 2010, 12:28) А приё...   Nov 23 2010, 09:43
|- - shrek   Цитата(Mty @ Nov 23 2010, 12:43) Да, рабо...   Nov 23 2010, 18:20
|- - Mty   Цитата(shrek @ Nov 23 2010, 21:20) А вы б...   Nov 24 2010, 08:55
||- - zhevak   Цитата(Mty @ Nov 24 2010, 13:55) Попробов...   Nov 24 2010, 09:19
|- - mempfis_   Цитата(shrek @ Nov 23 2010, 22:20) Сам ст...   Nov 24 2010, 09:23
|- - shrek   Цитата(mempfis_ @ Nov 24 2010, 12:23) Это...   Nov 25 2010, 07:08
- - kovigor   Цитата(Mty @ Nov 23 2010, 13:14) А нужно ...   Nov 23 2010, 09:33
- - zhevak   Цитата(Mty @ Nov 23 2010, 14:14) И получа...   Nov 23 2010, 10:11
|- - Xenia   Цитата(zhevak @ Nov 23 2010, 13:11) К ста...   Nov 23 2010, 11:57
||- - demiurg_spb   Передавайте бинарный массив сразу без всяких print...   Nov 23 2010, 12:00
|||- - MrYuran   Цитата(demiurg_spb @ Nov 23 2010, 15:00) ...   Nov 23 2010, 12:09
|||- - Mty   Цитата(demiurg_spb @ Nov 23 2010, 15:00) ...   Nov 23 2010, 13:14
|||- - zhevak   Цитата(Mty @ Nov 23 2010, 18:14) Спасибо....   Nov 23 2010, 13:59
||- - zhevak   Цитата(Xenia @ Nov 23 2010, 16:57) Есть г...   Nov 23 2010, 12:24
||- - Xenia   Цитата(zhevak @ Nov 23 2010, 15:24) Знает...   Nov 23 2010, 12:45
|- - Mty   Цитата(zhevak @ Nov 23 2010, 13:11) Отдел...   Nov 23 2010, 12:44
- - ARV   а вы не рассматривали такую возможность: в WinAVR ...   Nov 24 2010, 09:51
|- - Mty   Цитата(ARV @ Nov 24 2010, 12:51) а вы не ...   Nov 24 2010, 20:37
- - Mty   Цитата(mempfis_ @ Nov 25 2010, 11:48) Это...   Nov 25 2010, 10:28
- - mempfis_   Цитата(shrek @ Nov 25 2010, 17:37) Ну воо...   Nov 25 2010, 13:53


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

 


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


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