Ich bin hier neu und auch noch nicht so Erfahren mit der IOWarrior Programmierung.
Ich versuche gerade einen CO2 Sensor über I²C und einem IOWarrior 56 auszulesen aber habe noch einige Verständnisprobleme.
Habe durch euer Forum und die Dokumentation zwar schon einiges erfahren doch das Ganze noch immer nicht wirklich durchschaut.
Den Warrior kann ich Problemlos ansprechen und dank des hier im Forum vorgetellten All in One tools konnte ich auch sehen, dass der Sensor an der richtigen Adresse (A0) erkannt wird. Leider stürzt das Programm danach immer ab, was weitere Tests verhindert.
Jedenfalls bin ich mir über den Kommunikationsablauf und die Implementierung im Unklaren.
Ich möchte ein Start und ein Control byte senden und schreibe diese in die report.bytes des Warriors? Wo finde ich welches byte welche funktion anspricht? Ich finde nur die Warriorports im Datenblatt.
Auf der Suche nach der richtigen Adressierung habe ich gesehen, dass manchmal die ReportID und manchmal das erste Byte zur Schreib/Lese Definition verwendet wird.
Wo ist der Unterschied?
Auch geht aus dem Datenblatt hervor, dass mein Control byte E1/F1 sein sollte um an die gewünschten Daten zu kommen.
Die zusammengeschnipselte Code sieht derweil in etwa so aus:
Code: Select all
memset(&report, 0x00, IOWKIT_SPECIAL_REPORT_SIZE);
report.ReportID = 0x02; // I2C-write-Mode
report.Bytes[0] = 0xC2; // number of bytes to be read with start and stop bit
report.Bytes[1] = 0xE1; // Control byte welches um den Co2 wert low anfragt
report.Bytes[2] = 0xA0; // Pin adresse an der SCL und SDA liegen
for (j=2;j<8;j++)
report.Bytes[j] = 0x00;
IowKitWrite(ioHandle, IOW_PIPE_SPECIAL_MODE, (char*) &report, IOWKIT_SPECIAL_REPORT_SIZE);
memset(&report, 0x00, IOWKIT_SPECIAL_REPORT_SIZE);
report.ReportID = 0x03; // I2C-Read-Mode
report.Bytes[0] = 0xC2; // number of bytes to be read with start and stop bit
report.Bytes[1] = 0xA1; // leseadresse
IowKitWrite(ioHandle, IOW_PIPE_SPECIAL_MODE, (char*) &report, IOWKIT_SPECIAL_REPORT_SIZE);
IowKitRead(ioHandle, IOW_PIPE_SPECIAL_MODE, (char*) &report, IOWKIT_SPECIAL_REPORT_SIZE);
for (j=0;j<3;j++)
co2[j] = (unsigned int) report.Bytes[j];
if (report.Bytes[1] & 0x80)
printf("Error\n");
else
printf("Erfolgreich\n");
Ist der ausgelesene Wert dann in byte[2] und die checksumme in byte[3]?
Vielen Dank für jegliche Hilfe und entschuldigt die vermutlich sehr diletantischen Fragen,
Asimo