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:
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
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
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
Filename: | USB_OK.jpg |
Filesize: | 93.7 KB |
Title: | So sieht es ok aus |
Information: | Analyser |
Download counter: | 137 |
Filename: | USB_xferError.jpg |
Filesize: | 72.05 KB |
Title: | So sieht es nach dem auftreten des Fehlers aus |
Information: | Fehler |
Download counter: | 151 |