Musik spelas väckarklocka (21 / 24 steg)
Steg 21: Bilaga C: den kortaste Explaination för USB någonsin
USB-bussar har en enhet och mottagande, datorn är vanligen värd, vår musikspelaren är en enhet, närmare bestämt en masslagringsenhet. Det är viktigt att notera att värden alltid påbörja kommunikation eller värddatorn kontrollerar enheten ofta för att se om det har något att säga.
Det finns pull-up motstånd på D + eller D - beroende på om enheten är USB 1.0, USB 1.1 eller USB 2.0. Närvaron av dessa pull-up motstånd är också hur en dator vet när något har ansluten. I AT90USB1286 (aka mikrokontroller på Teensy ++), pull-up motstånd är inbyggda och kan konfigureras via programvara.
När en enhet ansluts till en värd, försöker värd att "räkna" enheten. Om den underlåter att göra så (enheten svarar inte eller svarar med skräp), det är då Windows säger "enhet känns inte igen".
Värd- och enheten talar över kanaler kallas "slutpunkter", slutpunkter identifieras av ett nummer. Det finns några slutpunkter som ett reserverat för särskild användning, medan andra kan konfigureras för att fungera i olika lägen (avbrott, bulk, etc).
Värden kommer alltid först använda "kontrollslutpunkt" (slutpunkt 0) först att begära en beskrivning av enheten, detta "deskriptorn" kommer att innehålla enhetsidentifierare (vendor ID och produkt-ID, etc), tillsammans med dess enhetsklass, underklass, etc (HID som mus eller tangentbord? eller kanske masslagring?). Sedan begärs konfiguration deskriptorn, som också innehåller antalet slutpunkter tillgängliga på enheten. Varje slutpunkt har sin egen deskriptor. All denna data skickas som paket data-byte som representerar en välkänd angivna datastruktur.
LUFA (Lightweight USB Framework för AVRs) och andra USB-ramar/stackar har "strukturer" och andra metoder för att programmeraren ändra innehållet i beskrivare. Du måste först förstå varje deskriptor och kontrollera dokumentationen om LUFA att se hur du ändrar dem.
Värden gör begäran genom att skicka "setup paket" till "kontrollslutpunkt". Setup-paket har en definierad struktur gör det enkelt för enheten att förstå vad värden vill. LUFA (och liknande ramar) vanligtvis hanterar standard setup paket. En programmerare kan skriva drivrutiner som skickar anpassad installation paket, i vilket fall firmware måste hantera paketen installationsprogrammet manuellt, LUFA (och andra) ger några metoder för att hjälpa med det.
I några av mina exempel, har jag inkluderat en soptipp beskrivare fångas upp av min USB-traffic analyzer. Du kan ta en titt och matcha det med USB specifikationer att se vad varje del representerar.
När alla beskrivningar har hämtats från enheten, kan värden sedan förstå enheten och kommunicera med den. I några av mina demonstrationer fungerar USB-enheten som en virtuell serieport. När du anropar funktionen "usb_serial_putchar", tecknet skickas placeras i en buffert, och skickas ut när datorn (värd) gör en periodisk checkup (kom ihåg vad jag sa om värden alltid inleda kommunikation). När AT90USB1286 om Teensy ++ blir en USB-masslagringsenhet, när datorn skickar över SCSI-kommandon för att läsa datablock, svarar enheten tillbaka med data över en bulk-slutpunkt.
Jag har en annan Instructable som visar dig hur man bygger ett USB-tangentbord som typer ut koden lagras i RFID-taggar:
Läxor: Läsa USB i ett nötskal http://www.beyondlogic.org/usbnutshell/usb1.shtml vilket är ganska mycket en USB-bibel