Paso 5: Entender el código USB
Esto es donde empieza la diversión!Si has venido esto lejos, usted debe tener una pantalla que dice "Mostrar inicializar" cuando encienda el dispositivo.
Si no has hecho ya, descargar el código fuente adjunto a este instructivo, y tendremos un vistazo sobre cómo se comunica el AVR con la pantalla y el ordenador.
Si nunca has trabajado con V-USB antes, puede ser muy confuso al principio. Por lo menos lo fue para mí. Desplácese hasta la función de usbFunctionSetup y vamos a tener una mirada más cercana sobre cómo realmente funciona. Es la única función que usted necesita cuidado de edición además de la función principal.
usbFunctionSetup es la función donde se procesan todos los datos que envié al microcontrolador por el puerto USB. Si observas las declaraciones IF, todos ellos busque un número específico en la variable rq -> bRequest . Este i donde se almacenan los códigos de petición. Usted puede pensar de los códigos de petición como comandos. En el software del host, tenemos una función como esta: SendData (int petición, datos), el valor que pones en el parámetro de la petición se transfirió al microcontrolador y se almacenarán en el rq -> variable bRequest, y utilizar este código de solicitud que para hacer varias cosas en el usbFunctionSetup.
Solamente han añadido 6 códigos de solicitud, pero si quieres hacer un 7 solicitar código simplemente escribe esto en un lugar en la función usbFunctionSetup:
Si la petición es 7
si (rq -> bRequest == 7) {/ / comando 7 - SEND_MYCOMMAND
Hacer mi código
}
Si ahora llama a la función SendData así: SendData (7, 0);
Se ejecutará la instrucción IF que acaba de crear.
El 2 º parámetro en la función SendData es los datos reales que usted envía al microcontrolador. Este número se almacenará en struct rq -> wValue . Se trata de una palabra (2 bytes), pero si sólo desea usar 1 de los 2 bytes almacenados aquí, puede hacerlo mediante el uso de la matriz de bytes, como este: rq -> wValue.bytes[0]. Si desea utilizar la palabra completa, puede acceder a él así: rq -> wValue.word. Tenga en cuenta que usted debe usar un int sin signo si desea utilizar la palabra completa.
Usted debe funciones avanzadas que toman mucho tiempo para hacer fuera de la función usbFunctionSetup y en su lugar el bucle principal ejecutarlos. Si tienes en la usbFunctionSetup y usan mucho tiempo para terminar (50ms), podría perder la conexión USB al ordenador. Decidí tenerlos en el usbFunctionSetup porque la escritura a la pantalla es mucho más rápida que el USB (de hecho, escribimos un 1 estable, 33Mbit/s y la pantalla, la pantalla soporta hasta 4Mbits/s) por lo que no hay riesgo de perder la conexión por tomar demasiado tiempo.
El resto del código debe ser comentado lo suficiente para que usted pueda entender. Si algo está claro, me avisas y voy a intentar aclarar las cosas para usted.