Uso del kit de inicio USB dsPIC33E de Microchip

2

Soy un estudiante y estoy empezando un proyecto en el que estoy trabajando con el kit de inicio USB dsPIC33E de Microchip. Utilicé algunas muestras tomadas de este sitio Para iniciar, enviar y recibir paquetes. No hay pantalla en esta pizarra, así que estoy imprimiendo lo que necesito en la pantalla de la computadora con un software de terminal IVT VT220.

Mi primer problema es imprimir más de una línea en la pantalla: si tiene 2 comandos de impresión en el mismo código, imprimirá solo el primero, luego hará el resto del código, solo sin el segundo comando de impresión. Por ejemplo este código:

// some code
putrsUSBUSART("first print");
putrsUSBUSART("second print");
//the rest of the code

imprimirá "primera impresión" y luego hará el resto del código.

El segundo problema que tengo es enviar y recibir mensajes en diferentes modos. Cuando estoy usando el modo de bucle invertido, puedo transmitir un mensaje y luego recibirlo. Al verificar el registro de rx, parece que el mensaje se ha transferido correctamente. Sin embargo, cuando se cambia el modo al modo normal y se realiza exactamente el mismo proceso, todavía parece que el mensaje que recibí es válido (¡aunque solo funciona con un dispositivo! Por lo que se supone que funciona bien solo en bucle, no en modo normal ¿O tal vez no funciona en absoluto en ambos modos?).

¿Alguna sugerencia de por qué suceden estas cosas?

    
pregunta david1625

2 respuestas

1

Creo que la función putrsUSBUSART(); probablemente no esté bloqueando y tiene una comprobación de que el periférico está ocupado. Cuando intentas enviar la segunda cadena, comprueba y encuentra que el periférico está ocupado, así que simplemente salta.
Recuerdo otra función de tipo "sendUSB" que funciona de esta manera en las bibliotecas USB.

Para realizar una prueba rápida de lo anterior, intente agregar un retraso entre las dos llamadas a la función para ver si resuelve el problema (esto no es una solución permanente; probablemente haya una función para verificar esto, pero esto debería hacer solo para comprobar)

Por lo que puedo ver, el kit de inicio dsPIC33F se basa en otro PIC con un periférico USB para hacer las comunicaciones USB (AFAIK, ninguno de los dsPIC tiene un periférico USB)
También parece que el firmware de demostración está configurado para emular un puerto COM para comunicaciones en serie. No pude encontrar ninguna documentación para el código, pero encontré esto:

  

Las instrucciones para esta demostración se pueden encontrar en C: \ dsPIC33E PIC24E USB   Kit de iniciación Demostración \ Documentación \ Cómo empezar \ Cómo empezar -   Ejecutando el dispositivo - CDC - Demo básica. Vea la Demo de Running   sección.

Supongo que toda la documentación necesaria estará en la carpeta "Documentación". Debe tener detalles de las funciones utilizadas en la aplicación de demostración, para que pueda comprobar cómo funcionan. También puede simplemente comprobar el código de función en sí.

    
respondido por el Oli Glaser
1

Sé que esta es una pregunta histórica, pero en caso de que alguien más venga ...

El problema es que las funciones put*USBUSART() no están bloqueadas y, por lo tanto, la pila USB aún no está lista para transmitir la segunda cadena cuando se cierra la primera función.

Puede verificar si está listo o no a través de la función USBUSARTIsTxTrfReady() . Esta es la forma de crear un conjunto de bloqueo de funciones put[r]s :

// USB magic stuff
void usbPerformTasks(void)
{
    USBDeviceTasks();
    if(USBGetDeviceState() < CONFIGURED_STATE /*|| USBIsDeviceSuspended()*/)
        return;
    CDCTxService();
}
// blocking until we're ready to transmit
void usbBlockTx(void)
{
    while(!USBUSARTIsTxTrfReady())
        usbPerformTasks();
}

// ROM function
void usbBlockPutRS(const far rom char* str)
{
    usbBlockTx();
    putrsUSBUSART(str);

    /*
     * Also put this in if you want to wait for the Tx to finish,
     * but if you only use these two functions, you don't need it.
     */
    //usbBlockTx();
}
// RAM function
void usbBlockPutS(char* str)
{
    usbBlockTx();
    putsUSBUSART(str);

    /*
     * DO NOT COMMENT THIS OUT -- it is needed because putsUSBUSART()
     * does not copy the data, which means that 'str' could possibly
     * get changed in mid-transmission. This is not required for the
     * ROM version of the function, since ROM data cannot change -- well,
     * unless you happen to be programming the uC, but then we wouldn't
     * be running this code here.
     */
    usbBlockTx();
}
    
respondido por el Tim Čas

Lea otras preguntas en las etiquetas