Hallo miparo,
ich muss Dich noch mal was fragen.
Nach dem das schnelle lesen ja nun ohne Probleme klappt, wollte ich mein Schreiben wieder aktivieren (PC zu XMEGA). Aber es läuft nicht mehr, wurde da was vom Ablauf geändert?
am PC:
Code
if devOpen then
begin
iERR:= usb_bulk_write(ADevice.Handle, $82, dataConfigCPU1, 64, USB_TIMEOUT);
if iERR < 1 then
begin
WriteLog('bulk write 1 failed');
SDIAppForm.USBInitialize;
Exit;
end
else
begin
WriteLog('bulk write 1 ok');
end;
end; // Ende wenn dev nicht offen
Egal was ich mache iErr ist immer <1, eigentlich sollte hier da der Wert der gesendeten Daten liegen, sprich 64. Oder?
Am XMEGA hatte ich ein ganz einfaches handling wie folgt:
Code
Process USB_RxTx (32, 256 : 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;
iTest,
xc : integer;
testChar : char;
begin
if USB_RxDataAvail then
Count:= USB_RxCount;
ComLed;
DebugOut('USB Datenanzahl:'+ ByteToHex( Count ));
// Kennungen XFER USB
// cmdWrite : Word = $FFFF; // Schreibbefehl
// cmdRead : Word = $0000; // Lesebefehl
// kenCfgBlock1 : Word = $0001; // Config Block 1
// kenCfgBlock2 : Word = $0002; // Config Block 2
// kenCfgBlock3 : Word = $0003; // Config Block 3
// kenCfgBlock4 : Word = $0004; // Config Block 4
// kenOnline : Word = $0F01;
//Structconst
// Cfg1 : TPVSConfig1;
// Cfg2 : TPVSConfig2;
// Cfg3 : TPVSConfig3;
// Cfg4 : TPVSConfig4;
// ziehe Block in Zwischenspeicher zum prüfen!
copyblock(@rxbuf, @InBuffer, sizeof(rxbuf));
// Prüfe Eingangsblock
if InBuffer[0] = kenCfgBlock1
then
if InBuffer[1] = cmdWrite
then
// Prüfe ob es einen Unterschied gibt um EEPROM Speicher zu schonen....
if not CompareBlock(@rxbuf, @Cfg1, sizeof(rxbuf))
then
copyblock(@rxbuf, @Cfg1, sizeof(rxbuf));
DebugOut('CFG1; Änderungen übernommen.');
endif;
DebugOut('Cmd: '+IntToStr(InBuffer[1]) +' / Kennung: '+IntToStr(InBuffer[0]));
endif; // Ende bei Write
elsif InBuffer[0] = kenCfgBlock2
then
if InBuffer[1] = cmdWrite
then
// Prüfe ob es einen Unterschied gibt um EEPROM Speicher zu schonen....
if not CompareBlock(@rxbuf, @Cfg1, sizeof(rxbuf))
then
copyblock(@rxbuf, @Cfg2, sizeof(rxbuf));
DebugOut('CFG2; Änderungen übernommen.');
endif;
DebugOut('Cmd: '+IntToStr(InBuffer[1]) +' / Kennung: '+IntToStr(InBuffer[0]));
endif; // Ende bei Write
endif; // Ende
USB_RxSetBuf(@RxBuf); // we need more data ..
endif; // Daten vorhanden ??
end; // Ende der Funktion
Eigentlich bin ich der Meinung, das ich zum schreiben auf dem XMEGA nicht unbedingt vorher ein ControlRequest machen muss. Das hatte vorher ja auch ohne Probleme funktioniert.
Oder muss ich dem XMEGA vorher sagen "...da kommt was...". Das habe ich die ganze Zeit eigentlich nicht gemacht, da der XMEGA in den ersten beiden Worten erkennen kann was es ist.
Oder ich habe mir beim ganzen testen irgendwas an der Function zerschossen
Gruß
Thorsten