ich habe einen IOWarrior40 dessen I2C-Sonderfunktion ich nutze. Ich will damit mit einer smarten Batterie kommmunizieren, die mittles SMBus kommuniziert. Der verwendete Chip des Batteriemanagementsystems ist von TI (http://www.ti.com/product/BQ20Z65-R1/technicaldocuments).
Mit dem fertigen Beispiel Simple-I2C.exe funktioniert sowohl das Schreiben als auch das Lesen von der Batterie. In meinem eigenen Programm, das in C# geschrieben ist und auf die IOWKit.dll zurückgreift funktioniert aber nur das Schreiben (Senden von Befehlen an die Batterie mittels IOWKitWrite und Report-ID 02), das Lesen funktioniert nicht. Ich lese immer das gleiche aus, egal welchen Befehl zum Auslesen (z.B Spannung, Ladezustand, Seriennummer,....) ich vorher geschickt habe. Das was ich auslese, ist übrigens immer genau das, was ich als letztes mittels Simple-I2C.exe ausgelesen habe. Das Initialisieren des Lesens funktioniert also in meinem Code nicht.
Das Auslesen von Daten mache ich entsprechend Dokumentation und Beispielen zunächst mit dem Senden eines Reports über IOWKitWrite und Report-ID 03 und anschließendem Lesen mittels IOWKitRead. Hier ein Auszug aus dem Quellcode, zum Auslesen der Batteriespannung (Bytearray namens data_array wird für die Reports verwendet; Byte 09 ist Command für die Spannung, dies liefert laut Datenblatt des Batteriechips 2 Byte zurück; I2C-Adresse ist 16 und wird hier zum Lesen auf 17 gesetzt; am Ende wird der ausgelesene Report als String in einer RichTextBox angegeben):
Code: Select all
private void btnVoltage_Click(object sender, EventArgs e)
{
byte[] data_array = { 0x03, 0x02, 0x17, 0x09, 0x00, 0x00, 0x00, 0x00 };
IOWarrior.Functions.IowKitWrite(handle, IOWarrior.Defines.IOW_PIPE_SPECIAL_MODE, data_array,
IOWarrior.Defines.IOWKIT_SPECIAL_REPORT_SIZE);
IOWarrior.Functions.IowKitRead(handle, IOWarrior.Defines.IOW_PIPE_SPECIAL_MODE, data_array,
IOWarrior.Defines.IOWKIT_SPECIAL_REPORT_SIZE);
rtbDisplayReports.Text += "Read_I2C; Gelesener Report: " + BitConverter.ToString(data_array) + "\n";
}
Wie gesagt aber immer das gleiche, was ich zuvor als letztes in Simple-I2C ausgelesen habe, unabhängig vom Command.
Ich weiß nicht mehr was ich noch ausprobieren soll. Habe viel rumgespielt, u.a. mit der Reihenfolge/Position der Bytes im initialen Report, mit einer Wartezeit zwischen Initialisieren und Auslesen, mit IOWKitReadNonBlocking aus der dll, mit zwei verschiedenen Arrays zum Schreiben und Lesen, mit anderen Report-IDs,....
Die Doku habe ich auch soweit durch und kann keinen Fehler finden. Die Simple-I2C.exe macht etwas auf Anhieb richtig, was ich falsch mache. Ich vermute mal dass es also auch nichts batteriespezifisches ist, wie z.B. geringe Unterschiede zwischen SMBus und I2C oder die Verwendung der PEC (Packet Error Checking) des SMBus.
Ich hoffe Ihr habt einen Tip für mich ?
Vielen Dank und viele Grüße,
Adrian