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);
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?