XMega USBsmart setzt aus

  • 1
  • 2
  • 3
  • 4
  • 5
  • Page 1 of 5
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

XMega USBsmart setzt aus

 · 
Posted: 13.09.2014 - 21:52  ·  #1
Hallo Leute,

ich habe da mal wieder ein Problem mit XMEGA und USBsmart.

Ich habe eine Routine auf meinem Windows Programm, das alle 200ms den ONLINE-Status meiner USB-CPU abfragt.

Das läuft eigentlich ganz gut nur passiert es ab und an, das der XMEGA ohne erkennbaren Grund das senden der Daten einstellt! Und ich weiss nicht wie ich das abfangen soll um den Transfer wieder zu starten.

Ich sende ein Controlrequest Host->Device 0x60, der XMEGA antwortet dann mit einem Datenpaket von 64Byte. Das läuft mal 500x durch bis der XMEGA das senden einstellt, mal 2400x oder auch mal 3000x aber manchmal auch nur 100x.

Ich habe den Transfer wie folgt aufgebaut:
Code
Task ControlJob(iData, resumed);
begin
  USB_ControlJob;
end;

{--------------------------------------------------------------}
Process USB_RxTx (128, 128 : iData); {Stacksize = 128 bytes, Framesize = 128 bytes}
//Procedure USB_CheckRxTx;
Var Count, C: byte;
 InBuffer  : Array[0..31] of WORD;
 OutBuffer : Array[0..59] of Byte;
 StrBuffer : string[59];
 iTest,
 xc        : integer;
 testChar  : char;
begin
...
...
...
 
//Daten ausgeben über USB
// USB Action beantworten
if  usbAct = $60 then
  usbAct :=0;
   ONLStatus.Kennung:= kenOnline;
    ONLStatus.CMD:= cmdWrite;
   copyblock(@ONLStatus, @TxBuf, sizeof(TxBuf));

 DebugOut('TX');
  USB_TxSend(@TxBuf,64);
   SetSysTimer( TimeOutTimer, 15); //Setze TimeOut
   Repeat until (USB_TxComplete or isSysTimerZero( TimeOutTimer)) ; // Warte bis TxComplete oder TimeOut

    if isSysTimerZero( TimeOutTimer) then
      DebugOut('TIMEOUT');
     endif;
     
endif; // $60


Der ControlJob läuft über den Task, diese werden auch weiterhin abgehandelt (siehe Bilder Analyser), wenn der Fehler auftritt läuft er beim USB_TxSend nur noch gegen den Timeout.
Aber es werden keine Bulkdaten mehr an den Host gesendet (siehe Bilder).

Danach verhält sich der XMEGA komisch, wenn ich resete läuft wieder alles wunderbar, wenn ich aber nur den USB-Stecker abziehe und einstecke erhalte auf dem Windows PC 3 x die Meldung "USB Gerät nicht erkannt" beim 4. mal wird der XMEGA wieder erkannt ???

Wie bekomme ich den XMEGA USB, dann wieder zum leben? Über den TimeOut könnte ich den Fehler abfangen und evtl. wieder den USB starten.

1. Wie kann ich im laufenden Betrieb den USB-Bulk neu starten (XMEGA Seite)?
2. Warum passiert das überhaupt?

Gruß
Thorsten
Attachments
So sieht es ok aus
Filename: USB_OK.jpg
Filesize: 93.7 KB
Title: So sieht es ok aus
Information: Analyser
Download counter: 137
So sieht es nach dem auftreten des Fehlers aus
Filename: USB_xferError.jpg
Filesize: 72.05 KB
Title: So sieht es nach dem auftreten des Fehlers aus
Information: Fehler
Download counter: 151
miparo
Administrator
Avatar
Gender:
Location: Germany
Age: 58
Posts: 959
Registered: 09 / 2007
Subject:

Re: XMega USBsmart setzt aus

 · 
Posted: 13.09.2014 - 23:44  ·  #2
Hallo pvs,
das kann doch mit 128 bytes im USB_RXTX Procccess so nicht laufen wenn dein DebugOut( OutStr : String[100] ) schon 100 Bytes auf dem Frame braucht.
Und zur Sicherheit das Senden mit einem LOCK schützen vor einem Taskwechsel.

Beides mal testen :)

Gruß
miparo
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: XMega USBsmart setzt aus

 · 
