Hallo, ich bin grade dabei eine USB Kommunikation SAM7A3 mit PC Software herzustellen. Dazu benutze ich den cdc_enumerate Beispiel von Atmel und das klappt soweit ganz gut mit Anmelden, Lesen und Schreiben. Jetzt habe ich aber ein Problem: Mein Programm im Kontroller hängt sich beim Lesen vom USB auf wenn grade kein Transfer stattfindet. D.h. Er wartet so lange bis er was vom PC per USB bekommt. Gibt es einen Interrupt den ich abfragen kann ob grade was am Endpoint 1 ankommt? So könnte ich nur dann lesen wenn auch wirklich was ankommt an Daten, ansonsten wird die Lesefunktion übersprungen.
hallo du verwendest offensichtlich noch sehr alte atmel beispiele für den usb port. unter http://www.atmel.com/dyn/products/tools_card.asp?tool_id=4092 findest du ein sog framework, welches interrupt gesteuert arbeitet und auch schon unterstützung für div. usb classes beinhaltet. gruss gerhard
Hi, ja die Beispiele sind schon etwas alt. Das Projekt basiert auf einer Diplomarbeit und sollte "wenn möglich" nicht zu sehr abgeändert werden. Wie groß ist der Unterschied vom CDC Framework Beispiel zu dem "alten" cdc Beispiel von Atmel? Das Beispiel aus dem Framework benutzt irgendwie seriell Port wie ich das auf die schnelle sehen konnte oder? Es wäre blöd jetzt alles zu portieren, dachte es gäbe irgendwelche Interrupts die ich abfangen kann wenn Daten aus dem Bulk EP ankommen??? Gruß Denis
Ich glaube ich habe das was gefunden. Der UDP_ISR Register gibt mir aktuelle Informationen über den USB Port Zustand. Da den Wert für EP Interrupt auslesen müsste mir reichen um zu sehen ob was am Pipe an Daten ankommt oder nicht. Oder liege ich da falsch in meiner Vermutung?
Kann mir einer sagen welcher Interrupt mir signalisiert,dass das USB Gerät an den PC USB Port an-/abgestekct wird?
>Kann mir einer sagen welcher Interrupt mir signalisiert,dass das USB >Gerät an den PC USB Port an-/abgestekct wird? wird im datenblatt entspr. beschrieben, such mal nach "VBUS Monitoring". gruss gerhard
Ach ja jetzt sehe ich es, vielen Dank für den Tip. Wieso hat Atmel den Pin am PIO direkt am Entwicklungsboard nicht mitberücksichtigt? Ich habe angenommen, dass sowas schon vorhanden ist und es würde reichen einen bestimmten Register auszulesen um zu erkennen ob USB angesteckt ist oder nicht.
Eine Frage habe ich aber immer noch: Wie kann ich mein USB in der Fimrware zurücksetzen so dass er beim Abstecken vom Host wieder resetet wird? Ich habe jetzt das Problem wenn ich das Gerät ansteck initialisiert es sich unf funktioniert gut. Wenn ich aber die USB Verbindung trenne und erneut anschliesse dann kann ich zwar von der PC Software aus den Bus öffnen aber ich kann nicht Daten schreiben. Ich nehme an dass die Konfiguration beim erster Initialisierung nicht zurückgesetzt wird. Mein USB Gerät ist self-powered, also arbeitet die Firmware auch wenn USB nicht angeschlossen ist. Hoffe jemand kann mir ein Tip geben :-)
Habe mein Problem bis jetzt leider immer noch nicht in den Griff bekommen :-((( Hat keiner ein Tip für mich????? Ich habe nämlich das Problem wenn sich mein USB Device am Host das erste mal anmeldet dann kann ich es PC-Software-seitig öffnen und auch ansprechen (Transfer Read/Write). Das funktioniert soweit sehr gut. Vorlage CDC Beispiel von Atmel (cdc_enumerate.c) So wenn ich jetzt das Gerät vom USB trenne (Die Firmware des Gerätes läuft derzeit weiter weil das Gerät eigene Versorgung hat und weiterhin Messwerte aufnimmt) und dann wieder anstecke wird es zwar als USB Gerät ganz normal erkannt nur habe ich Probleme den von meiner PC-Software aus anzusprechen. USB.Open funktioniert erst nach mehrmaligen probieren und dann wenn es geöffnet ist schluckt er manche Datenpakete. Erst wenn ich das Gerät komplett resete (Hardware reset) dann funktioniert alles wieder gut. Bitte um Hilfe falls einer von Euch das selbe Problem hatte oder mir ein Tip geben kann an welcher Stelle ich schauen kann.
Immer wenn der Atmel wieder an den Host gesteckt wird, fordert der PC ein Get_Descriptor, der aber vom Host selbst wieder abgebrochen wird (Windows typisch). danach wird ein USB_RESET durch den PC ausgelöst. Auf Grund dieses USB_RESET muß sich je nach USB-Klasse alles im Device der Schichten USB und USB-Klasse bzw. einige Teile davon zurücksetzen. Also, wenn du das Board wieder an den PC hängst, solltest du mindestens einen USB_RESET-Interrupt bekommen, der je nach verwendeter USB-Klasse alles-USB oder nur Teile reinitialisiert. Wenn da was fehlt - bei der "ReInit()" - bekommst Du dann gleich oder später Probleme.
Hi, danke für die Tips hat soweit alles geklappt. Ein Problem habe ich allerdings noch :-( Wenn ich von der PC-Software aus das USB Gerät öffnen möchte (ich verwende den atm6124.sys Treiber und die USBLibrary) dann öffnet es manchmal sofort und manchmal muss ich mehrmals den Befehl ausführen bis das Gerät erfolgreich geöffnet wird. Woran könnte das liegen? Benutzt jemand von euch den cdc Treiber mit der USBLibrary?
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.