LPC 1769- Transmisión USB - 1Mbyte/sec -

69 views
Skip to first unread message

p...@bioingenieria.edu.ar

unread,
Jul 11, 2016, 10:55:10 AM7/11/16
to Embebidos32
Hola a todos,
                   En un proyecto necesitamos transmitir datos por USB a una  de 1 megabyte/sec aprox..  estamos trabajando con el LPC1769,  comenzamos explorando la biblioteca usbd_lib_cdc (LPCOPENv2.10),.. teoricamente usando Bulk transfer en full-speed podemos enviar hasta 13 paquetes de 64 bytes por milisegundo. Actualmente solo podemos transmitir 4 paquetes por frame sin perdida.. No sabemos si el limitante es una mala configuracion de parametros, o la biblioteca que maneja deficientemente la transferencia, los cables o el puerto de la PC..

Utilizamos el ejemplo casi tal cual se distribuyo, solo modificamos la funcion "vcom_write()" para que espere que el bus este libre para realizar una nueva transmision y enviamos paquetes de 64 bytes (de otro modo no funciona).

¿Alguíen alcanzó mayores tasas de transferencias?
¿Recomiendan trabajar con otra biblioteca?

Desde ya muchisimas gracias.

Bioing. Mauro Sebastian Martina
Laboratorio de prototipado - FIUNER

Dejo parte del codigo:

while (1) {

        /* Check if host has connected and opened the VCOM port */
        if ((vcom_connected() != 0) && (prompt == 0)) {
            vcom_write("Hello World!!\r\n", 15);
            prompt = 1;
        }
        /* If VCOM port is opened echo whatever we receive back to host. */
        if (prompt) {
            rdCnt = vcom_bread(&g_rxBuff[0], 256);
            if (rdCnt) {
                if(g_rxBuff[0]=='S'){
                    for(i=0;i<100;i++){
                    vcom_write("I can tell a lot about character by the way he eats jelly beans", 63);
                    }
                }
            }
        }
        /* Sleep until next IRQ happens */
        __WFI();
    }

/* la funcion modificada*/

/* Virtual com port write routine*/
uint32_t vcom_write(uint8_t *pBuf, uint32_t len)
{
    VCOM_DATA_T *pVcom = &g_vCOM;
    uint32_t ret = 0;

    while ((pVcom->tx_flags & VCOM_TX_CONNECTED) && ((pVcom->tx_flags & VCOM_TX_BUSY))) {} /*Espero que el bus este libre*/

    if ( (pVcom->tx_flags & VCOM_TX_CONNECTED) && ((pVcom->tx_flags & VCOM_TX_BUSY) == 0) ) {
        pVcom->tx_flags |= VCOM_TX_BUSY;

        /* enter critical section */
        NVIC_DisableIRQ(USB_IRQn);
        ret = USBD_API->hw->WriteEP(pVcom->hUsb, USB_CDC_IN_EP, pBuf, len);
        /* exit critical section */
        NVIC_EnableIRQ(USB_IRQn);
    }

    return ret;
}


Reply all
Reply to author
Forward
0 new messages