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
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
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 😍
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
@Harry L., Funktioniert astrein, Thx a lot 🥳🥳🥳
:
Bearbeitet durch User
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
Mampf F. schrieb: > auf einem Raspberry Pi ist. Kann der Raspberry Pi inzwischen mit Clock Stretching Slaves umgehen? LG, Sebastian
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.
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.
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 🤔
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.