Comunicación PIC + USB (cómo funciona)

1

He estado leyendo mucho sobre comunicación USB por un tiempo. Ya hice dos proyectos con PIC18F4550 usando USB y todo funciona perfectamente. Pero todavía tengo una pregunta sin respuesta en mi mente. ¿Cómo sabe la pila USB si hay datos nuevos o no?

Quiero decir, estoy usando los ejemplos HID USB de Microchip para guiarme. Así que mi chip está trabajando en modo de sondeo. Mi dispositivo recibirá datos constantemente y los transmitirá a la computadora a través de USB. Pero la computadora también devolverá algunos datos. La cosa es que los datos de salida de la computadora solo sucederán a veces. Aquí está parte del código:

void QueryPCData(void)
{    
if (!HIDRxHandleBusy(lastReceived))
{
    lastReceived = HIDRxPacket(HID_EP,(BYTE*)&hid_out, HID_OUT_LEN);
    if ((hid_out[0]==0xEF)&&(hid_out[1]==0xEF)&&(hid_out[2]==0xEF))
        LED_ON;
    else
        LED_OFF;
}

//If the last transmision is complete
if(!HIDTxHandleBusy(lastTransmission))
{
    lastTransmission = HIDTxPacket(HID_EP, (BYTE*)&hid_in, HID_IN_LEN);
}

return;
}

Mirando el código, parece que en cada ciclo intenta actualizar todos los datos (TX y RX). ¿Pero qué pasa si no envié ningún dato de la computadora? ¿Mi matriz hid_out mantendrá el último valor hasta que reciba datos nuevos?

Si deseo enviar un solo comando a través de USB, debería enviarlo una vez y luego enviar espacios en blanco o algo para evitar repetir el último comando (enviarlo dos veces).

    
pregunta Felipe_Ribas

1 respuesta

0

La especificación de USB tiene la PC (host) que le dice al dispositivo cuándo enviar un paquete y cuándo recibir un paquete. El dispositivo USB no puede "enviar" datos sin que la PC lo solicite. Por lo tanto, solo verificar "es la última transmisión realizada" no es suficiente; también tiene que marcar "¿PC ha enviado una solicitud?"

Dicho esto, es probable que la biblioteca de soporte de PIC USB resuma esa parte. Tal vez HIDTxHandleBusy haga eso por ti?

Para actualizar el código en cuestión para que solo envíe datos cuando tenga datos disponibles, simplemente puede cambiar la instrucción if () que llama a HIDTxHandleBusy () para verificar también si tiene algún dato que desee enviar, y solo enviar datos Si ese es el caso:

if(!HIDTxHandleBusy(lastTransmission) && IHaveSomeDataToSend)

O tal vez el bloque de funciones de envío / recepción hasta que la PC envíe el comando apropiado en el bus, tendrá que consultar la documentación del chip y la biblioteca de soporte para obtener la respuesta real.

Al hacer un Google muy rápido, parece que la biblioteca de soporte se hace cargo de su búfer cuando transmite, y no puede sobrescribir el búfer hasta que la llamada de HandleBusy se realice.

Btw: El código anterior es en realidad un poco bruto, porque primero verifica si una transmisión se completó (para el caso Rx) y luego comienza una nueva transmisión (recibo) y luego comienza a leer bytes fuera del búfer ( en el momento en que el hardware USB ya ha vuelto a tomar posesión del búfer.) Esto parece ser una condición de carrera, dado que HIDRxBuffer () toma posesión del búfer.

    
respondido por el Jon Watte

Lea otras preguntas en las etiquetas