Forum: Mikrocontroller und Digitale Elektronik STM32 I2C/SMBus


von Matthias (Gast)


Lesenswert?

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

von Willi Wills Wissen (Gast)


Lesenswert?

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

von Mike R. (thesealion)


Lesenswert?

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

von Hi (Gast)


Lesenswert?

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

von Matthias (Gast)


Lesenswert?

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

von Willi Wills Wissen (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.