Wie kann ich I²C Master knallen?


8

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.


1
Warum nicht Support hinzufügen? Der Chip unterstützt es und es gibt Treiber. Scheint albern, es zu knallen!
Alex Chamberlain


Ich möchte mit Python ein bisschen hämmern. Ist dir das gelungen? Die Verwendung von RPi.GPIO und das Umschalten des Pins zwischen GPIO.OUT / False (Down-Status) und GPIO.IN (Out-Status) macht den Trick?
Pygmalion

Antworten:


4

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 inund 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.]


2
Ich denke, Sie können nur zwei IO-Pins mit den Klimmzügen verwenden. Anstatt die Pins hoch und niedrig zu setzen, simulieren Sie den offenen Abfluss, indem Sie einen Pin zwischen out (low) und in (high via Pullup) umschalten.
John La Rooy

2
Dies ist eine schlechte Antwort, aber ich bin neu und habe nicht genug Repräsentanten, um abzustimmen. Sie können es mit 2 I / Os tun, wie Gnibbler sagt. I2C ist ein Multidrop-Bus, und wenn er mit einem Push-Pull-Ausgang hoch angesteuert wird, während ein anderes Gerät ihn niedrig ansteuert, führt dies zu einem Kurzschluss.
Stevenvh

1
@gnibbler Sie sind absolut korrekt, wie die Linien zu fahren sind. Ich werde meine Antwort bearbeiten, sobald ich eine Minute Zeit habe. Die "In" -Pins werden jedoch benötigt, wenn Sie ACK oder Clock-Stretch erkennen möchten. Beide werden für eine ernsthaftere Kommunikation benötigt.
Mikijov

1
@stevenvh Ich habe nie Push-Pull vorgeschlagen, und ich werde meine Antwort so bearbeiten, dass sie expliziter ist. Die zusätzlichen Pins werden jedoch benötigt, um ACK und Clock-Stretch zu erkennen.
Mikijov

1
@MikiJ, ich glaube nicht, dass du zusätzliche Pins brauchst, du kannst dir nur den Wert auf dem Pin ansehen, wenn er zu einem Eingang wechselt. Das machen sie im Code auf Wikipedia. Suchen Sie nach demwhile (read_SCL() == 0) { // Clock stretching
John La Rooy
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.