Ich habe RPi.GPIO installiert . Es unterstützt I²C noch nicht, aber kann ich es verwenden, um I²C zu schlagen?
Ich würde nur den Raspberry Pi brauchen, um der Meister zu sein.
Ich habe RPi.GPIO installiert . Es unterstützt I²C noch nicht, aber kann ich es verwenden, um I²C zu schlagen?
Ich würde nur den Raspberry Pi brauchen, um der Meister zu sein.
Antworten:
Wie einer der Kommentatoren betonte, wird die Verwendung einer nativen / Hardware-I²C-Implementierung sehr bevorzugt, da die erzeugten I²C-Signale viel besser wären (sprich: kompatibel). Die CPU-Auslastung wäre vernachlässigbar, da Sie nicht warten müssen, um Verzögerungen zu erzeugen, und häufig schneller (400 kHz ist eine Standardgeschwindigkeit).
Bit-Banging ist jedoch manchmal nützlich, wenn Sie ein bestimmtes Signalmuster erzeugen müssen oder wenn einfach Hardware-I²C nicht vorhanden ist oder aus irgendeinem Grund nicht geeignet ist. Ein schönes Beispiel für Bitbanging-Code finden Sie im Wikipedia-Artikel I²C .
Ein einfacheres und bevorzugtes Design, wenn die Leistung nicht am kritischsten ist, besteht darin, dem Algorithmus aus dem Wikipedia-Artikel (und den Kommentaren unten) zu folgen. Sie müssen zwei Leitungen auswählen, eine für SCL und eine für SDA, und geeignete Pull-up-Widerstände bereitstellen. Denken Sie daran, dass der Status der Leerlaufleitung "hoch" ist. Sie würden die Zeilen als "out" konfigurieren und sie nach Bedarf umschalten. Um die Leitungen auf ACK oder Clock Stretch abzufragen, sollten Sie sie hoch einstellen, in den Eingangsmodus wechseln und dann den Leitungsstatus überprüfen. Die Schritte zum Erstellen von Start-, Stopp- und Datenzuständen finden Sie oben im Wikipedia-Link.
Wenn Sie die letzt bisschen Leistung aus Ihrem Design bekommen, dann können Sie vier Stifte verwenden, SDA in
, SDA out
, SCL in
und SCL out
. Die "In" sind permanent auf Eingabe und die "Out" permanent auf Ausgabe eingestellt. Dies erspart Ihnen die Anrufe zum Wechseln des Pin-Modus.
[Bearbeitet, um zunächst ein einfacheres Design zu bieten, wie in den Kommentaren unten ausgeführt.]
while (read_SCL() == 0) { // Clock stretching