Forum: Mikrocontroller und Digitale Elektronik ESP32 als ganz normaler I2C slave


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Jan (Gast)


Lesenswert?

Moin,

gibt es vielleicht doch Beispiele für eine gelungene und "normale" I2C 
Slave Implementierung auf dem ESP32, idealerweise für die Arduino IDE, 
gerne aber auch direkt per IDF?

Mit "normal" meine ich, dass der Slave vom Master direkt und ohne 
speziellen Wrapper angesprochen werden kann, wie es dieser Workaround 
erfordert: https://github.com/gutierrezps/ESP32_I2C_Slave

Ziel ist ein I2C Slave, der von beliebigen Mastern aus z.B. klassisch 
per Register angesprochen werden kann.

Hintergrund:

Espressif hat bis heute den Slave Modus beim ESP32 nur unvollständig 
implementiert und dokumentiert 
(https://github.com/espressif/esp-idf/issues/2202), v.a. in Bezug auf 
Interrupts (https://github.com/espressif/esp-idf/issues/3099). Die Wire 
library von Espressiv kennt kein onRequest() 
(https://github.com/espressif/arduino-esp32/issues/118). Es gibt zwar 
schon Leute, die an Lösungen arbeiten, bei denen geht aber seit Jahren 
nichts voran (z.B. https://github.com/espressif/esp-idf/pull/2096).

Alles, was die Espressiv API für Slaves anbietet 
(https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/i2c.html#communication-as-slave) 
sind die Funktionen i2c_slave_read_buffer() und 
i2c_slave_write_buffer(). Bei denen besteht aber wohl das Risiko, 
unvollständige Pakete zu erhalten oder zu senden (vgl. 
https://github.com/gutierrezps/ESP32_I2C_Slave "This usage of the API 
functions raise some problems.")

Die angesprochene Library löst das mit einem Datenwrapper, der die 
Integrität der Pakete sicherstellen soll, aber auf Seiten des Masters 
voraussetzt, dass die Pakete eben entsprechend verpackt werden. Das geht 
vielleicht noch in geschlossenen Projekten, für einen Slave, der wie 
jedes andere I2C-Gerät von beliebigen Mastern ansprechbar sein soll, 
kommt das aber nicht in Frage.

Andere Lösungsansätze?

Ein Kommentar bei einem der o.g. issues 
(https://github.com/espressif/esp-idf/issues/3099#issuecomment-467725985) 
deutet eine Lösung mit einem "high priority task blocked on 
i2c_slave_read_buffer" an, dazu konnte ich aber nichts weiter finden. 
Ich stelle mir das so vor, dass ein solcher Task ähnlich wie ein 
Interrupt wirkt und implementiert werden kann, denn er schläft bis Daten 
vom Master angekommen sind und  blockiert dann aufgrund seiner Priorität 
den Haupttask.

Bisher habe ich aber noch keine Erfahrung mit Multitasking und 
inter-task Kommunikation auf dem ESP32. Ich arbeite mich da gerne rein, 
möchte Sackgassen aber vermeiden, denn diese Kommentare z.B. klingen 
leider wenig optimistisch: 
https://github.com/espressif/arduino-esp32/issues/118#issuecomment-812974529 
, 
https://github.com/espressif/arduino-esp32/issues/118#issuecomment-823695741

Ich freue mich daher über eine Einschätzung aus berufenerem Munde, ob 
das so klappen könnte. Mir wäre bei der Lösung auch nicht klar, wie ein 
request von einem normalen receive unterschieden wird und wie es mit dem 
clock stretching aussieht. Außerdem wäre mir nicht klar, wie dieses 
Blocking genau aussehen würde, denn geblockt werden darf ja nur der high 
priority task, nicht der Haupttask mit niedrigerer Priorität.

Gruß
Jan

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.