[STM32L0] "Python-kompatibler" I2C Slave

OP Persönliche Seite #7424172
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

#7424213
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.

OP Persönliche Seite #7424224
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 💪

#7424319
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.

OP Persönliche Seite #7424343
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 🤔

#7424390
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren