Auslesen PCF-8574 - I2C
Moderator: Guido Körber
Auslesen PCF-8574 - I2C
Hallo *,
mit dem Auslesen von einem PCF-8574 habe ich so meine Probleme. Natürlich kenne ich den Eintrag von fitzi (Link: http://www.codemercs.com/phpBB2/viewtop ... hlight=i2c), ich komme aber in dem Thema trotzdem nicht weiter.
Die Adresse des Baustseins ist auf 0x72 gestellt und das Schreiben auf den Baustein klappt in jeder Variante (div. LED's an einzelnen Bits). Auch die PullUp's an den Pin's für Einlesen habe ich schon probiert, leider kein Erfolg.
Hier mein Code, inzwischen total gekürzt:
unsigned char rep_send[8];
unsigned char rep_receive[8];
ULONG res;
// PCF8574
memset(&rep_send, 0, sizeof(rep_send));
memset(&rep_receive, 0, sizeof(rep_receive));
rep_receive[0]= 0x03;
rep_send[0]= 0x03;
rep_send[1]= 0x01;
rep_send[2]= 0x73;
res= IowKitWrite(devHandle,IOW_PIPE_SPECIAL_MODE,(PCHAR) &rep_send,sizeof(rep_send));
res= IowKitRead(devHandle,IOW_PIPE_SPECIAL_MODE,(PCHAR) &rep_receive,sizeof(rep_receive));
DWORD err= GetLastError();
UCHAR temp;
temp= rep_receive[0];
temp= rep_receive[1];
temp= rep_receive[2];
temp= rep_receive[3];
temp= rep_receive[4];
Wenn ich das Programm laufen lasse, bekomme ich folgende Werte zurück:
res= 0x08 - scheint ok
err= 0x00 - scheint auch ok
rep_receive[0]= 0x02 - ?, da müsste doch 0x03 kommen, oder ?
rep_receive[1]= 0x02 - ?, wieso kommen hier 2 Bytes zurück ?
rep_receive[2]= 0x00 - steht immer auf 0x00, egal wie die Bits beschaltet sind
rep_receive[3-n]= 0x00 - immer auf 0x00
Kann mir jemand hier einen Tip geben was ich falsch mache ?
Wäre echt nett.
Vielen Dank,
Bernhard
mit dem Auslesen von einem PCF-8574 habe ich so meine Probleme. Natürlich kenne ich den Eintrag von fitzi (Link: http://www.codemercs.com/phpBB2/viewtop ... hlight=i2c), ich komme aber in dem Thema trotzdem nicht weiter.
Die Adresse des Baustseins ist auf 0x72 gestellt und das Schreiben auf den Baustein klappt in jeder Variante (div. LED's an einzelnen Bits). Auch die PullUp's an den Pin's für Einlesen habe ich schon probiert, leider kein Erfolg.
Hier mein Code, inzwischen total gekürzt:
unsigned char rep_send[8];
unsigned char rep_receive[8];
ULONG res;
// PCF8574
memset(&rep_send, 0, sizeof(rep_send));
memset(&rep_receive, 0, sizeof(rep_receive));
rep_receive[0]= 0x03;
rep_send[0]= 0x03;
rep_send[1]= 0x01;
rep_send[2]= 0x73;
res= IowKitWrite(devHandle,IOW_PIPE_SPECIAL_MODE,(PCHAR) &rep_send,sizeof(rep_send));
res= IowKitRead(devHandle,IOW_PIPE_SPECIAL_MODE,(PCHAR) &rep_receive,sizeof(rep_receive));
DWORD err= GetLastError();
UCHAR temp;
temp= rep_receive[0];
temp= rep_receive[1];
temp= rep_receive[2];
temp= rep_receive[3];
temp= rep_receive[4];
Wenn ich das Programm laufen lasse, bekomme ich folgende Werte zurück:
res= 0x08 - scheint ok
err= 0x00 - scheint auch ok
rep_receive[0]= 0x02 - ?, da müsste doch 0x03 kommen, oder ?
rep_receive[1]= 0x02 - ?, wieso kommen hier 2 Bytes zurück ?
rep_receive[2]= 0x00 - steht immer auf 0x00, egal wie die Bits beschaltet sind
rep_receive[3-n]= 0x00 - immer auf 0x00
Kann mir jemand hier einen Tip geben was ich falsch mache ?
Wäre echt nett.
Vielen Dank,
Bernhard
- Christoph Jung
- Posts: 673
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Ja, ich verwende die iowkit.dll in der aktuellsten Version.
Es ist der genaue Code, den Methodenrumpf habe ich zur Verkürzung einfach weggelassen.
An die Antwort aus dem vorhergehenden Befehl habe ich auch schon gedacht. Der letzte Befehl ist ein Schreibbefehl für das Setzen der Portbits.
memset(&rep_send, 0, sizeof(rep_send));
rep_send[0]= 0x02;
rep_send[1]= 0xc2;
rep_send[2]= 0x72;
rep_send[3]= 0xff;
res= IowKitWrite(devHandle,IOW_PIPE_SPECIAL_MODE,(PCHAR) &rep_send,sizeof(rep_send));
res= IowKitRead(devHandle,IOW_PIPE_SPECIAL_MODE,(PCHAR) &rep_send,sizeof(rep_send));
Mit dem IowKitRead Befehl fange ich die Antwort ab; leider kommt aber trotzdem beim 0x03-Kommando eine 0x02 zurück.
Viele Grüße,
Bernhard
Es ist der genaue Code, den Methodenrumpf habe ich zur Verkürzung einfach weggelassen.
An die Antwort aus dem vorhergehenden Befehl habe ich auch schon gedacht. Der letzte Befehl ist ein Schreibbefehl für das Setzen der Portbits.
memset(&rep_send, 0, sizeof(rep_send));
rep_send[0]= 0x02;
rep_send[1]= 0xc2;
rep_send[2]= 0x72;
rep_send[3]= 0xff;
res= IowKitWrite(devHandle,IOW_PIPE_SPECIAL_MODE,(PCHAR) &rep_send,sizeof(rep_send));
res= IowKitRead(devHandle,IOW_PIPE_SPECIAL_MODE,(PCHAR) &rep_send,sizeof(rep_send));
Mit dem IowKitRead Befehl fange ich die Antwort ab; leider kommt aber trotzdem beim 0x03-Kommando eine 0x02 zurück.
Viele Grüße,
Bernhard
- Christoph Jung
- Posts: 673
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Hast du das, was du da sendes auch mal mit dem Generic HID-TOOL probiert? Im sinne von, ob da das gleiche rauskommt?
Meine frage aber ist, wie du die write/read-funktionen ansprichst.
Welche Special-Mode sprichst du denn genau an? IIC?
Dann noch wie du die speziellen befehle von IOWKIT_SPECIAL_REPORT verwendest / nicht verwendest. Für mich/uns ist nur ersichtlich, dass du 2 UCHAR verwendest und für den write- UND den read-Befehl die selben Bytes verwendest.
Meine frage aber ist, wie du die write/read-funktionen ansprichst.
Welche Special-Mode sprichst du denn genau an? IIC?
Dann noch wie du die speziellen befehle von IOWKIT_SPECIAL_REPORT verwendest / nicht verwendest. Für mich/uns ist nur ersichtlich, dass du 2 UCHAR verwendest und für den write- UND den read-Befehl die selben Bytes verwendest.
Software developer
@Christoph: Ja. mit dem HID-TOOL funktioniert alles; kannte das Tool bisher nicht, also liegt's an meinem Code ;-(
Ich programmiere in VC++ / Studio 6, die IO-Warrior Ansteuerung erfolgt aus einer DLL, die wiederum zieht die iowkit.dll an.
@wayoda: Der Schreibbefehl für das Setzen der LED antwortet richtig mit 0x02, 0x02 in meinem Programm (nicht im HID-Tool, dort natürlich auch).
Ich hab's jetzt nochmals mit IOWKIT_SPECIAL_REPORT statt mit meinen eigenen Puffern probiert, es geht einfach nicht. Auf 0x03,0x01,0x73 bekomme ich immer 0x02,0x02 zurück.
Hat noch jemand eine Idee ?
Viele Grüße
Bernhard
Ich programmiere in VC++ / Studio 6, die IO-Warrior Ansteuerung erfolgt aus einer DLL, die wiederum zieht die iowkit.dll an.
@wayoda: Der Schreibbefehl für das Setzen der LED antwortet richtig mit 0x02, 0x02 in meinem Programm (nicht im HID-Tool, dort natürlich auch).
Ich hab's jetzt nochmals mit IOWKIT_SPECIAL_REPORT statt mit meinen eigenen Puffern probiert, es geht einfach nicht. Auf 0x03,0x01,0x73 bekomme ich immer 0x02,0x02 zurück.
Hat noch jemand eine Idee ?
Viele Grüße
Bernhard
Hallo Eneas,
der bisher gezeigte Code schien mir schon immer gut auszusehen, und die einfachen UCHAR-Puffer sind auch ok.
Wen es dein Programm ermöglicht, würde ich einfach mal den Schreibbefehl (ReportID 0x02) weglassen und direkt lesen.
Ansonsten nur Spontan-Ideen die mir einfallen würden wenn es mein Code wäre:
Aus versehen wird der Schreibbefehl 0x02 zwei mal abgesetzt.
Ich habe den Rückgabewert von Read nach Senden des Lese-befehls nicht richtig ausgewertet, der ist fehlgeschlagen und sehe vor mir die Daten des letzten erfolgreichen Lesens.
Da die lib immer 128 Reports puffert, setze ich mal einen grösseren Timeout für das lesen und lese dann einfach mal so lange weiter bis Read nur mit einem Timeout-Fehler zurückkommt.
Eberhard
der bisher gezeigte Code schien mir schon immer gut auszusehen, und die einfachen UCHAR-Puffer sind auch ok.
Wen es dein Programm ermöglicht, würde ich einfach mal den Schreibbefehl (ReportID 0x02) weglassen und direkt lesen.
Ansonsten nur Spontan-Ideen die mir einfallen würden wenn es mein Code wäre:
Aus versehen wird der Schreibbefehl 0x02 zwei mal abgesetzt.
Ich habe den Rückgabewert von Read nach Senden des Lese-befehls nicht richtig ausgewertet, der ist fehlgeschlagen und sehe vor mir die Daten des letzten erfolgreichen Lesens.
Da die lib immer 128 Reports puffert, setze ich mal einen grösseren Timeout für das lesen und lese dann einfach mal so lange weiter bis Read nur mit einem Timeout-Fehler zurückkommt.
Eberhard
- Christoph Jung
- Posts: 673
- Joined: Sun Oct 08, 2006 3:43 pm
- Location: Germany / Berlin
- Contact:
Wenn du mit der iowkit.dll arbeitest, dann probier mal die auch variablentechnisch zu benutzen.
Beispiel:
Und versuch mal, was er Zurückliefert, wenn du für IowKitRead() und IowKitWrite() den selben Report nimmst.
Also:
Was möchtest du denn genau zurückbekommen?
Beispiel:
Code: Select all
IOWKIT_SPECIAL_REPORT report;
memset(&report,0,sizeof(report);
report.ReportID = 0x02;
report.Bytes[0] = 0xC2;
report.Bytes[1] = 0xFF;
Also:
Code: Select all
IowKitWrite(Handle,IO_Pins..., (PCHAR) report,sizeof(report));
IowKitRead(Handle,IO_Pins..., (PCHAR) report,sizeof(report));
Last edited by Christoph Jung on Thu Dec 21, 2006 2:58 pm, edited 1 time in total.
Software developer
Problem gelöst !
Der entscheidende Hinweis kam von Wayoda: Ich habe dir Rückantwort mehrfach eingelesen und beim 2. Lesen die erwartete Antwort erhalten !
Was ist passiert? Bei der Initialisierung der HW sind einige I2C Writebefehle (ID 0x02) abgeschickt worden, die Antwort dazu habe ich aber nie abgeholt; die kommt einem aber dann bei ersten I2C Lesen (ID 0x03) unter.
Jetzt fange ich generell bei 0x02 Kommandos die Antwort ab und gut ist es.
Diese Vorgehensweise habe ich im I2C Sample zwar bereits gesehen und auch ausprobiert, aber aus irgendeinem Grund hat's damals nicht funktioniert und ich hab mich verrannt.... ;-(
Viele Dank für die Unterstützung,
Bernhard
Der entscheidende Hinweis kam von Wayoda: Ich habe dir Rückantwort mehrfach eingelesen und beim 2. Lesen die erwartete Antwort erhalten !
Was ist passiert? Bei der Initialisierung der HW sind einige I2C Writebefehle (ID 0x02) abgeschickt worden, die Antwort dazu habe ich aber nie abgeholt; die kommt einem aber dann bei ersten I2C Lesen (ID 0x03) unter.
Jetzt fange ich generell bei 0x02 Kommandos die Antwort ab und gut ist es.
Diese Vorgehensweise habe ich im I2C Sample zwar bereits gesehen und auch ausprobiert, aber aus irgendeinem Grund hat's damals nicht funktioniert und ich hab mich verrannt.... ;-(
Viele Dank für die Unterstützung,
Bernhard