STM32 I2C/SMBus

Gast #4323744
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
#4325134
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
Gast #4335964
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
Gast #4342600
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
Gast #4354562
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.