Forum: Mikrocontroller und Digitale Elektronik ARM SAM7 USB Interrupt


von denis (Gast)


Lesenswert?

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.

von gerhard (Gast)


Lesenswert?

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

von embeddedsys (Gast)


Lesenswert?

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

von denis (Gast)


Lesenswert?

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?

von denis (Gast)


Lesenswert?

Kann mir einer sagen welcher Interrupt mir signalisiert,dass das USB 
Gerät an den PC USB Port an-/abgestekct wird?

von gerhard (Gast)


Lesenswert?

>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

von denis (Gast)


Lesenswert?

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.

von denis (Gast)


Lesenswert?

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 :-)

von denis (Gast)


Lesenswert?

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.

von embedded-os (Gast)


Lesenswert?

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.

von denis (Gast)


Lesenswert?

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