Hallo zusammen, ich habe mal wieder eine Frage und zwar zum Thema USB. Vielleicht kennt sich hier ja jemand nen bisschen damit aus. Ich möchte einen Mikrocontroller (AT91SAM7XC256) per USB an den PC anschliessen. Dabei soll man dann über den PC IO's am Controller auslesen und setzen können. Welches "Protokoll" von USB nimmt man für so etwas? Macht man so etwas dann einfach mit diesem Virtualcom protokoll? aber dann hat man doch nur ne Bandbreite von maximal 128000 Baud oder? Oder nimmt man für so etwas dieses HID (das dingen für Eingabegeräte) ? Oder ein ganz anderes? Vielleicht kann mir einer erklären wie man das ganze am besten aufbaut und was die Unterschiede der Protokollarten sind? Ich habe mir auch schon beispiele von Atmel angeschaut, dort wird diese Serialgeschichte genutzt. Dabei wird aber auch der USART0 und ein Timer benutzt. Beides habe ich schon verbraucht. Muss man, wenn man die USB geschichte als Virtual Com aufbaut, beim Mikrocontroller mit einem USART arbeiten? Im Prinzip habe ich noch den zweiten USART frei aber ich hatte nun eigentlich gehofft das USB eigenständig laeuft. Also wäre nett wenn mir jemand ein paar Hintergrundinfos zu USB geben kann und mir sagen könnte welches USB Protokoll ich in meinem Fall nutzen sollte. Vielleicht kann mir auch einer in kruzen und klaren worten erklären wie das ganze mit den Endpoints etc zusammenhängt. Ich hatte mal gelesen, dass der AT91SAM7X eienn Buffer von 64 Byte bei den Endpoints hat. Das heißt also ein Frame kann bei mir maximal 64 Byte groß sein? Dann muss ich die Daten schnell verarbeiten und den Buffer wieder leeren und dann können da wieder neue Daten rein oder? Ich hoffe es kann mir jemand ein kleines bisschen die USB geschichte verdeutlichen und hat eventuell sogar ein minimal Beispiel für meinen Controller (AT91SAM7XC256) zur hand ohne riesen drum herrum. Vielen Dank für eure Hilfe! Gruß Jens Ahja: entwicklungsumgebung ist KEIL µVision....die meisten Beispiele sind ja leider für IAR aber vll hat auch jemand was für KEIL parat.
hallo jens, um einen einstieg in die usb "geschichte" zu kriegen kann ich dir den folgenden link empfehlen: http://www.beyondlogic.org/usbnutshell/usb-in-a-nutshell.pdf um einie deiner fragen zu beantworten: für deine zwecke benötigst du den uart natürlich nicht, was soll der auch mit den ports? als "protokoll" würde ich dir hid für den einstieg empfehlen (falls das schnell genug ist). gruss gerhard
Hallo Gerhard, danke für deine Antwort! Ich habe mir das Dokument mal durch gelesen, das gibt schon einen guten Überblick und Einstieg in die USB-Welt. Du sagtest das du mir das HID Protokoll empfehlen würdest wenn es schnell genug ist....Leider habe ich in dem Dokument auch noch nichts darüber gefunden wie schnell diese unterschiedlichen "Protokolle" arbeiten.... Das sind ca. 128 Bytes + 320 Bytes + 64 Bytes = 512 Bytes Daten die vom Gerät an den PC gehen und ca. 704 Bytes die vom PC an das Gerät gehen sollen. (kann eventuell noch mehr werden, das sind nun reine Nutzdaten) Wie schnell ist denn das HID Protokoll? Sehe ich das Richtig wenn ich diese Endpoints als Interrupt einstelle und ein Endpoint 64 Bytes speichern kann dann überträgt er bei jedem Interruptzyklus ... sagen wir mal jede Millisekunde ... die 64 Bytes Daten? Und ich kann dann nach jedem Interrupt einfach andere Daten in diesen Endpoint schreiben die er dann übertragen soll? Bzw. auf der PC seite muss ich dann ja auch irgendwelche Daten in einen Endpoint schreiben der dann zyklisch vom PC übertragen wird. Stimmt das so? Wobei natürlich auch fürs senden der PC erst eine Anfrage sendet und der Controller automatisch darauf antwortet mit den aktuellen Daten die er im Endpoint hat. Wie schnell ist denn diese Interruptgeschichte und das HID "Protokoll" ? Ich wollte das Gerät dann als FullSpeed USB laufen lassen. Ich kann doch dann Einstellen in welchem Zyklus der Interrupt ausgelöst werden soll oder wird er an der maximalen Busgeschwindigkeit angepasst? Der arme Mikrocontroller soll ja die USB Kommunikation nebenbei machen und nicht hauptsächlich. Ich hoffe du kannst mir die Fragen auch noch beantworten. Vielen Dank für deine Hilfe schon einmal im vorraus. Gruß Jens
Interrupt Transfers können bei Full Speed jede Millisekunde bis zu 64 Byte transportieren. Bei Low Speed wären es theoretisch 8 Byte alle 10ms, praktisch alle 8ms, da die Betriebssysteme alle einen 8ms Zyklus fahren wenn das Gerät 10ms als Minimum angibt. Diese Datenmenge bezieht sich auf einen einzelnen Endpoint, mit mehreren Endpoints kann man entsprechend mehr transportieren.
Moin noch etwas anzumerken zu hid. der PC. (windows) pollt in einer definierten zeit den hid endpoint und fragt dort daten ab. Diese daten speichert windows dann zwischen. Es ist jetzt sache deiner applikation diese rechtzeitig aus dem puffer abzuholen. wenn nicht werden diese ggf durch neue daten überschrieben. Die Zeit in der Windows Pollen soll kann man zwar im deskriptor angeben, doch hält sich windows nicht umbedingt zwingend daran. dein kontroller hat im USB betrieb nie eine aktive rolle. er hat immer nur die Anfragen des PCs Host zu beantworten. Und wenn dies ein nak, busy oder sonst was ist. Hid hat halt den vorteil, das man relativ einfach über windows File IO operationen darauf zugreifen kann, ohne gleich eigene Treiber zu implementieren (beispiele gibts genug im netz). Was auch teilweise für anderen Standard classen gilt. (MassStorage, Virtual Com, ... ) gruss
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.