Hallo zusammen,
ich bekomme des AD-Wandler MAX1239 nicht zum Laufen und habe langsam
keine Ideen mehr, weshalb ich eure Hilfe benötige.
In dem angehängten Bild könnt ihr den zugehörigen Schaltplan erkennen.
Dabei ist Ain das Messsignal das der ADC einlesen soll. I2C_SDA und
I2C_SCL werden an den STM32F030 angeschlossen.
I2C_SDA: PA9
I2C_SCL: PA10
Nun möchte ich den MAX1239 mit dem STM32F030 und der HAL-Lib
programmieren. Hier mein mit dem STMCube erstellter Code.
Der MAX1239 hat die Adresse 0110101, folglich muss bei dem Befehl
HAL_I2C_Master_Transmit zunächst das Byte 0x6A (01101010) gesendet
werden. Die zusätzliche 0 an Stelle 8 gibt an, dass es ein
Schreibprozess ist.
Jedoch klappt die I2C Datenübertragung nicht, wie in der angehängten
Oszi-Aufnahme zu erkennen ist. Das neunte Bit ist high und somit ein
not-Ack. Das bedeutet, dass der MAX1239 nicht erkannt wird und somit
bricht die Übertragung ab.
Freue mich auf eure Anregungen und Tipps.
Ist jede Flanke passend zum im Datenblatt vorgegebenen Timing ?
Sind alle Interaktionen exakt gemaess dem Datenblatt ?
Ich denke nicht. In diesem Fall muss man jede Zeile des Datenblatten
sorgfaeltig nochmals gelesen werden.
Ich wuerd die Libraries mal weglegen und jedes Bit von Hand
rausschieben. Bis der Fehler gefunden wurde zumindest.
Sapperlot W. schrieb:> Ist jede Flanke passend zum im Datenblatt vorgegebenen Timing ?
Ich habe nun das Timing-Diagramm mit meinem Oszi-Bild verglichen und die
einzelnen Zeiten miteinander verglichen. Bei mir ist momentan falsch:
- Data Hold Time zu hoch (10µs anstatt 900ns)
- Rise Time Tr und Fall Time Tf zu niedrig
Wie in der Abbildung zu den I2C Einstellungen zu sehen ist, kann ich Tr
und Tf im STCube einfach verlängern.
Nun habe ich aber das Problem, dass man dort maximal eine Frequenz von
1000MHz einstellen kann.
Das habe ich mal versucht und hatte bei der Data Hold Time noch immer
1,2 µs (>900ns).
Wie kann ich diese Zeit noch runter bekommen?
zigner schrieb:> 1000MHz
Wau.
Im Ernst, normal wird F/S Mode benutzt.
Wenn Du HS nutzen willst musst Du das erst einschalten.
Datenblatt Seite 12, HS-Mode.
hp-freund schrieb:> Wau.>> Im Ernst, normal wird F/S Mode benutzt.> Wenn Du HS nutzen willst musst Du das erst einschalten.> Datenblatt Seite 12, HS-Mode.
Ich will den MAX1239 überaupt nicht im HS-Mode betreiben (Außerdem wäre
dort die max. Data Hold Time mit 150 ns noch geringer).
Ich möchte nur erreichen, dass die Data Hold Time nicht größer als der
im Timing-Diagramm angegebene Wert von 900 ns ist.
Jedoch ist bei mir SDA während einem Bit (=Data Hold Time) immer
deutlich größer als 900 ns. Wie in meinem Beitrag davor beschrieben,
sogar wenn ich die höchste Frequenz einstelle.
Also muss ich es irgendwie anders schaffen, diese Zeit Data Hold zu
verringern. Leider fällt mir hier jedoch nichts ein.
Ich habe deine Einstellungen in CubeMX 4.19 getestet, aber wie es
aussieht werden die so nicht mehr akzeptiert.
Gibt zwar keine Meldung, aber der graue Timing Wert ist 0x00000000.
Häng mal deine aktuelle .ioc Datei an.
hp-freund schrieb:> Ich habe deine Einstellungen in CubeMX 4.19 getestet, aber wie es> aussieht werden die so nicht mehr akzeptiert.> Gibt zwar keine Meldung, aber der graue Timing Wert ist 0x00000000.>> Häng mal deine aktuelle .ioc Datei an.
Ich habe nun übrigens rausbekommen, was ich machen muss. Die Data hold
time kann ich in dem Register I2C_TIMINGR über die Bits SDADEL
einstellten (siehe Anhang).
Jetzt müsste ich allerdings noch wissen, wie man mit der HAL-Lib direkt
ein beliebiges Register ändern kann.
zigner schrieb:> Jetzt müsste ich allerdings noch wissen, wie man mit der HAL-Lib direkt> ein beliebiges Register ändern kann.
Das hi2c1.Init.Timing = 0x00100209; ist das I2C_TIMINGR.
Der graue Wert in CubeMX. Wenn er sich dort nicht einstellen lässt, dann
in der .c Datei korrigieren.
Ich habe nun hi2c1.Init.Timing = 0x00006666 eingestellt.
Dazu habe ich nun alle Zeiten aus der Timing Tabelle des Datenblatts mit
meinen verglichen und bin der Meinung, dass meine Zeiten passen sollten.
Aber es tut sich immer noch nichts. Das neunte Bit ist high und die
Kommunikation wird abgebrochen.
zigner schrieb:> Aber es tut sich immer noch nichts. Das neunte Bit ist high und die> Kommunikation wird abgebrochen.
hatte einen Wackelkontakt, nun funktioniert das Senden.
Vergessen schrieb:> Müssten die Adressen nicht 0x68 und 0x69 sein?
Der MAX1239 hat die Adresse 0110101. Dadurch ergeben sich die beiden
"Adressen":
Senden: 0x6A
Lesen: 0x6B
Vergessen schrieb:> Falls der 1239 nicht eine andere Adresse als ein 1237 hat ist diese laut> Figure 7 im Datenblatt 0110100
Der MAX1239 hat eine andere Adresse. Diese steht auf Seite 1 in der
Tabelle Ordering Information.
zigner schrieb:> Ich habe nun hi2c1.Init.Timing = 0x00006666 eingestellt.> Dazu habe ich nun alle Zeiten aus der Timing Tabelle des Datenblatts mit> meinen verglichen und bin der Meinung, dass meine Zeiten passen sollten.
Dies war noch ein Versuch auf dem Steckbrett. Nun wollte ich mit
denselben Einstellungen den MAX1239 auf meiner Platine in Betrieb
nehmen. Allerdings stimmt nun das Timing nicht mehr, wie im Anhang
dargestellt ist. Die Rise-Time beträgt nun 5.4526 µs, obwohl sie maximal
300 ns betragen darf.
Ich habe es nicht geschafft den richtigen Wert für hi2c1.Init.Timing zu
ermitteln, damit die Rising-Time unter 300 ns bleibt. Kann mir hier
jemand weiterhelfen?
Oder kann ich diese Zeit auch noch anders senken, damit ich steilere
Flanken bekomme?