Hallo zusammen,
ich habe einen Atmega via I2C an einen Raspi gehängt. Auf dem I2C habe ich ein Protokoll aufgesetzt, welches die Daten via Checksumme prüft.
Die Kommunikation erfolgt
1. Master -> Slave
(adressierung)
1 Byte Command
1 Byte Modus
4 Byte Daten
1 Byte Checksumme
Dies wird ins Register 0 geschrieben.
Der Slave stellt daraufhin die Antwort im Register 0 bereit, welche dann durch ein Read gelesen wird.
1 Byte Status (Ok, Nicht OK, Checksumme falsche etc,)
8 Bytes Daten
1 Byte Checksumme
via i2cdump im Modus "c" funktioniert das lesen, Python liefert mir hier andere Daten
i2cbus = SMBus(1)
device = 0x29
i2cbus.write_i2c_block_data(device, 0x00, [0x04, 0x02, 0x01, 0x00, 0x00, 0x00, 0x05])
time.sleep(2.0)
data = i2cbus.read_i2c_block_data(device, 0x00, 10)
print(data)
Die Checksumme ist hier falsch (was für den Test beabsichtigt ist).
Das Python-Script liefert mir als Ausgabe
i2cdump liefert mir die richtigen Werte:
root@raspberrypi:~# i2cdump -y 1 0x29 c
0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
00: a0 8f XX 00 00 00 XX 00 00 XX 00 00 a0 0a 00 00 ?.X...X..X..??..
....
Das "a0 8f" ist die Fehlermeldung "Checksumme falsch, 8f erwartet"
Ohne den Modus "c" liefert auch i2cdump die ff
root@raspberrypi:~# i2cdump -y 1 0x29
No size specified (using byte-data access)
0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
00: ff ff XX ff XX ff XX ff XX ff XX ff ff XX ff XX ..X.X.X.X.X..X.X
...
Ich schließe daraus, dass Python standardmäßig nicht den "c"-Modus verwendet.
Dieser Modus schreibt wohl im Gegensatz zum Standardmodus zunächst noch die Device-Adresse auf den Bus.
Was muss ich machen, um dies auch in Python zu nutzen?
Grüße und Danke
Micha