Forum: Mikrocontroller und Digitale Elektronik SSD1309 STM32


von Sebastian H. (sebastian_h809)


Lesenswert?

Moin mikrocontroller.net-Community,

ich wollte mich gerne mit meinen Anliegen an euch wenden, mit der 
Hoffnung, dass mir da jmd. Weiterhelfen kann.

Es geht darum, dass ich gerne ein OLED-Display mit der Bibliothek 
SSD1309 auf ein beliebigen STM32-Board zum Laufen bringen möchte.



(1)
Bisher habe ich das OLED-Display mit der SSD1309-Biblothek nur über die 
Arduino IDE und für Arduino-Board in Verwendung gehabt. Das hat auch 
sehr gut funktioniert.

Es gibt auch die Option STM32-Boards in Kombi mit der Arduino IDE 
benutzen zu können. Z.B. kann man die SSD1309-Bib. unter der Verwendung 
der Arduino IDE mit dem STM32-Nucleo 64 Modell STM32F401RE verwenden. 
Das funktioniert!

Bei der Verwendung des Mikrocontroller-Board STM32L432KC (Nucleo-32) und 
bei dem STM32F303K8 (Nucleo-32) funktioniert die SSD1309-Bib. leider 
nicht. D.h. man kann diese Modell unter der Verwendung der Arduino IDE 
auswählen auch mit der SSD1309-Bib. flashen, aber auf dem Dsiplay gibt 
es keine gewünschte Reaktion.

Das ist zeimlich verwiirent für mich!



(2)
Aus dem Grund wollte ich einen neuen Versuch mit der STM32 IDE 
STM32CubeIDE starten. Meine Kennnisse im Umgang mit der STM32 IDE 
klappen in sofern, dass ich den Mikrokontroller richtig einrichten kann.

Bei Youtube habe ich ein hilfreiches Tutorial zur Implementierung eines 
OLED-Displays mit der SSD1306-Bib. (I2C) gefunden. Zur ersten 
Hilfstellung habe ich das Tutorial nachgemacht. Die Umsetztung des 
Tutorial hat mit einem OLED-Display und der SSD1306-Bib. (I2C) hat auch 
soweit geklappt.
https://www.youtube.com/watch?v=z1Px6emHIeg&t=9s

Leider ist das nicht genau das, was ich suche. Den ich würde ja gerne 
die SSD1309-Bib im SPI-Modus auf einen beliebigen STM32 zum Laufen 
bringen.

Ich ich auch ein anderes Youtube-Video geschaut. Da wird zwar die 
gleiche SSD1306-Bib. verwendet, aber dafür nicht I2C-, sondern SPI-Modus 
eingestellt. Daher bin ich mir relativ sicher, dass ich bei der 
Einstellung per STM32 IDE keine Fehler gemacht habe. Ich denke der 
Knackpunkt liegt in der Einrichtung der SSD1306-Bibliothek selber.
https://www.youtube.com/watch?v=F1B3G4o3d48&t=193s



(3)
Im nächsten Schritt wäre der Einsatz der SSD1306-Bib. im SPI-Modus sehr 
hilfreich. Ich gehe davon aus, dass ich so die Erfahrung machen könnte, 
um das Gelernte dann vielleicht anschließend mit der SSD1309-Bib. 
anzuwenden.

- In der Datei ssd1306_conf.h kann man den Modus I2C oder SPI, das 
SM32-Board und die Pixelgröße einstellen.

- In der Datei ssd1306.h ist die Pinbelegung des Boards.

- Und in der Datei ssd1306.c sind die entsprechenden Funktionen



Wenn ich z.B. das Mikrocontroller-Board STM32F401RE in der STM32CubeIDE 
einstelle. Den SPI-Modus auswähle und in der Datei ssd1306_conf.h SPI 
auswhle, und in der Datei ssd1306.h die ausgwählten Pins definiere, dann 
bekomme ich keine Fehlermeldung. Ich kann genau wie bei dem Tutorial 
SSD1306 I2C die Funktionen in der main.c verwenden, um das Display zu 
beschreiben. Aber auf dem Display selber wird nicht gezeigt.

Das ist momentan der Stand der Dinge bei mir und ich würde mich sehr 
freuen, wenn mir da jmd. weiterhelfen könnte. Und möchte mich im Vorfeld 
für deine Hilfestellung/Problemlösung bedanken!

Gruß
Sebastian S.

von Rene K. (xdraconix)


Lesenswert?

Kann dein Display überhaupt SPI?

von Harry L. (mysth)


Lesenswert?

Rene K. schrieb:
> Kann dein Display überhaupt SPI?

Ja, bei entsprechender Beschaltung, aber, was zum Teufel ist eine "Bib"?

von Rene K. (xdraconix)


Lesenswert?

Harry L. schrieb:
> Ja, bei entsprechender Beschaltung

Ich Frage, weil ich habe hier ein OLED mit SSD1309 das kann nur I2C, das 
gibt es zwar auch als SPI - aber entweder / oder.

von Harry L. (mysth)


Lesenswert?

Rene K. schrieb:
> Harry L. schrieb:
>> Ja, bei entsprechender Beschaltung
>
> Ich Frage, weil ich habe hier ein OLED mit SSD1309 das kann nur I2C, das
> gibt es zwar auch als SPI - aber entweder / oder.

