Drei Fragen zum I2C Bus

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,

    ich hätte da drei Fragen bzgl. dem I2C Bus. Habe recherchiert, aber die Infos nicht alle gefunden, bzw. nicht ganz verstanden.

    1. wie ist beim I2C Bus eigentlich definiert wer Master und wer Slave ist? Muss das bei den Geräten individuell konfiguriert werden, oder machen die sich das im I2C Netz automatisch aus? Wie verhält sich da der RPi

    2. kann eigentlich spontan ein Slave dem anderen Daten senden? Oder kann das jeweils nur der Master initiieren?

    3. was ist eigentlich kurz und bündig der Unterschied zw. den allgemein gängigen i2c funktionen "sendByte, writeByte, writeWord und writeI2CBlock?

    Vlt. kann der ein oder andere eine der Fragen beantworten,

    lg und danke

    Einmal editiert, zuletzt von haemse (4. November 2018 um 08:16)

  • Ich versuche mal die Antworten zu geben, die meinem Wissenstand entsprechen.

    1. I²C Master ist der, der das Ganze steuert. Sinnvollerweise der, der die Daten verwaltet und/oder den gesamten Ablauf steuert. Bei Erstellung des muss man sich Gedanken machen, wie die Topologie am besten aufgebaut sein sollte und die Teilnehmer entsprechend konfigurieren. Der Pi ist meines Wissens immer Master.

    2. Ein Slave kann nicht spontan anderen Daten senden. (Bei einem Multimaster System geht das, das führt aber zu weit!)

    3. sendByte, writeByte, writeWord und writeI2CBlock: Das sind verschiedene Befehle mit denen Du die jeweils gewünschte Funktionalität umsetzen kannst. WriteI2CBlock dürfte sinnvoll sein, wenn Du mehrere Daten (z.B. zum speichern) übergeben willst. WriteByte gibt Dir die Möglichkeit einen Befehl mitzusenden, der vom Slave je nach Wert verarbeitet wird...

    Wenn Du es im Detail wissen möchtest, würde ich Dir auch empfehlen die obigen Links durchzuarbeiten...

    ...wenn Software nicht so hard-ware ;) ...

    Freue mich über jeden like :thumbup:

  • Danke, ein großes Bild vom I2C hab ich mittlerweile eh, nur bei einigen Punkten hab ich halt Verständnisprobleme. Daher ist es etwas obsolet den Wiki Artikel eines komplexen Themas zu posten, wenn man dazu spezifische Fragen hat, auch wenn ich den Unterton verstehe. ;)

    Bsp. zu 3. (ad fred0815) hab die Beschreibung der jeweiligen Methoden natürlich gelesen. Nur kann ich mir zB. kein Bild machen, was denn der Unterschied zwischen sendByte, writeByte und writeWord sein soll. Send Byte scheint sich durch das fehlen des CMD Parameters abzuheben, während writeByte und writeWord beide die gleichen Parameter haben nur, dass beim einen der datenparameter vom Typ Byte ist und beim aderen vom Typ Word ... wenn ich aber bei den Datentypen unten in deinem Link nachlese, dann ist sowohl Word, als auch Byte beide angegeben als Byte Length Number:

    Was solle denn da bitte noch der Unterschied sein?

    lg

    PS: Very Private - danke für die individuellen Antworten, haben mir sehr geholfen.

  • Meines Wissens nach kann der Pi auch Slave spielen, sonst könnten 2 Pis ja nicht per I2C kommunizieren.

    Mit einem I2C Master-Slave (Hardware-) Konverter im I2C-Bus geht das schon. Aber die I2C Standardmodule (Treiber) lassen keinen Slave-Modus am Pi zu. Könnte sein, dass im WWW ein I2C-Slave-Modul für den Pi zu finden ist, zumindest im Sourcecode.

    Servus !

    RTFM = Read The Factory Manual, oder so

  • Ich kenne die Befehle leider auch nicht im Detail. Es scheint aber als wäre in diesem Fall der Unterschied, dass man bei einem Word 2 Byte übergeben kann und bei einem Byte eben nur einen:

    long write_byte_data(int addr, char cmd, char val)
    Sendet ein Byte zum Device. cmd ist Kommando- oder Registerangabe. long write_word_data(int addr, char cmd, int val)
    Sendet ein 16-it-Wort zum Device. cmd ist Kommando- oder Registerangabe.

    ...wenn Software nicht so hard-ware ;) ...

    Freue mich über jeden like :thumbup:

Jetzt mitmachen!

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