ich hab eine Frage zum Umgang mit dem IOW24 und Delphi
Leider scheitert bei mir der Versuch, die procedure HidCtlDeviceChange(Sender: TObject); aus der IOW IIC Demo in mein Programm zu übernehmen. Plug und Unplug werden erkannt, aber leider ist es mir danach nicht möglich, auf meine I2C bausteine zuzugreifen.
So sieht bei mir das Auslesen des I2C Bausteines aus:
Code: Select all
FillChar(Report, SizeOf(Report), 0);
Report.ReportID := $02; // ReportID IIC write request
Report.Bytes[0] := $82; // 2 bytes with IIC Start and Stop
Report.Bytes[1] := $90; // addresse byte = ADR 0, write
Report.Bytes[2] := $00 or (i-1);
IowKitWrite(IOWIIC, IOW_PIPE_SPECIAL_MODE, @Report, SizeOf(Report));
// swallow ACK report
IowKitRead(IOWIIC, IOW_PIPE_SPECIAL_MODE, @Report, SizeOf(Report));
if (Report.Bytes[0]<>2) then
showmessage('I2C Baustein nicht erreicht bytes[0]: 0x' + inttohex(Report.Bytes[0],2));
"I2C Baustein nicht erreicht bytes[0]: 0x82"
Folgende Procedure wird OnDevicechange ausgeführt (nur geringfügig zum Original aus dem SDK geändert):
Code: Select all
procedure TForm1.HidCtlDeviceChange(Sender: TObject);
var
I: Integer;
Report : IOWKIT_SPECIAL_REPORT;
// Report: TIICReport;
BytesWritten: DWORD;
// all IOWarriors have IIC
function FindIOWComplex(HidDev: TJvHidDevice): Boolean; stdcall;
begin
// IO-Warrior special mode interface match criteria
Result := (HidDev.Attributes.VendorID = cCodeMercsVID) and
(HidDev.Attributes.ProductID = cIOW24PID)
and
(HidDev.Caps.OutputReportByteLength = 8);
end;
begin
showmessage('HidCtlDeviceChange');
if assigned (iowiic) then
showmessage('assigned iss er');
// free IOW object if it has been unplugged
if Assigned(IOWIIC) and not IOWIIC.IsPluggedIn then
begin
showmessage('assígned aber nicht plugged in');
// disable reader timer
Timer1.Enabled := False;
showmessage('Timer gestopt, IOW wurde gerade abgezogen angeschlossen');
FreeAndNil(IOWIIC);
exit;
end;
// search for an IOW if not already found
if not Assigned(IOWIIC) then
IOWIIC := IowKitOpenDevice;
if Assigned(IOWIIC) then
begin
showmessage('assigned is er, checkout by callback erfolgreich');
// IOW found, enable IIC
FillChar(Report, SizeOf(Report), 0);
Report.ReportID := $01;
Report.Bytes[0] := $01; // enable IIC
IowKitWrite(IOWIIC, IOW_PIPE_SPECIAL_MODE, @Report, SizeOf(Report));
// enable reader timer
showmessage('Timer gestartet, IOW wurde angeschlossen');
Timer1.Enabled := True;
end
else
// for I := Low(Values) to High(Values) do
// no IOW, show bogus value
// Values[I].Caption := '?,?? V';
end;
eine Initialisierung mit dem folgenden quelltext, dafür aber ohne ausgeführte procedure OnDeviceChange führt zu keiner fehlermeldung, ich erhalte ordnungsgemäße werte von meinem I2C Baustein.
Code: Select all
IOWIIC := IowKitOpenDevice;
if Assigned(IOWIIC) then
begin
// IOW found, enable IIC
FillChar(Report, SizeOf(Report), 0);
Report.ReportID := $01;
Report.Bytes[0] := $01; // enable IIC
IowKitWrite(IOWIIC, IOW_PIPE_SPECIAL_MODE, @Report, SizeOf(Report));
Timer1.Enabled := true;
end
else begin
showmessage('IOWarrior nicht angeschlossen, es finden keine Messungen statt´');
end;
kann mir da jemand weiterhelfen? hat es evtl mit dem CheckOutByCallback(IOWIIC, @FindIOWComplex) zu tun?
Vielen Dank,
Gruß Martin.