Posted: 14.09.2014 - 09:50  ·  #3
Hallo miparo,

jetzt habe ich eine Test Applikation geschrieben und das blöde Ding läuft seit über 10.000x durch,
es gab 5 Timeouts. Aber die Kommunikation wurde nicht unterbrochen.

Da die anderen Programmteile (i2c und Steuerfunktionen) bei diesem Testprogramm rausgenommen wurden, scheint es an der Anzahl der Processe/ Programmgröße zu liegen.

Es wird nicht viel bringen, wenn ich Dir das Testprogramm (XMEGA) sende, in der abgespeckten Version tut es der USBsmart :(

Aber ich möchte mit meinem XMEGA noch was anderes machen als USB-Kommunikation :3some:

Ich spiele mal ein bisschen mit den PRIOs rum, mal sehen ob es irgendwie mal Stabil mit allen Treibern läuft

Gruß
Thorsten
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: XMega USBsmart setzt aus

 · 
Posted: 14.09.2014 - 16:37  ·  #4
Hallo miparo,

der USBSmart läuft mit dem anderen Programmteilen sehr instabil :(

Ich habe jetzt die Prio vom TASK und USB_RxTx auf Prio 3 gesetzt, damit läuft es etwas stabiler :(

Code

Process USB_RxTx (200, 200 : iData,3 ); 
//Procedure USB_CheckRxTx;
Var Count, C: byte;
 InBuffer  : Array[0..31] of WORD;
 OutBuffer : Array[0..59] of Byte;
 iTest,
 xc        : integer;
 testChar  : char;
begin
//Daten ausgeben über USB
// USB Action beantworten
if  usbAct = $60 then
  usbAct :=0;
   ONLStatus.Kennung:= kenOnline;
    ONLStatus.CMD:= cmdWrite;
   copyblock(@ONLStatus, @TxBuf, sizeof(TxBuf));

 //DebugOut('TX');
  LOCK(USB_RxTx); // Sperre Process für sicheren transfer
   USB_TxSend(@TxBuf,64);
     UNLOCK(USB_RxTx); // gebe Process wieder frei
   SetSysTimer( TimeOutTimer, 15); //Setze TimeOut
   Repeat until (USB_TxComplete or isSysTimerZero( TimeOutTimer)) ; // Warte bis TxComplete oder TimeOut

    if isSysTimerZero( TimeOutTimer) then
     LOCK(USB_RxTx); // Sperre Process für sicheren transfer
      DebugOut('TIMEOUT');
          mDelay(100);
          USB_Detach;
          mDelay(100);
         USB_Init(@RxBuf);        // Attach USB and connect RxBuf for FIRST RX INT

       UNLOCK(USB_RxTx); // gebe Process wieder frei
     endif;
     
endif; // $60


Ich habe jetzt beim TimeOut ein
Code
 
mDelay(100);
   USB_Detach;
     mDelay(100);
       USB_Init(@RxBuf); 


Damit bekomme ich das Teil zwar wieder zum leben ohne Reset, aber mein Windowsprogramm läuft erstmal gegen die Wand, da der Pointer nicht mehr gültig ist.

Ich finde das eine sehr unsaubere Lösung, warum stellt der Treiber seinen Dienst einfach ein?

Ich kann diesen Fehler sehr einfach reproduzieren, ich brauche nur mal eine Excel Datei im Hintergrund auf dem PC öffnen und schon ist der Fehler da!

Ich brauche hier eine Möglichkeit den USB auf dem XMEGA zu starten ohne das Gerät zu entfernen/Detach. Der USBSmart sendet einfach keine Daten mehr und läuft nur noch gegen den Timeout. Wie kann man das lösen?

Gruß
Thorsten
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: XMega USBsmart setzt aus

 · 
Posted: 14.09.2014 - 17:22  ·  #5
Hallo Thorsten,

der ControlJob muss spätestens innerhalb 50msec einmal laufen.
Ansonsten hilft hier nur ein Testprogramm sowohl auf der AVR Seite
als auch auf der PC Seite wo das Problem auftritt. Und was das Exel
damit zu tun hat ist uns schleierhaft.

Wir sind zur Zeit dabei den LibUSB Treiber zu durchforsten. Vielleicht
kommt da was raus dabei...

rolf
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: XMega USBsmart setzt aus

 · 
Posted: 14.09.2014 - 17:41  ·  #6
Quote by rh

Hallo Thorsten,

der ControlJob muss spätestens innerhalb 50msec einmal laufen.
Ansonsten hilft hier nur ein Testprogramm sowohl auf der AVR Seite
als auch auf der PC Seite wo das Problem auftritt. Und was das Exel
damit zu tun hat ist uns schleierhaft.

Wir sind zur Zeit dabei den LibUSB Treiber zu durchforsten. Vielleicht
kommt da was raus dabei...

rolf

Hallo rolf,

ich glaube wenn Windows sich zu viel Zeit lässt, die Daten abzuholen, tritt der Fehler auf.

Ich habe den gleich Effekt beim benutzen der nr_ComLib (von DeepSoftware) mit deren USB/USBPipe-Treiber. Ich glaube nicht das das Problem bei beiden Treibern liegt (Windows).
Wenn ich das XMEGA-Programm komplett abspecke und nur noch den USB-Teil laufen lasse, kommt der Fehler nicht. Dieses Programm kann ich euch gerne mal zusenden.
Ich sende euch auch gerne mal das aktuelle Vollprogramm per PM zu, als Windows-Testprogramm habe ich euren USB-Tester etwas angepasst, das kann ich euch auch senden.

Ich versuche das ganze im Moment mit den Prios etwas auszugleichen, komme aber nicht zum sauberen Stand. Mittlerweile habe ich fast die ganze Debugausgabe abgeschaltet (Ser.-Ausgabe), dadurch läuft es noch etwas stabiler :(

Ich Versuche nun die I2C Funktionen mit den LOCKs zu schützen, da ich hier komische Nebeneffekte beim Timeout / Detach / USBINIT habe. Es werden falsche Werte an den I2C Bausteinen gesendet ???? Vielleicht habe ich jetzt zu viel an die Prios und Frames gespielt :(

Gruß
Thorsten
miparo
Administrator
Avatar
Gender:
Location: Germany
Age: 58
Posts: 959
Registered: 09 / 2007
Subject:

Re: XMega USBsmart setzt aus

 · 
Posted: 16.09.2014 - 20:37  ·  #7
Hallo pvs,
da es wohl mit deinem Fehler Demo nichts wird, habe ich mal ein kleines Win und Xmega Prog. geschrieben.

Das Win Prog. schickt eine Ctrlrequest Anfrage und der usbSmart antwortet mit einem Bulk IN.
Das ganze im Loop.
Alles im Process/Task und mit Writeln usw.
Nebenbei kann ich auch mein Excel oder Delphi XE starten =D> (warum auch nicht !)

btw.
Ein überarbeitetes libUSB Interface ist enthalten. Ersetzt das libUSBdyn.pas

miparo

UPDATE: libusb.pas Unicode fähig.
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: XMega USBsmart setzt aus

 · 
Posted: 17.09.2014 - 10:29  ·  #8
Quote by miparo

Das Win Prog. schickt eine Ctrlrequest Anfrage und der usbSmart antwortet mit einem Bulk IN.
Das ganze im Loop.
Alles im Process/Task und mit Writeln usw.
Nebenbei kann ich auch mein Excel oder Delphi XE starten =D> (warum auch nicht !)


Tja, wenn ich das wüsste... sobald der Rechner viele Daten über das Netzwerk zieht kommt der TimeOut. Und der USBsmart hängt.

Bei 16.000 Versuchen waren trat der Fehler ca. 180x auf.
Nutze ich das abgespeckte Programm (nur USBSmart) läuft es ohne Probleme durch.

Quote by miparo

btw.
Ein überarbeitetes libUSB Interface ist enthalten. Ersetzt das libUSBdyn.pas


Ok, was hast Du geändert, wenn ich fragen darf?

Ich habe gestern mal ein Renesas RX62CN (liegt noch ein Demoboard hier) ein kleines USB-Programm geschrieben, das ebenso Antwortet da tritt der Fehler nicht auf. Die Kiste hat aber auch deutlich mehr Dampf (100MHz)

Bei der Gelegenheit, ich wollte mal zum testen die Frequenz auf Overdrive stellen. Warum muß ich für FAT16 und USB den Internen 2MHz Nutzen und nicht den 32er (8MHz)?

Gruß
Thorsten
  • 1
  • 2
  • 3
  • 4
  • 5
  • Page 1 of 5
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 16 · Cache Hits: 15   141   156 · Page-Gen-Time: 0.037067s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI