Пытаюсь разобраться с работой 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 на ПК или я что-то не учитываю на стороне устройства?