Einige haben Lötbrücken um die Configuration zu ändern.

von Sebastian H. (sebastian_h809)


Lesenswert?

Moin allerseits,

danke für Anteilnahme.

@Rene K.
Ja, ich habe sowohl OLED-Displays die man per SPI, als auch I2C mit der 
SSD1306- Bibliothek nutzen kann.

von Cyblord -. (cyblord)


Lesenswert?

Sebastian H. schrieb:
> Moin allerseits,
>
> danke für Anteilnahme.

Wer ist denn von uns gegangen?

von Paul B. (paule201)


Lesenswert?

Sebastian H. schrieb:
> um das Display zu
> beschreiben. Aber auf dem Display selber wird nicht gezeigt.

Welche Geschwindigkeit hast du beim SPI eingestellt? Nicht das der STM32 
zu schnell für dein Display ist.

Du hast in der config_datei: "Use I2C" auskommentiert und "Use SPI" 
aktiviert?
Im Video bei 9:26 in Zeile 22/23?
Du hast Zeile 26/27 auskommentiert und Zeile 30 bis 36 aktiviert?
Du verwendest SPI1?
Du hast die Pin im Device Config Tool genau so benannt wie sie in Zeile 
30-36 heißen und alle korrekt mit dem Display verbunden?

Dein Chip Select Signal wechselt von High auf LOW wenn die Kommunikation 
beginnt und wieder zurück nachdem die Daten gesendet wurden? Oszilloskop 
oder eine LED als Indikator wären hier sehr nützlich.

Der SPI Mode am STM passt zum SPI Mode vom Display?
Edit: In der Cube IDE heißt das CPOL und CPHA.

Eventuell lädst du mal das .ioc File hoch.

: Bearbeitet durch User
von Sebastian H. (sebastian_h809)


Lesenswert?

Moin @Paul B.

Um auf deine Fragen zu antworten:
- das Makro für I2C ist ist auskommentiert und für SPI einkommentiert.
  Ansopnsten spuckt der Compiler auch eine Fehlermeldung aus

- das mit der Taktgeschwindigkeit ist auf jeden Fall zu beachten. Und da
  könnte auch der Fehler liegen. Darüber habe ich auch schon 
nachgedacht.
  Wie erwäht habe ich alle Einstellungen aus dem Youtube-Tutorial.

  Die Clock Configuration des STM32F401RE ist auf 84 MHz.
  SPI-Einstellungen: SPI1, Data Size 8 Bits, Clock Parameter Prescaler 8

- Was die anderen Einstellungen der ssd1306_conf.h betrieft :
  23  //#define SSD1306_USE_I2C
  24  #define SSD1306_USE_SPI
  25
  26 // I2C Configuration
  27 //#define SSD1306_I2C_PORT        hi2c1
  28 //#define SSD1306_I2C_ADDR        (0x3C << 1)
  29 // SPI Configuration
  30 #define SSD1306_SPI_PORT        hspi1
  31 #define SSD1306_CS_Port         GPIOC      //CS_GPIO_Port
  32 #define SSD1306_CS_Pin          GPIO_PIN_7 //CS_Pin
  33 #define SSD1306_DC_Port         GPIOA   //DC_GPIO_Port
  34 #define SSD1306_DC_Pin          GPIO_PIN_0 //DC_Pin
  35 #define SSD1306_Reset_Port      GPIOA  //RES_GPIO_Port
  36 #define SSD1306_Reset_Pin       GPIO_PIN_8 //RES_Pin

  58  #define SSD1306_WIDTH           128
  67 #define SSD1306_HEIGHT            64

  Ich habe Zeile 31-36 mit 2 verschiedenen Möglichkeiten verucht. Einmal
  das was auskommentiert ist. Und einmal so wie es da steht.

  Wenn das auskommentierte einkommentiert ist, dann gibt es eine
  Fehlermeldung. Ich denke es liegt an der Datei ssd1306.h. Da werden 
die
  Pins zugewiesen.

  #ifndef SSD1306_SPI_PORT
  #define SSD1306_SPI_PORT        hspi2
  #endif

  #ifndef SSD1306_CS_Port
  #define SSD1306_CS_Port         GPIOC
  #endif
  #ifndef SSD1306_CS_Pin
  #define SSD1306_CS_Pin          GPIO_PIN_7
  #endif

  #ifndef SSD1306_DC_Port
  #define SSD1306_DC_Port         GPIOA
  #endif
  #ifndef SSD1306_DC_Pin
  #define SSD1306_DC_Pin          GPIO_PIN_0
  #endif

  #ifndef SSD1306_Reset_Port
  #define SSD1306_Reset_Port      GPIOA
  #endif
  #ifndef SSD1306_Reset_Pin
  #define SSD1306_Reset_Pin       GPIO_PIN_8
  #endif

von Axel S. (a-za-z0-9)


Lesenswert?

Harry L. schrieb:
> Rene K. schrieb:
>> Kann dein Display überhaupt SPI?
>
> Ja, bei entsprechender Beschaltung, aber, was zum Teufel ist eine "Bib"?

Eine kurze Radhose mit Trägern. Oder etwas davon:

https://www.dict.cc/englisch-deutsch/bib.html

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.