|
STM32F2xx USB FS CDC, Достижение максимальной пропускной способности |
|
|
|
Apr 28 2013, 08:01
|
Частый гость
 
Группа: Участник
Сообщений: 144
Регистрация: 28-08-07
Пользователь №: 30 111

|
Пытаюсь разобраться с работой USB full-speed в STM32 на примере USB CDC от ST из STM32_USB-Host-Device_Lib_V2.1.0. Хочу добиться скорости 800кБ/с передачи в одну сторону от устройства до ПК. Использую драйвер VCP_V1.3.1 от ST. Работаю с STM32F205RBT6. Прием/передача нормально работают, но хочется выжать максимальную пропускную способность в одном направлении (от устройства к ПК). И здесь возникли трудности, не удается получить более 740кБ/с (чуть меньше половины от максимальной пропускной способности USB FS). В пример внес изменения: Код #define CDC_IN_FRAME_INTERVAL 0 /* Number of frames between IN transfers */ #define APP_RX_DATA_SIZE 32768 /* Total size of IN buffer: */ В основном цикле отправляю данные со скоростью 1МБ/с: Код uint32_t cnt = 0; uint32_t value = 4; while (1) { // Запуск отсчета задержки value мс TIM2->PSC = (2*30000000/1000)/((value == 1) ? 2 : 1)-1; //настроить делитель для формирования милисекунд TIM2->ARR = (value == 1) ? 1 : (value-1); //загрузить значение задержки TIM2->CNT = 0; TIM2->EGR = TIM_EGR_UG; TIM2->SR &= ~TIM_SR_UIF; TIM2->CR1 = TIM_CR1_OPM | TIM_CR1_CEN; //запустить таймер
for (uint32_t j = 0; j < 1024; j++) { APP_Rx_Buffer[APP_Rx_ptr_in++] = ((uint8_t*)&(cnt))[3]; APP_Rx_Buffer[APP_Rx_ptr_in++] = ((uint8_t*)&(cnt))[2]; APP_Rx_Buffer[APP_Rx_ptr_in++] = ((uint8_t*)&(cnt))[1]; APP_Rx_Buffer[APP_Rx_ptr_in++] = ((uint8_t*)&(cnt))[0]; cnt++; } if(APP_Rx_ptr_in == APP_RX_DATA_SIZE) { APP_Rx_ptr_in = 0; }
while((TIM2->SR & TIM_SR_UIF)==0){} //дождаться конца задержки TIM2->SR &= ~TIM_SR_UIF; //сбросить флаг } Здесь идет запись в буфер раз в 4мс по 4096б, при этом достигается скорость 740кБ/с. Если записывать в буфер раз в 2мс по 2048б, при этом достигается скорость 660кБ/с. При записи в буфер меньшими объемами, но чаще, например каждую 1мс по 1024б (0,5мс/512б, 0,25мс/256б), уже скорость падает до 500кБ/с. Я так понимаю, что это из-за NACK. Но что ограничивает максимальную пропускную способность при передаче в одну сторону до половины от максимально возможной? Дело в драйвере VCP от ST на ПК или я что-то не учитываю на стороне устройства?
|
|
|
|
|
 |
Ответов
|
Apr 28 2013, 09:28
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 15-11-07
Пользователь №: 32 363

|
Цитата(BaN @ Apr 28 2013, 11:01)  Пытаюсь разобраться с работой USB full-speed в STM32 на примере USB CDC от ST из STM32_USB-Host-Device_Lib_V2.1.0. Хочу добиться скорости 800кБ/с передачи в одну сторону от устройства до ПК. Использую драйвер VCP_V1.3.1 от ST. Работаю с STM32F205RBT6. Прием/передача нормально работают, но хочется выжать максимальную пропускную способность в одном направлении (от устройства к ПК). И здесь возникли трудности, не удается получить более 740кБ/с (чуть меньше половины от максимальной пропускной способности USB FS). В пример внес изменения: Код #define CDC_IN_FRAME_INTERVAL 0 /* Number of frames between IN transfers */ #define APP_RX_DATA_SIZE 32768 /* Total size of IN buffer: */ В основном цикле отправляю данные со скоростью 1МБ/с... А разве не эта запись Код #define CDC_DATA_MAX_PACKET_SIZE 64 /* 64 Endpoint IN & OUT Packet size */ ограничивает число байт, отправляемых за 1 мс по приходу SOF. Тогда получается максимальная скорость 1000*64 = 64 000 Байт = 64000*8=512 000 бит/сек
|
|
|
|
|
Apr 28 2013, 09:34
|
Частый гость
 
Группа: Участник
Сообщений: 144
Регистрация: 28-08-07
Пользователь №: 30 111

