Forum: Mikrocontroller und Digitale Elektronik Grundsätzliche Fragen zu USB (AT91SAM7XC256)


von Jens (Gast)


Lesenswert?

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.

von gerhard (Gast)


Lesenswert?

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

von Jens (Gast)


Lesenswert?

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

von Guido Körber (Gast)


Lesenswert?

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.

von Termite (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.