Ayuda para arreglar la función de envío de CDC personalizada

1

Estoy usando un código personalizado de CDC ejemplo del paquete 177x_8x_PDL_110602 (no estoy usando LPCOpen). Estoy teniendo problemas con la función CDC_Send. Ese es el escenario: una secuencia de comandos de python envía mensajes al USB serie de LPC1788, se envían periódicamente (200 ms, 300 ms). El mensaje es: "ping \ x00", sin comillas. Cuando el LPC recibió el mensaje de ping, envía a la PC este mensaje: "resp 0 \ x00". Después de cualquier intercambio de mensajes (perfectamente), el LPC comienza a enviar un mensaje incorrecto, como este: "r 0 \ x00", "sp 0 \ x00", "esp 0 \ x00", "r \ x00", "\ x00 ", ...

Bellow es el código que envía el mensaje:

void CDC_Send(const uint8_t *data, uint32_t data_size)
{
    // block until all bytes be sent
    while (ringbuff_size(g_tx_buffer) > 0);

    // puts the data into ring buffer
    ringbuff_write(g_tx_buffer, data, data_size);

    // forces the first send
    CDC_BulkIn();
}


void CDC_BulkIn(void)
{
    uint8_t buffer[USB_CDC_BUFSIZE];
    uint32_t bytes_to_write;

    if (!g_cdc_initialized) return;

    memset(buffer, 0, USB_CDC_BUFSIZE);

    bytes_to_write = ringbuff_read(g_tx_buffer, buffer, USB_CDC_BUFSIZE);

    if (bytes_to_write > 0)
    {
        USB_WriteEP(CDC_DEP_IN, buffer, bytes_to_write);
    }
}

El SetMode (comando 0xF3) usa el valor de restablecimiento (cero), por lo que no ocurren interrupciones por NAK. Después de mucho tiempo de depuración, intenté poner un retraso después de la función USB_WriteEP, el valor del retraso es 100us. De esta forma los mensajes de intercambio no fallan. Por lo tanto, me gustaría arreglar esto (eliminar el retraso). ¿Alguna idea?

Gracias

    
pregunta Ricardo Crudo

1 respuesta

1

¡Encontré el error!

En lugar de liberar la función CDC_Send para escribir un nuevo mensaje cuando el búfer de anillo está vacío, lo libero utilizando un indicador, que se establece en la última interrupción de CDC_BulkIn, que es cuando el búfer de anillo está vacío.

Bellow es el código fijo:

int g_send_ok;

void CDC_Init(void)
{
    // ...
    g_send_ok = 1;
}

void CDC_Send(const uint8_t *data, uint32_t data_size)
{
    // block until all bytes be sent
    while (!g_send_ok);
    g_send_ok = 0;

    // puts the data into ring buffer
    ringbuff_write(g_tx_buffer, data, data_size);

    // forces the first send
    CDC_BulkIn();
}


void CDC_BulkIn(void)
{
    uint8_t buffer[USB_CDC_BUFSIZE];
    uint32_t bytes_to_write;

    if (!g_cdc_initialized) return;

    memset(buffer, 0, USB_CDC_BUFSIZE);

    bytes_to_write = ringbuff_read(g_tx_buffer, buffer, USB_CDC_BUFSIZE);

    if (bytes_to_write > 0)
    {
        USB_WriteEP(CDC_DEP_IN, buffer, bytes_to_write);
    }
    else
    {
        g_send_ok = 1;
    }
}
    
respondido por el Ricardo Crudo

Lea otras preguntas en las etiquetas