|
Цитата(vptr @ Apr 28 2013, 16:28)  А разве не эта запись Код #define CDC_DATA_MAX_PACKET_SIZE 64 /* 64 Endpoint IN & OUT Packet size */ ограничивает число байт, отправляемых за 1 мс по приходу SOF. Тогда получается максимальная скорость 1000*64 = 64 000 Байт = 64000*8=512 000 бит/сек Я так понял, что это максимальный размер bulk-пакета, который для full-speed составляет 64 байт или это не то? Попробую поизменять. Да, это именно максимальный размер bulk-пакета, так что больше 64 байт никак. Если я не ошибаюсь, за один SOF может выполняться несколько транзакций из одной конечной точки.
Сообщение отредактировал BaN - Apr 28 2013, 09:45
|
|
|
|
|
Apr 28 2013, 11:10
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 15-11-07
Пользователь №: 32 363

|
Цитата(BaN @ Apr 28 2013, 12:34)  Если я не ошибаюсь, за один SOF может выполняться несколько транзакций из одной конечной точки. Транзакций несколько, но вот остается вопрос, стек от STM выполняет ли это? И сколько максимальное число транакций, после одного SOF?
|
|
|
|
|
Apr 28 2013, 11:23
|
Частый гость
 
Группа: Участник
Сообщений: 144
Регистрация: 28-08-07
Пользователь №: 30 111

|
Цитата(vptr @ Apr 28 2013, 18:10)  Транзакций несколько, но вот остается вопрос, стек от STM выполняет ли это? И сколько максимальное число транакций, после одного SOF? Судя по тому, что мне удается достичь скоростей больших, чем 64кБ/с, то выполняет. Неизвестно, ограничивает ли именно драйвер число транзакций, но сам USB-хост, судя по гуглу, ограничивает число транзакций так: Цитата В каждом кадре может быть выполнено несколько транзакций, их допустимое число зависит от скорости, длины поля данных каждой из них, а также от задержек, вносимых кабелями, хабами и устройствами. Проверял работу устройства, когда оно было подключено к корневому хабу напрямую и только одно, так что ничто из этого не должно было мешать. Еще появилась мысль, а после каждого ли SOF ПК принимает данные из устройства, попробую проверить это.
Сообщение отредактировал BaN - Apr 28 2013, 11:25
|
|
|
|
|
Apr 28 2013, 11:28
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 15-11-07
Пользователь №: 32 363

|
Цитата(BaN @ Apr 28 2013, 14:23)  Судя по тому, что мне удается достичь скоростей больших, чем 64кБ/с, то выполняет. Неизвестно, ограничивает ли именно драйвер число транзакций, но сам USB-хост, судя по гуглу, ограничивает число транзакций так: Скорость со стороны ПК чем контролируется? Это самописное ПО или чего-то стандартное?
|
|
|
|
Сообщений в этой теме
BaN STM32F2xx USB FS CDC Apr 28 2013, 08:01     BaN Цитата(vptr @ Apr 28 2013, 18:28) Скорост... Apr 28 2013, 11:43 BaN Проверил как идет передача. После каждого SOF пере... Apr 28 2013, 15:24 vptr Цитата(BaN @ Apr 28 2013, 18:24) Проверил... Apr 28 2013, 16:42  BaN Цитата(vptr @ Apr 28 2013, 23:42) вот вет... Apr 28 2013, 19:52 toweroff Я пробовал, правда на lpc2478, раскочегарить FS
Бо... Apr 28 2013, 22:33 BaN Возможно, проблема в организации буфера в примере:... Apr 29 2013, 08:01 vptr ... Apr 29 2013, 11:28 BaN Проверил еще раз, с тактовой частотой всё нормальн... Apr 30 2013, 06:48 BaN Подкорректировал буфер USB:
Код#define RX_FIFO_FS_... May 1 2013, 22:13 jcxz Если CDC - не обязательное условие, то создавайте ... May 2 2013, 02:39  BaN Цитата(jcxz @ May 2 2013, 09:39) Если CDC... May 2 2013, 04:24 BaN RE: STM32F2xx USB FS CDC May 2 2013, 13:35 jcxz Цитата(BaN @ May 2 2013, 19:35) Опять у м... May 3 2013, 09:56  BaN Цитата(jcxz @ May 3 2013, 16:56) Если у в... May 3 2013, 10:03   jcxz Да с чего бы она возникала??? Это-бы противоречило... May 3 2013, 15:02    BaN Цитата(jcxz @ May 3 2013, 22:02) Да с чег... May 3 2013, 15:19     aaarrr Цитата(BaN @ May 3 2013, 19:19) А с чего ... May 3 2013, 15:53      BaN Цитата(aaarrr @ May 3 2013, 22:53) Шина н... May 3 2013, 18:07 Golikov A. Среда? Фоновые процессы? Например C# так может мус... May 3 2013, 05:04 BaN Цитата(Golikov A. @ May 3 2013, 12:04) Ср... May 3 2013, 07:52 BaN Еще нашел баг в библиотеке, из-за которого у меня ... May 4 2013, 03:17 ander0 BaN, можете выложить исходники своего последнего в... Nov 19 2014, 23:51
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|