RP 2040 (Pico und Zero) als I2C Bus Slave

  • Hallo

    versuche mit dem I2C Bus von einem Master auf einen Slave zuzugreiffen. Ist ja eigentlich (sollte) kein Problem mit AVR und C. Wie ist das aber bei Python? Wenn ich die beschreibung im Netz richtig verstanden habe, ist die Lib zum I2C nur als Master nutzbar. Habe aber auch das gefunden:

    Habe den Zero als Slave genommen und dabei die Adresse 42 und SCL-1 und SDA-0. Geht aus der Pinbelegung des Zero hervor. Die Software ahbe ich als main.py auf dem Zero gespeichert und müsste damit beim einschalten automatisch anlaufen. Wenn ich vom Zero einen Bus Scanner laufen lasse werden mir alle angeschlossenen Slave korrekt angezeigt. Umgekehrt, wenn ich vom Pico einen Scanner laufen lasse wird zwar alle angeschlossenen Slave angezeigt aber der Zero nicht.

    Hsat jemand eine Idee waran das liegen könnte?

  • Hast du einen Pullup-widerstand von plus auf dem i2c-bus? Ich hatt auch mal Probleme und musste den i2c mit dem Pullup-Wiederstand belegen damit der Pico, bei mir als master füntionierte. Wenn du Breadboard und/oder Jumperwire arbeitest ist das auch eine mögliche Fehlerquelle (Ich hab schon Stunden mit Fehlersuche verbracht und nur durch Zufall den Wackelkontackt entdeckt)

    Jeder macht was er will, keiner macht was er soll, aber alle machen mit :)

  • Ich hab einen Radioempfänger mit i2c-bus und auch oled display mit i2c- und musste Pegelwandler vor den Pico schalten 3,3-5v

    Edit: Sorry das waren ADC die mit 5v auf dem I2C laufen,die Busspezifikation ist 5V und mit Pullup-Wiederstand

    Jeder macht was er will, keiner macht was er soll, aber alle machen mit :)

    Edited once, last by momefilo (January 19, 2025 at 10:24 PM).

  • Ich hab noch nicht versucht zwei Pico über i2c zu verbinden. Aber die Spezifikation sieht min. 3,5V vor. Ist natürlich komisch nur ein zwischenstück auf 5V zu betreiben wenn die Teilnehmer alle 3,3V sprechen. Zur Verbindung zweier Pico gibt es ein Beispiel mit dem spi-bus

    pico-examples/spi/spi_master_slave at master · raspberrypi/pico-examples
    Contribute to raspberrypi/pico-examples development by creating an account on GitHub.
    github.com

    Edit: Vielleicht wird der Zero vom Pico nicht erkannt weil der Zero Master am Bus ist?

    Jeder macht was er will, keiner macht was er soll, aber alle machen mit :)

  • Moin!

    der TO schreibt von einen Pico und einem RPi Zero. Beide Teile haben 3,3V auf den Pin's. Wo, bitte schön, sind da 5V?

    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.

  • Moin!

    der TO schreibt von einen Pico und einem RPi Zero. Beide Teile haben 3,3V auf den Pin's. Wo, bitte schön, sind da 5V?

    73 de Bernd

    Die Spezifikation des I2C-Bus verlangt min 3,5V auf den Leitungen um die Pegel auch gewiss unterscheiden zu können.
    Haben i2c-Master eine Adresse auf dem Bus? Ich kann mich nicht daran eriinern eine vergeben zu haben. Dann wäre das der Grund warum der Zero nicht vom Pico erkannt wird weil er keine Adresse hat

    Jeder macht was er will, keiner macht was er soll, aber alle machen mit :)

  • Moin!

    Mein lieber momefilo schreibst du nun um Recht zu haben? Oder was soll das?

    Du führst doch den TO auf eine ganz falsche Spur, wenn du von Pegelwandler schreibst.

    Aber meinetwegen hast du Recht! Gut so?

    Ohne 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.

  • Moin!

    Mein lieber momefilo schreibst du nun um Recht zu haben? Oder was soll das?

    Du führst doch den TO auf eine ganz falsche Spur, wenn du von Pegelwandler schreibst.

    Aber meinetwegen hast du Recht! Gut so?

    Ohne 73 de Bernd

    NEIN! Ich will alles nur kein Recht!
    Wenn ich den bus ausserhalb der Spezifikation fahre ist das eine Fehlerquelle. Und der Zero muss doch eine Adresse haben um am bus erkannt zu werden, die er als Master nicht hat soweit ich mich erinnere.
    Ich will kein Recht haben sondern mit dem was ich an Erfahrung hier beistehen, und auch Lösungen erfahren

    Jeder macht was er will, keiner macht was er soll, aber alle machen mit :)

  • Moin!

    mir tut der Fragende nur leid, weil soviel überflüssiges geschrieben wurde. Sri dafür!!

    momefilo,
    die Funktionsweise eines i2c-Bus ist dir bekannt? Eine Leitung gibt den Takt und eine zweite die Informationen. Was hat das mit der Spezifikation zu tun? Wenn die Gegenstelle den Takt erkennt, wird sie auch die Informationen lesen können.

    Und der Zero muss doch eine Adresse haben um am bus erkannt zu werden, die er als Master nicht hat soweit ich mich erinnere.

    Das ist das Problem des Fragenden. Darauf sollten sich deine Gedanken richten.
    Also gibt es eine Möglichkeit sowohl Chef als auch Empfänger zu sein?

    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.

  • Bitte alle ruhig bleiben.

    Ein kleiner Ausflug in meine Hardware. Verwende einen I2C Bus mit 5V. Alle ICsund Module die ich anschliesse haben auch 5V und wenn z.B. 3,3V oder 2,5V verwende ich Pegelwandler mit dem 2N7002. Habe mal ein kleines Bild von der Hardware mit dem Pico reingestellt.

    In der Mitte ist der Pico und an den Seiten 6x Wannenstecker 2x5. Die beiden oberen Wannenstecker dienen zur Stromversorgung und Anschluss I2C Bus mit 5V. An den 4 anderen Wannenstecker sind die GPIOs des Picos mit 3,3V rausgeführt. Da sind Wackelkontakte kaum möglich. Unterhalb der Platine befinden sich die beiden 2N7002 als SMD. Es können die verschiedensten Sensoren, Aktoren oder Displays, entweder über den Bus oder SPI direkt, angeschlossen werden. Auf dieser Platine sind 2x 10kOhm am Bus angeschlossen. Auf den einzelnen Module kann ich bei Bedarf noch je 2x4,7kOhm zuschalten. Da ich 2 Wannenstecker nur für den Bus habe kann ich noch weitere Module anstecken, egal ob links oder rechts. Teilweise hatte ich bereits 8 Module dran. Alle Module habe die gleiche Höhe und unterschiedliche Breiten. Alle Steckverbinder habe die gleiche Belegung und Abstand, 2x Bus und 4x GPIOs. Dadurch kann ich alle möglichen Teile kombinieren und erweitern. Habe bisher als Prozessor den Pico, Zero, Atmega 1284, attini 841 und 261. Solange ich mich an die Spannung an Grösse halte kann ich alles erweitern.

    Also keine Angst, korrekte und funktionierende Pegelwandler mit Widerständen sind drauf. An die Spammumg halte ich mich auch.

    Noch mal zu den Scanner. Wenn ich auf dem Pico einen Scanner laufen lasse werden 2 zusätzliche Module korrekt gefunden. Der laufende Zero mit der Slave Software wird nicht gefunden. Lasse ich einen Scanner auf dem Zero laufen werden wieder die zusätzlichen Module gefunden. Der Master kann nicht gefunden werden das er keine Adresse hat.

    Hoffe das ich ein bischen zur Verwirrung geholfen habe.

  • achim 9876  
    Wenn die Hardware korrekt ist bleibt nur noch Ein Softwarefehler auf dem Pico oder auf dem Zero. Da der pico die anderen Teilnehmer auf dem Bus findet ist es meiner Meinung die Implementierung des Slave auf dem zero die nicht standartmäßig funktioniert. Ich bin grade selbst wieder dabei PIO-Statemaschinen zu Programmieren weil ich alle Detaills mit neuen Projekten Vergesse und immer von vorne beginnen muss (die i2c-slave funktion des pico wird mein Ziel sein wenn die bisherige Implemtierung nicht funzt), aber pythoncode ist für dich lesbar und du solltest den Slave-Programmcode auf dem Pico überprüfen ob er dem Busstandart in seiner Ausführung entspricht.

    Jeder macht was er will, keiner macht was er soll, aber alle machen mit :)

    Edited once, last by momefilo (January 20, 2025 at 11:55 AM).

  • achim 9876 Ich werde heute Nachmttag mit einer Implementierung des i2c-slave auf dem Pico in c beginnen. Bis Ende der Woche wird es Funktionieren, dann kann man schauen wie man das in python nutzbar macht.
    Ich werde eine Adressvergabe bei initialisierung, eine Befehls-Empfangsfunktion mit Daten in Dauerschleife und eine Antwortfunktion implementieren. Vielleicht kannst du genaueres zu deiner benötigten slavefunktion schreiben.

    Ich meine zur Befehls-Empfangsfunktion, das man als Nutzer ein Array aus hex-Werten erstellt, und diese mittels der Stelle innerhalb des Arrays auf Antwortfunktionen eines anderen zu erstellenden Arrays mit der gleichen Stelle abbildet. So kann der Nutzer programmatisch das Antwortarray in Bezug zum empfangenen Befehl füllen, Also im Groben, vielleicht ist ja gar kein Antwortarray nötig. Das werd ich im Laufe der Woche der woche noch ergründen

    Jeder macht was er will, keiner macht was er soll, aber alle machen mit :)

    Edited 3 times, last by momefilo (January 20, 2025 at 1:27 PM).

  • Zum Glück hab ich hier die "Schnauze nicht zu voll genommen" und noch entsprechende Hardware hier. Genauer, Zwei Pi Pico verschiedener Hersteller, zwei Pegelwandler verschiedener Hersteller, zwe OLED-Displays gleichen Herstellers als slave sowie Jumperwire, Draht und Reste von Lötzinn. Wenn das Hardwaresetup heute Abend steht ist es wohl besser ein neues Thema zu eröffnen das ich hier posten werde

    Jeder macht was er will, keiner macht was er soll, aber alle machen mit :)

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!