Forum: Mikrocontroller und Digitale Elektronik STM32G071G8 I2C schickt keine Bytes?


von RH (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen,

ich habe folgendes Problem:
Ich möchte ein ST7032 Displaymodul über I2C ansteuern. Grundsätzlich 
soweit so einfach. Leider verschickt der uC die Bytes nicht so per I2C 
wie er es sollte. Genauer gesagt geht nur das Adressbyte raus welches 
vom Display-Controller auch aknowledged wird. Anschließend ist aber tote 
Hose.

im Code erzeuge ich zum Testen einfach erstmal nur ein Datenarry mit 
zwei Einträgen. Dieses versuche ich dann mit HAL_I2C_Master_Transmit() 
zu verschicken.

Hier der Code-Schnipsel:
1
 buffer[0] = 0x40;
2
 buffer[1] = 0x06;
3
 HAL_I2C_Master_Transmit(&hi2c1, 0x7C<<1, buffer, sizeof(buffer), 1)

Im Anhang ist zu sehen wie das ganze dann auf der Leitung aussieht.

Weiß jemand eventuell weiter und hat eine Idee was schieflaufen könnte? 
Das Versenden über I2C mit der HAL-Funktion hat schonmal bei einem 
anderen Projekt bei einem ADC funktioniert.

Vielen Dank schonmal.

von Jim M. (turboj)


Lesenswert?

RH schrieb:
> Genauer gesagt geht nur das Adressbyte raus welches
> vom Display-Controller auch aknowledged wird.

Nö, wird es nicht. Jedenfalls ist da im Bild ein NAK. Der Dekoder 
markiert das sogar rot.

Versuche das mal ohne den Linksshift, im Datenblatt steht was von 
0111110 als binäre Adresse drin.

von RH (Gast)


Lesenswert?

Das hat geholfen!

Vielen Dank. Manchmal sieht man den Wald vor lauter Bäumen nicht. ;)

von RH (Gast)


Angehängte Dateien:

Lesenswert?

Im Prinzip nicht mehr ganz dem Thementitel entsprechend aber vielleicht 
ist es ja doch in Ordnung nicht direkt einen neuen Thread zu eröffnen. 
(?)

Über I2C gelingt es mir nun das Displaymodul anzusprechen und wohl auch 
zu Initieren. Den Kontrast kann ich variieren und sehe so, dass ich 
grundsätzlich schonmal mit dem Display kommunizieren kann.

Leider ist es nicht möglich irgendwelche Daten an das Display zu senden, 
bzw. Text anzeigen zu lassen und ich komme einfach nicht darauf wieso 
nicht.

In der While Schleife versuche ich zum Testen ein Zeichen zu Schreiben 
und setze jeweils mit einer Sekunde Delay dazwischen den Kontrast auf 
unterschiedliche Werte.

Meine Funktion ST7032_SetCursor() soll das Schreiben in die richtige 
DDRAM-Stelle ermöglichen. Geschrieben wird dann über 
ST7032_TransmitData().

Eigentlich sollte alles bei der Initalisierung passen, wenn ich mich 
nicht an irgendeiner Stelle schon wieder im Datenblatt vertan habe.

Im Anhang mal der Code vielleicht weiß ja einer von euch weiter...

vielen Dank :)

von Adam P. (adamap)


Lesenswert?

RH schrieb:
> ST7032_TransmitData()

Ansich sollte der Ablauf passen,
hast es mal mit einer Lib verglichen, z.B.:
https://github.com/olkal/LCD_ST7032

https://www.newhavendisplay.com/resources_dataFiles/excode/txt/CoGLCD/C0216CiZ.txt

von RH (Gast)


Lesenswert?

Adam P. schrieb:
> https://github.com/olkal/LCD_ST7032

Mit der Lib hatte ich es schon verglichen. Im Prinzip tue ich das Selbe 
und im Oszi sehe ich auch, dass entsprechende Bytes gesendet und ACK 
werden. Ich vermute, dass ich bei der Initialisierung einen Fehler mache 
aber bei den ganzen Instructions ist es schwierig den Überblick zu 
behalten.

von Stefan F. (Gast)


Lesenswert?

Bist du sicher, dass 0x06 ein sichtbares Zeichen ist? Im ASCII Code wäre 
es das jedenfalls nicht.

von RH (Gast)


Angehängte Dateien:

Lesenswert?

Tatsächlich ist es das nicht. 0x82 für zu einem é auf dem Display. Nun 
ist es aber so, dass einige Zeichen nicht anerkannt werden, obwohl doch 
eigentlich laut dem Datenblatt alle Werte zugeordnet sein müssten oder? 
Auch 0x06 zum Beipiel. Im Anhang habe ich die Tabelle aus dem Datenblatt 
mal beigefügt.

von Stefan F. (Gast)


Lesenswert?

RH schrieb:
> Tatsächlich ist es das nicht. 0x82 für zu einem é auf dem Display.
> Nun
> ist es aber so, dass einige Zeichen nicht anerkannt werden, obwohl doch
> eigentlich laut dem Datenblatt alle Werte zugeordnet sein müssten oder?
> Auch 0x06 zum Beipiel. Im Anhang habe ich die Tabelle aus dem Datenblatt
> mal beigefügt.

Dann probiere doch mal alle 256 Werte durch. Dann siehst du, welche 
zeichen nicht implementiert sind oder ob da ein bestimmtes Muster im 
Fehler erkennbar ist.

von spess53 (Gast)


Lesenswert?

Hi

>obwohl doch
>eigentlich laut dem Datenblatt alle Werte zugeordnet sein müssten oder?
>Auch 0x06 zum Beipiel. Im Anhang habe ich die Tabelle aus dem Datenblatt
>mal beigefügt.

Die gilt aber nur für OPR1=1 und OPR2=1. Weißt du wie diese Anschlüsse 
verschaltet sind? Der Code für 0x06 kann bei anderer Beschaltung genauso 
gut im CG-Ram liegen (siehe Zeichensätze unterhalb der Tabelle).

MfG Spess

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.