Hallo Leute,
ich würde gerne über USB Daten an einen AT90USB647 schicken. Alles was
ich brauche ist, die Daten zum uC zu schicken und zurückbekommen. Ich
habe die Beispielanwendungen HID und CDC vom Atmel getestet. Es lief so
weit gut, nur war es sehr langsam. Die CDC Firmware von Atmel habe ich
etwas angepasst, und ich kam auf cca. 0,2Mbit/s. Ich habe gelesen, dass
viele Leute das Problem haben und es liegt wohl auf dem CDC Treiber von
Windows. USB 2.0 muss etwas im Bereich von 1Mbit/s locker schaffen und
da er uC die Daten nur zurückschicken soll dürfte er damit auch klar
kommen. Nun habe ich mir überlegt, die USB Ansteuerung mit Hilfe von
Libusb zu machen. Ich kenne mich mit USB noch zu wenig aus und weiss ich
nicht, ob es ne gute Idee ist, ich meine ob ich dadurch die
Übertragungsgeschwindigkeit erhöhen kann. Das wäre also die erste Frage.
Die zweite Frage wäre, dass wenn ich das mal so machen möchte, weiss ich
gar nicht wie ich anfangen soll. Genauer gesagt, wie muss die Firmware
auf dem Atmel aussehen, soll es als CDC, HID oder so von PC erkannt
werden, damit ich mit libusb den uC ausfindig machen und Daten mit ihm
austauschen kann?
Danke
Patrik
Patrik Krizan wrote:
> USB 2.0 muss etwas im Bereich von 1Mbit/s locker schaffen und> da er uC die Daten nur zurückschicken soll dürfte er damit auch klar> kommen.
"USB 2.0" sagt nix über die Geschwindigkeit aus, die USB 2.0 Spec
enthält schließlich auch noch den LowSpeed Modus...
> Genauer gesagt, wie muss die Firmware> auf dem Atmel aussehen, soll es als CDC, HID oder so von PC erkannt> werden, damit ich mit libusb den uC ausfindig machen und Daten mit ihm
Das ist egal, nimm am besten was eigenes ("Vendor Specific", 0xFF), dann
funkt dir auch bestimmt kein anderer Treiber dazwischen.
Hallo Ernst,
danke für die Anwort. D.h., wenn ich das CDC Beispiel von Atmel nehme
und dort einfach 'VendorID' ändere, reicht es schon oder muss ich dort
mehr ändern?
grüsse
Patrik
Vermutlich schon, allerdings müsstest du einen Windows-Experten fragen,
ob sich dann trotzdem der Windows-eigene CDC-Treiber das Device krallt.
(Unter Linux wär das so)
Und dann müsstest du in deinem LibUSB-Programm das ganze CDC-Gedöhns
nachprogrammieren.
Einfacher ist: ein Vendor Specific device/interface deklarieren, einen
Bulk-Endpoint für jede Richtung, und fertig.
Aha, ok. Ich werde mich wohl mehr ins Thema USB einarbeiten müssen denn
das mit Vendor Specific device/interface deklarieren und Bulk-Endpoint
verstehe ich noch nicht ganz. Im CDC Firmware von Atmel habe ich schon
die Stellen mit Usb_Set_Endpoint zwar gefunden, ist mir aber nicht klar
wozu das gut ist. Ich weiss jetzt aber ungefähr wo ich Anfangen soll und
die Richtung die ich verfolgen muss.
Aber noch eine Frage hätte ich. Wenn ich etwas eigenes mache, dann wird
doch das USB-Device als Unbekanntes Gerät erkannt oder? Wenn ich dann
das entsprechende Program/Dll für PC schreibe ... daraus entsteht doch
kein Treiber. Wie sieht dann also die ganze Geschichte auf der PC Seite
aus?
danke
Patrik
Patrik Krizan wrote:
> Aha, ok. Ich werde mich wohl mehr ins Thema USB einarbeiten müssen denn> das mit Vendor Specific device/interface deklarieren und Bulk-Endpoint> verstehe ich noch nicht ganz. Im CDC Firmware von Atmel habe ich schon> die Stellen mit Usb_Set_Endpoint zwar gefunden, ist mir aber nicht klar> wozu das gut ist. Ich weiss jetzt aber ungefähr wo ich Anfangen soll und> die Richtung die ich verfolgen muss.
Jede Kommunikation bei USB läuft über so genannten Endpoints. Im
wesentlichen gibt es IN Endpoints und OUT Endpoints, wobei OUT aus dem
PC heraus bedeutet. Den Endpoint 0 gibts noch, da wird das USB Gerät
drüber eingestellt.
Im einfachsten Fall musst du einen BULK-OUT und einen BULK-IN Endpoint
machen. Damit kannst du dann über die LibUSB kommunizieren.
> Aber noch eine Frage hätte ich. Wenn ich etwas eigenes mache, dann wird> doch das USB-Device als Unbekanntes Gerät erkannt oder? Wenn ich dann> das entsprechende Program/Dll für PC schreibe ... daraus entsteht doch> kein Treiber.
LibUSB ist ein generischer USB Treiber, der für alle USB Geräte
verwendet werden kann. Du musst dir dann eine USB Vendor ID kaufen, die
in den Chip eintragen, eine Product ID ausdenken, die ebenfalls
eintragen, und die selben beiden IDs in das inf File eintragen, was bei
der LibUSB dabei ist.
Wichtig ist, dass du LibUSB Win 32 Device Driver benutzt, und nicht den
Filter Driver.
Mittlerweile gibts auch im Windows einen eigenen universellen USB
Treiber, den WinUSB, der kann im Gegensatz zur LibUSB auch asynchrone
Transaktionen.
Eine eigene Frage?
Dieser Thread ist über 17 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.