Forum: Mikrocontroller und Digitale Elektronik [STM32L0] "Python-kompatibler" I2C Slave


von Mampf F. (mampf) Benutzerseite


Lesenswert?

Guten Nachmittag,

ich quäle mit mit STM32L011 und HAL und dem I2C Slave.

Im Grunde hätte ich einfach nur gerne eine Implementierung (stures
polling wäre supi, weil der Rest in Interrupts läuft), die kompatibel
zu:

i2c.write_i2c_block_data
i2c.read_i2c_block_data

auf einem Raspberry Pi ist.

Hab fast einen Tag gegoogelt und nichts brauchbares gefunden.
Mittlerweile bereue ich es schon, I2C benutzt zu haben - wieso hab ich
nicht SPI verwendet 🙈

Die Beispiele im SDK sind leider auch nicht wirklich zu was zu
gebrauchen.

Prinzipiell funktionert der I2C-Slave, weil ich kann einzelne Bytes hin
und herschubsen. Und write_i2c_block_data hab ich auch schonmal
hinbekommen (provisorisch ... einfach mit HAL_I2C_Slave_Receive).
read_i2c_block_data scheint aber hoffnungslos zu sein. edit: Ich hab das 
Gefühl, dass HAL nicht über Bytes schubsen hinaus geht und noch ein 
ganzes Protokoll, das auf I2C aufsetzt, implementiert werden muss 🤔

Vielleicht hat jemand eine Idee und/oder hat mal etwas gesehen, was
funktioniert?

Viele Grüße,
Mampf

: Bearbeitet durch User
von Harry L. (mysth)


Angehängte Dateien:

Lesenswert?

Ich hab vor einiger Zeit mal ein 24C08 (I2C-EEPROM) emuliert; allerdings 
mit den HAL-LL-Funktionen.
Vielleicht hilft dir das weiter.

: Bearbeitet durch User
von Mampf F. (mampf) Benutzerseite


Lesenswert?

Harry L. schrieb:
> Ich hab vor einiger Zeit mal ein 24C08 (I2C-EEPROM) emuliert;
> allerdings
> mit den HAL-LL-Funktionen.
> Vielleicht hilft dir das weiter.

Vielen Dank, das kuck ich mir gleich mal an 😍

von Clemens L. (c_l)


Lesenswert?

Mampf F. schrieb:
> Ich hab das Gefühl, dass HAL nicht über Bytes schubsen hinaus geht

Der HAL bildet auch nur die Features der Hardware ab.
Als I²C-Slave hast du keine Kontrolle darüber, was der Master mit dir 
anstellt. Grundsätzlich ist es so, dass du auf "Master hat ein Byte 
geschrieben" oder "Master will ein Byte lesen" einzeln reagieren musst.
Das läuft dann oft auf eine Zustandsmaschine hinaus.

Der STM32L0 unterstützt anscheinend DMA für I²C, aber ich weiß nicht, 
was passiert, wenn der Master nicht genau so viele Bytes liest oder 
schreibt, wie du fürs DMA konfiguriert hast.

: Bearbeitet durch User
von Mampf F. (mampf) Benutzerseite


Lesenswert?

@Harry L., Funktioniert astrein, Thx a lot 🥳🥳🥳

: Bearbeitet durch User
von Mampf F. (mampf) Benutzerseite


Lesenswert?

Clemens L. schrieb:
> dass du auf "Master hat ein Byte
> geschrieben" oder "Master will ein Byte lesen" einzeln reagieren musst.
> Das läuft dann oft auf eine Zustandsmaschine hinaus.

Oha! Das erklärt es - da nahm ich naiv an, das würde es alles schon als 
Examples geben, weil das für mich quasi ähm grundlegende 
I2C-Funktionalität ist (schließlich machen das alle(?) Devices so) 🙈

Aber mit Harry L.'s Code funktioniert es 💪

: Bearbeitet durch User
von Harry L. (mysth)


Lesenswert?

Mampf F. schrieb:
> @Harry L., Funktioniert astrein, Thx a lot 🥳🥳🥳

Freut mich sehr!

von Sebastian W. (wangnick)


Lesenswert?

Mampf F. schrieb:
> auf einem Raspberry Pi ist.

Kann der Raspberry Pi inzwischen mit Clock Stretching Slaves umgehen?

LG, Sebastian

von Wastl (hartundweichware)


Lesenswert?

Harry L. schrieb:
> I2C-slave.zip

Gut gemacht! Ich liebe diese LL-Funktionalität der Libraries.
Spart ein paar Takte gegenüber HAL und man weiss was man tut
und was man bekommt. Bei HAL muss ich mich immer vergewissern
was sie mir alles "Gutes" tun will was ich nicht brauche oder
beabsichtige.

von Harry L. (mysth)


Lesenswert?

Wastl schrieb:
> Harry L. schrieb:
>> I2C-slave.zip
>
> Gut gemacht! Ich liebe diese LL-Funktionalität der Libraries.
> Spart ein paar Takte gegenüber HAL und man weiss was man tut
> und was man bekommt. Bei HAL muss ich mich immer vergewissern
> was sie mir alles "Gutes" tun will was ich nicht brauche oder
> beabsichtige.

Da ich faul bin verwende ich LL nur, wenn es um Funktionalität geht, die 
ich mit HAL nicht abbilden kann, oder der Platz wirklich knapp wird. 
(selten)

Die paar Takte, die man so theoretisch sparen kann, interessieren mich 
eher weniger.

In diesem konkreten Fall hab ich das mit HAL einfach nie vernünftig zum 
Laufen bekommen.

von Mampf F. (mampf) Benutzerseite


Lesenswert?

Harry L. schrieb:
> In diesem konkreten Fall hab ich das mit HAL einfach nie vernünftig zum
> Laufen bekommen.

Das hab ich beim googeln auch immer wieder gelesen, dass Leute mit dem 
I2C Kram nur Probleme haben 🙈

Sebastian W. schrieb:
> Kann der Raspberry Pi inzwischen mit Clock Stretching Slaves umgehen?

Pi4 könnte es wohl, funktioniert nur nicht, weil es da einen 
Hardware-Bug gibt 🤔

von Harry L. (mysth)


Lesenswert?

Mampf F. schrieb:
> Das hab ich beim googeln auch immer wieder gelesen, dass Leute mit dem
> I2C Kram nur Probleme haben 🙈

Nur der Slave macht(e) Probleme.

Der Master funktioniert absolut reibungslos, aber dise Erkenntnis ist 
jetzt auch wieder ein paar Jahre alt (siehe Datum in meinen Files) und 
ST hat die HAL seitdem weiter entwickelt.
Mit dem Master hatte ich nie Probleme - egal ob Polling, Interrupt oder 
DMA.

Damals war u.A. ein Bug im HAL dafür verantwortlich, daß der Slave nicht 
auf mehreren Adressen angesprochen werden konnte, wie das z.B. bei dem 
von mir emulierten 2408 erforderlich ist.
Da wurde einfach die Reihenfolge verwechselt in der Register beschrieben 
werden müssen - shit happens.

Den Bugfix -oder besser Workaround- hab ich in meinem Code entsprechend 
gekennzeichnet.

Wie das aktuell aussieht, kann ich aber nicht sagen.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.