IOW 24-DG Problem mit Kombiniertem Write / Read auf I2C

Dies ist das deutsche Forum für alle Themen um den IO-Warrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

Post Reply
wberger
Posts: 4
Joined: Thu Mar 18, 2010 8:19 pm

IOW 24-DG Problem mit Kombiniertem Write / Read auf I2C

Post by wberger »

Ich benutze den IOW24-DG als I2C Interface. Die Steuersoftware läuft in Visual C++ CLI .Net.

Bisher funktioniert bereits:
* Öffnen des Devices
* Schreiben von Kommandos auf das Device

Nun benötige ich folgende Lesefunktion:
[Start] [Adresse] Write: [Kommando] [Repeated Start] [Adresse] Read [Data 1] [data 2] [Stop]

Also konkret möchte ich vor dem Lesen noch ein Kommando schreiben, dann aber nicht per Stop den Bus freigeben, sondern sofort mit dem lesen beginnen. Das ist buskonform und kann zum Beispiel für Eeproms verwendet, dabei ist das Kommando die Startadresse.

Die Idee war nun, zuerst ein Write Kommando ohne Stop zu schicken und dann das Read. Implementiert wie folgt:

Code: Select all

// Zuerst der Schreibbefehl ohne Stop

memset(&report, 0, IOWKIT56_SPECIAL_REPORT_SIZE);
report.ReportID = 0x02; // Enable Write-Mode
report.Bytes[0] = 0x80 + 2; // Start only , 0x80 plus number of bytes to transmitt + control byte + command byte. 
report.Bytes[1] = i2c_adress; // Address of slave device
report.Bytes[2] = command_nr;		// Command
IowKitWrite(iowHandle, IOW_PIPE_SPECIAL_MODE, (char*) &report, IOWKIT_SPECIAL_REPORT_SIZE);

// Read back for getting failure or success
IowKitRead(iowHandle, IOW_PIPE_SPECIAL_MODE, (char*) &report, IOWKIT_SPECIAL_REPORT_SIZE);
if(report.Bytes[0] & 0x80)
	richTextBox_detector_log->AppendText("\nI2C read - first part failed!\n");

// Jetzt lesen
memset(&report, 0, IOWKIT56_SPECIAL_REPORT_SIZE);
report.ReportID = 0x03; // Enable Read-Mode
report.Bytes[0] = i2c_datalength; 
report.Bytes[1] = i2c_adress | 1; // Address of slave plus read bit

IowKitWrite(iowHandle, IOW_PIPE_SPECIAL_MODE, (char*) &report, IOWKIT_SPECIAL_REPORT_SIZE);
memset(&report, 0, IOWKIT56_SPECIAL_REPORT_SIZE);
IowKitRead(iowHandle, IOW_PIPE_SPECIAL_MODE, (char*) &report, IOWKIT_SPECIAL_REPORT_SIZE);	
So mal im Groben.

Problem 1: Auf dem Bus geht der erste Teil des Kommandos raus und dann ist eine Wartezeit von 8ms drinn. Kann aber auch am .net code liegen --> nicht so problematisch
Problem 2: Der Read Befehl startet und vom Slave kommen tatsächlich die richtigen Daten. Allerdings bricht der IOWarrior nach dem letzten Datenbyte aber vor dem NACK des Slave ab. Die Daten die im "report" stehen sind Zufallswerte die nichts mit den Bus Daten zu tun haben.

Ist in obigem Vorgehen ein Fehler?
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: IOW 24-DG Problem mit Kombiniertem Write / Read auf I2C

Post by Christoph Jung »

Da es sich um einen IO-Warrior24 handelt folgendes ändern:

memset(&report, 0, IOWKIT56_SPECIAL_REPORT_SIZE);

memset(&report, 0, IOWKIT_SPECIAL_REPORT_SIZE);

Und mal nachschauen ob report auch vom typ IOWKIT_SPECIAL_REPORT ist. Meist ist das der Fehler.
Ansonsten sieht der Code an sich gut aus.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: IOW 24-DG Problem mit Kombiniertem Write / Read auf I2C

Post by Guido Körber »

Die Vorgehensweise ist prinzipiell richtig. Was kommt denn bei Verwendung von SimpleI2C raus?
wberger
Posts: 4
Joined: Thu Mar 18, 2010 8:19 pm

Re: IOW 24-DG Problem mit Kombiniertem Write / Read auf I2C

Post by wberger »

Kleine Korrektur:
Die Daten kommen tatsächlich richtig an. Ich hatte nur beim umkopieren einen Fehler drin.
Nach wie vor bleibt aber das Problem dass der Clock für das letzte NACK des Slave fehlt.

Damit ist die Lösung zwar erst mal einigermaßen funktional, da die Daten ankommen. Allerdings wirft mein Buslogger bei jeder Übertragung einen Fehler, der mit anderen Interfaces nicht auftritt.
wberger
Posts: 4
Joined: Thu Mar 18, 2010 8:19 pm

Re: IOW 24-DG Problem mit Kombiniertem Write / Read auf I2C

Post by wberger »

Guido Körber wrote:Die Vorgehensweise ist prinzipiell richtig. Was kommt denn bei Verwendung von SimpleI2C raus?
Wenn ich das richtig verstehe, bietet SimpleI2C diese Möglichkeit nicht. Da wird immer ein Stop geschickt, das ich aber bei meinem speziellen Slave Device nicht schicken darf.

Danke für den Hinweis mit der fehlerhaften Verwendung von IOWKIT56_SPECIAL_REPORT
habe alles auf IOWKIT_SPECIAL_REPORT korrigiert. Macht aber keinen Unterschied.

Unten habe ich mal einen Screenshort aus dem Datenlogger angehängt. Man sieht die sehr lange Zeit in der zweiten Zeile am Ende (eventuell durch .net bedingt?). Darüberhinaus sieht man auch am Schluss das fehlende 9. Bit für das Not Acknowledge.
Attachments
Ausgabe des Datenloggers am I2C beim Transfer:<br />[START] Write 0x52 Command 0x98, [START] Read 0x53 Data 0xA2[STOP]
Ausgabe des Datenloggers am I2C beim Transfer:
[START] Write 0x52 Command 0x98, [START] Read 0x53 Data 0xA2[STOP]
i2c_log.jpg (30.72 KiB) Viewed 6558 times
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: IOW 24-DG Problem mit Kombiniertem Write / Read auf I2C

Post by Guido Körber »

Das ist korrekt, die IO-Warrior24 und 40 erzeugen den Takt für das letzte ACK Bit nicht, das funktioniert prinzipiell so und die Slaves müssen damit auch leben können, aber viele Analyzer zeigen das als Fehler an.
wberger
Posts: 4
Joined: Thu Mar 18, 2010 8:19 pm

Re: IOW 24-DG Problem mit Kombiniertem Write / Read auf I2C

Post by wberger »

Ok, dann habe ich zumindest nichts falsch gemacht. Mich würde nur interessieren, warum die IOWs den letzten Clock unterlassen? Das wiederspricht nach meinem Verständnis der NXP I2C Spezifikation, die das Acknowledge als verpflichten vorschreibt.

Natürlich kommen die meisten Slaves mit einer unvollständigen Übertragung klar, da sie sich spätestens beim nächsten Start zurücksetzen.
Post Reply