I2C SMB read_i2c_block_data liefert andere Daten als i2cdump c - Python-Äquivalent zu i2cdump Modus "c"

  • 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

    Code
    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

    Code
    [255, 255, 255, 255, 255, 255, 255, 255, 255, 255]

    i2cdump liefert mir die richtigen Werte:

    Code
    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

    Code
    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

  • I2C SMB read_i2c_block_data liefert andere Daten als i2cdump c - Python-Äquivalent zu i2cdump Modus "c"? Schau mal ob du hier fündig wirst!

  • Moin micha1234,

    dein AtMega schreibt das Register 0 auch bei einer Anfrage auch seriell raus?

    Der Mode-Parameter 'c' von i2cdump hat eine besondere Funktion.

    Nachfolgend mal einen Auszug aus man i2cdump ins Deutsche, durch deepl.com, übersetzt.

    Zitat

    Der Modus c ist ein wenig anders, er liest alle Bytes nacheinander und ist nützlich für Chips, die über eine automatische

    address Auto-Increment-Funktion haben, wie z.B. EEPROMs.

    Eventuell muss was an dem Code für den ATMega getan werden.

    73 de Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

    2 Mal editiert, zuletzt von Bernd666 (9. Oktober 2022 um 01:11) aus folgendem Grund: Modeparameter eingefügt. Hatte ich vergessen

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!