Paso 21: Apéndice C: la explicación más corta de USB siempre
Buses USB tienen un dispositivo y el host, el equipo suele ser el anfitrión, nuestro reproductor de música es un dispositivo, más concretamente, un dispositivo de almacenamiento masivo. Es importante tener en cuenta que el host siempre iniciar la comunicación, o el anfitrión comprueba el dispositivo con frecuencia para ver si tiene algo que decir.
Hay resistencias de pull-up en D + o D - dependiendo de si es o no el dispositivo de USB 1.0, USB 1.1 o USB 2.0. La presencia de estas resistencias de pull-up es también cómo un ordenador sabe cuando algo se ha conectado. En el AT90USB1286 (aka el microcontrolador en el Teensy ++), las resistencias de pull-up son integradas y configurables vía software.
Cuando un dispositivo se conecta a un host, el host intenta "enumerar" el dispositivo. Si no hace así (dispositivo no responde, o responde con basura), que es cuando Windows dice "dispositivo no reconocido".
El host y el dispositivo habla sobre los canales llamados "extremos", criterios de valoración se identifican por un número. Hay algunos extremos que un apartado para uso especial, mientras que otros pueden configurarse para funcionar en modos diferentes (interrupción, a granel, etc.).
El anfitrión siempre utilizará el "extremo de control" (endpoint 0) primero para solicitar una descripción del dispositivo, este "descriptor" contendrá los identificadores de dispositivo (vendedor ID y ID del producto, etc.), junto con su clase, subclase, etc. (HID como un ratón o un teclado? o tal vez almacenamiento masivo?). Luego se solicita el descriptor de configuración, que contiene también el número de terminales disponibles en el dispositivo. Cada extremo tiene su propio descriptor así. Todos estos datos se envían como paquetes de bytes de datos que representa una estructura de datos especifica conocida.
LUFA (ligero USB Framework para AVRs) y otros marcos USB/pilas tienen "estructuras" y otros métodos para permitir que el programador modificar el contenido de los descriptores. Necesita primero entender cada descriptor y después Compruebe la documentación de LUFA para ver cómo cambiarlos.
El anfitrión hace las solicitudes mediante el envío de "paquetes de configuración" a "extremo de control". Paquetes de configuración tienen una estructura definida, lo que es fácil para el dispositivo entender lo que quiere el host. LUFA (y similares) generalmente se encarga de los paquetes de configuración por defecto. Un programador puede escribir controladores que envía paquetes de configuración personalizada, en cuyo caso el firmware debe manejar los paquetes de configuración manualmente, LUFA (y otros) proporciona algunos métodos a ayudar con eso.
En algunos de mis ejemplos, he incluido un volcado de los descriptores de capturados por el analizador de tráfico de mi USB. Puede echar un vistazo y coincidir con las especificaciones USB para ver lo que representa cada porción.
Una vez que han recuperado todos los descriptores del dispositivo, el host puede entonces entender el dispositivo y comunicarse con ella. En algunas de mis manifestaciones, el dispositivo USB actúa como un puerto serie virtual. Al llamar a la función "usb_serial_putchar", el personaje a se coloca en un búfer y enviado cuando el ordenador (host) hace un chequeo periódico (recuerde lo que dije sobre el anfitrión siempre iniciar comunicación). Cuando AT90USB1286 en Teensy ++ se convierte en un dispositivo de almacenamiento masivo USB, cuando la computadora envía comandos SCSI para leer bloques de datos, el dispositivo responde con los datos sobre un extremo del bulto.
Tengo otro Instructable que le muestra cómo construir un teclado USB tipos el código almacenado en etiquetas RFID:
Tarea: Leer USB en una cáscara de nuez http://www.beyondlogic.org/usbnutshell/usb1.shtml que es casi una Biblia USB