Hallo Forum,
ich probiere gerade den ATxmega128A3U mit USB vernünftig zu laufen zu
bekommen und nutze als Grundlage Beispiele aus dem ASF.
Als erstes soll der xmega als cdc device arbeiten und hier tauchen schon
die ersten Probleme auf. Sobald eine zu große Datenmenge (>320Byte) in
die Routine "udi_cdc_write_buf" geschrieben wird bleibt der xmega in der
"udi_cdc_multi_is_tx_ready" Schleife des ASF-Codes hängen. Anscheinend
passiert das, wenn der Buffer überläuft bzw. die neue Nachricht nicht
hineinpasst.
Die einzelnen Aufrufe umfassen jeweils 22Byte Daten und der Buffer fasst
320Byte. Vielleicht liegt es auch am leeren des Buffers durch den Stack?
Hatte jemand schon dieses Problem und weiß evtl. Rat?
Aufruf:
Hatte ich schon öfter, aber nur wenn am anderen Ende das
Terminalprogramm nicht geöffnet war...
In der ASF wird dafür eine globale Variable in den USB Interrupts
beschrieben... Die sollte man dann vor dem Senden prüfen...
Das udi_cdc_is_tx_ready() kannste dir glaube ich sparen... hatte ich
jedenfalls noch nicht benutzen müssen..
Hallo Basti,
Ah OK. Diese Callback hatte ich auch schon gefunden.
Das Problem ist, dass der PC schon noch verbunden ist, aber wohl der
xmega die Daten nicht schnell genug aus dem Buffer sendet. So läuft
dieser voll und die Endlosschleife beginnt. Vielleicht kann man auch den
verfügbaren Platz im Buffer abfragen?
Du hattest doch die GPS Sache gebaut, oder?
Danke
Daniel
ja, hab ich...
In dem GPS Projekt habe ich ein MB in 5 Sekunden übertragen (SPI zu USB
ohne DMA)(wenn mir das richtig in Erinnerung ist). Kann nicht behaupten
das da was übergelaufen wäre.
Habe aber auch schon angefangen ein paar Funktionen der ASF im Bezug auf
USB umzuschreiben. Da ging es aber eher um die Receive-Funktionen...
Was fast immer schief geht, sich debuggend durchs USB Programm zu
bewegen... da stürtzt dann meist was ab... vielleicht haste auch
irgendwo mal angehalten... dann wird das keine Runde sache...
Achso, und wenn der Takt nicht auf USB Kalibriert ist oder von nem
genauen Quarz kommt, dann kann es sein das USB sich bei bestimmten
Zeichenfolgen aufhängt. Da habe ich auch schon mal ewig gesucht...
Versuch mal keine 0 Zeichen oder what ever mit zu senden indem du den
hier machst:
udi_cdc_write_buf(TransferString, strlen(TransferString));
Wenn das Problemlos geht, schau dir mal die Taktversorgung an...
Grüße
Basti
OK.
Das der Debugger mit USB nicht funzt ist mir auch schon aufgefallen, das
hängt aber am USB Host, wenn der nicht kommunizieren kann beendet er die
Verbindung. Der Takt ist auf USB kalibriert kommt aber vom internen
32MHz Oszi.
Das komische ist, wenn ich in der while-Schleife mein log auslese und
die Summe der Zeichen (Einträge im Log * Länge des Transferstring)
kleiner als 320 Bytes ist funktioniert es problemlos, auch bei
mehrmaligen aufeinander folgenden Aufrufen. Als Transferstring habe ich
auch schon eine feste Zeichenkette mit exakter Länge definiert, da ist
aber das gleiche Problem.
Ich weiß auch nicht...
Das Problem wurde gefunden :-)
Auf keinen Fall dürfen längere Operationen in den Callbacks erfolgen,
die blocken die Interrupts des USB-Stacks.
Hätte ich auch früher drauf kommen können...