STM32 USB: transmisión diferida cuando la longitud de carga útil es de 256 (o 512, o 768…) bytes?

3

Estoy implementando comunicaciones USB en un STM32F105, usando de ST. Biblioteca USB v2.1.0 . Se comunica como un puerto COM virtual de clase CDC ("VCP"). Estoy usando la velocidad completa incrustada PHY.

Comencé con el proyecto de ejemplo VCP de ST, que es un convertidor de serie a USB. Lo tengo funcionando bien, excepto por un problema que sospecho que puede ser un error en el código de su biblioteca.

Su controlador USB expone un búfer circular y un puntero de búfer. Se supone que la aplicación debe poner datos en este búfer, que el conductor se da cuenta y se ejecuta. Aquí está la función para rellenar el búfer:

uint16_t VCP_DataTx (uint8_t* Buf, uint32_t Len)
{
    uint32_t i;
    for (i=0; i<Len; i++)
    {
        APP_Rx_Buffer[APP_Rx_ptr_in] = Buf[i];
        APP_Rx_ptr_in++;

        /* To avoid buffer overflow */
        if(APP_Rx_ptr_in == APP_RX_DATA_SIZE)
        {
            APP_Rx_ptr_in = 0;
        }
    }
    return USBD_OK;
 }

Esto funciona para enviar hasta (al menos) 1024 bytes de datos, except si la longitud de los datos es un múltiplo par de 256 bytes. En otras palabras, puedo usar esta función para enviar 255 o 257 bytes bien (o incluso 1023), pero si intento enviar 256 bytes, falla. O 512, o 768, etc.

El modo de falla es que no se envían datos a través de USB hasta que se han pasado un total de 4096 bytes a su búfer, y luego todo se transmite a la vez. Cuando funciona correctamente, por supuesto, los datos se transfieren inmediatamente.

Hay una lista de errores conocidos aquí . Los he incorporado, pero no ha solucionado este problema.

¿Alguien sabe una solución? Preferiría no depurar el código del controlador de ST ...

    
pregunta bitsmack

1 respuesta

9
  

excepto si la longitud de los datos es un múltiplo par de 256 bytes

Sus 64 bytes en realidad (MaxPacketSize). Las transferencias masivas de USB "finalizan" con transferencias no MaxPacketSize - normalmente de 64 bytes. Si su transferencia es un múltiplo entero de eso, envíe un paquete cero después de los datos. Esto indica el final de la transferencia a las pilas de software USB superiores, que devolverán sus datos de una vez.

La mayoría del código de ejemplo de VCP omite esto por simplicidad.

    
respondido por el Turbo J

Lea otras preguntas en las etiquetas