Moin, ich möchte ein paar ICs, welche über SMBus kommunizieren, in einem STM32 nachbilden, sprich der uC soll sich genau so wie das IC als Slave auf dem Bus verhalten. Als Erstes möchte ich "read word" nachbilden. Der Master schickt die Slave Adresse (W) -> das Command -> Slave Adresse (R), dann schickt der STM32(Slave) nach einem Repeated Start zwei Bytes an den Master. Das ganze soll interrupt-gesteuert ablaufen, da der uC noch einige weitere Aufgaben hat. Ich verwende die Hal Library und CubeMX. Leider habe ich in der State Machine bis jetzt keine richtige Stelle gefunden, an der ich die Kommunikation im Slave unterbreche, um zu prüfen, ob ein gültiges Command empfangen wurde. Wenn ja -> Daten senden, wenn nein -> NACK Habt ihr einen Tipp, an welche Stelle ich am besten eingreifen sollte? Es gibt einige Beispiele, wie zB EEPROM auslesen, allerdings nie aus der Sicht des ICs Viele Grüße
Hallo Matthias, ich habe seit Kurzem das selbe Problem. Wäre echt cool, wenn es hier Jemanden gibt der sich mit dem Thema auskennt. Viele Grüße
Moin, wenn ich mich noch richtig erinnere, dann ist es das einfachste für so eine Emulation seine eigene State Machine zu schreiben. Die CPAL Lib wirtd als erstes so eingestellt, dass sie ein Byte (das Kommando) empfängt. Sobald das empfangen wurde, kannst du es auswerten und die Kommunikation auf die neuen Bedingungen umstellen. Gruß Mike
Sehe ich das richtig, dass die einzige Möglichkeit, Read von Write zu unterscheiden, ist zu prüfen, ob ein repeated start empfangen wurde? siehe auch hier http://cache.freescale.com/files/32bit/doc/app_note/AN4471.pdf s.9 Das dritte Byte kann dann entweder als die eigene Adresse interpretiert werden, falls ein zweites Startbit empfangen wurde. Oder als das erste Datenbyte, falls kein zweites Startbit erfolgte. Grüße
Hallo, mittlerweile kann ich SMBus devices emulieren. Das einzige, was noch fehlt, ist der SMBAlert. http://www.st.com/web/en/resource/technical/document/reference_manual/DM00031020.pdf Laut dem RM S.851 kann man im Control Register mit dem Alert Bit den "Alarm" auslösen. Dann sollte der STM32 auf die 0x18 Adresse mit seiner eigenen Adresse antworten. Ist es richtig, dass der STM32 während das Alert Bit gesetzt ist, sowohl auf die zwei eigene Adressen als auch auf die fest definierte Alert Adresse 0x18 reagiert? Sobald ich das Alert Bit in meinem Slave setze, wartet dieser unendlich lange auf das ADDR Flag, auch wenn ich mit dem Master eine Anfrage 0x18 Adresse sende. Habt ihr eine Idee, warum der Slave nicht auf die 0x18 Adresse antwortet? Grüße
Hallo Matthias, ich wollte mal nachfragen ob du dein Problem mittlerweile lösen konntest und wenn ja wie du es schließlich gelöst hast ? Wäre dir echt dankbar da ich selber an dem Problem verzweifle. :) Viele Grüße.
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.