Moin,
ich stehe vor einen riesigen Problem.
Für eine Anwendung suche ich die Möglichkeit den I2C mit dem SPI Bus zu synchronisieren.
Dazu hatte ich ein Codebeispiel aus den Anfangsjahren des PI von Erik Bartmann gefunden, wie man mit RPi.GPIO SPI Komponenten Ansprechen kann. Es ist zwar sehr viel Programmierarbeit, aber es funktioniert.
Nun bin ich auf der Suche nach einem Beispiel-Code für den Portexpander PCF8574 von NXP, der ebenfalls mit oder über RPi.GPIO läuft.
Jetzt habe ich schon fast überall herumgesucht, und habe einen Eintrag im englischen Raspberry Pi Forum gefunden. Dort ist beschrieben wie man mit einem Eintrag in der /boot/config.txt weitere GPIO-Pins zu einem I2C-Bus-Master machen kann. Das habe ich an meinen Anwendungsfall (GPIO Belegung) so angepaßt und wollte nun mit einem über GITHUB verfügbaren Steuercode, welcher jedoch smbus verwendet das Ganze ausprobieren.
In der config.txt habe ich folgende Zeilen ergänzt.
Frage ich nun den über die GPIOs 17 und 27 angeschlossen PCF8574 mit i2cdetect -y 2 ab, erhalte ich die Meldung:
Egal welche Zahl mit Ausnahme der 0 ich bei bus = eintrage, ich kann bei i2cdetect die letzte Stelle ändern wohin ich will, mit 1 werden immer die 3 angeschlossen Busadressen angezeigt. Nur jede andere Zahl 2 bis x führt immer wieder zu einer ähnlichen Meldung.
Damit funktioniert auch der Pythoncode nicht.
Hier erhalte ich die Fehlermeldung:
Traceback (most recent call last):
File "<pyshell>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory
Für meinen Anwendungsfall muß ich sicherstellen, daß der/die PCF8574 einen Eingang entsprechend geschaltet hat, bevor über den SPI-MOSI der nächste Befehl zur SPI Komponente gesendet wird.
Ergänzen möchte ich noch, das ich am I2C Bus mit den PIns 3 (GPIO2) und 5 (GPIO3) schon ein RTC hängen habe, sowie ein TM1637 4x7Segmentanzeige und ein I2C-PCF8574-LCD Adapter für ein 20x4 LCD Display. Diese beiden Anzeigeeinheiten spreche ich über einen Thread in Python an und werden sekündlich aktualisiert. Soweit alles kein Problem.
Bringe ich nun weitere PCF8574, jeweils mit einer anderen Bus-Adresse hinzu, und will die Ausführung zusammen mit der SPI Komponente betreiben, kommt es immer wieder zu einer Datenkollision, bzw. der Schaltvorgang wird nicht ausgeführt, was zur Folge hat, daß die SPI Komponente einen Schaden nimmt. Auf den Gedanken den I2C Portexpander durch einen SPI Portexpander zu ersetzen bin ich auch schon gekommen. Das geht leider auch nicht, denn dann müßte ich einen weiteren freien GPIO für die CE/CS Signalleitung zur Verfügung haben, denn ich benötigte in der Summe 3 dieser PCF8574.
Somit bin ich nun auf der Suche nach einer Möglichkeit auf dem PI Zero den/die PCF8574 über zweit getrennte SDA / SCL Pins und RPi.GPIO anzusprechen.
Mir geht es dabei nicht um die maximale Ausführungs- und Busgeschwindigkeit, sondern nur um die sichere Einhaltung der Befehlsfolgen:
- Schalten eines Port-Pins am PCF8574
- Abfrage zur Sicherheit im Portregister, ob dieser geschaltet hat
- Befehlsübermittlung an die SPI Komponente.
Danke
Franky