[gelöst]SSD1306 SPI an Wemos01

Hallo Gemeinde

Seit Tagen versuche ich irgend ein Lebenszeichen auf mein OLED Display zu bekommen :frowning:

HW: SSD1306 SPI und ein Wemos D1 mini

Ich versuche dies mit der Adafruit Lib und der U8g2 Lib, beide ohne Erfolg.
Die Hardware habe ich schon mal ersetzt → ohne Erfolg (also muss es an mir liegen)

Verkabelung wie folgt:

CLK D1
MOSI D2
RES D3
DC D4
CS GND

Mit der U8g2 Lib folgende Initialisierung:

U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ D1, /* data=*/ D2, /* cs=*/ D0, /* dc=*/ D4, /* reset=*/ D3);

Mit der Adafruit Lib:

// Declaration for SSD1306 display connected using software SPI (default case):
#define OLED_MOSI   D2
#define OLED_CLK   D1
#define OLED_DC    D4
#define OLED_CS    D0
#define OLED_RESET D3
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
  OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

Kein Zeichen kommt vom OLED.
Habe auch schon etliche andere Initstrings versucht.

Wo mache ich den Denkfehler?

Danke für Eure Hilfe.
pat

Verwende mal statt de Pin-Bezeichnung D0 - D4 die GPIO-Kennzeichnungen.
Da hatte ich schon häufiger Differenzen.

Hallo Dieter.

Danke für den Hinweis.
Bei allen Initialsierungsstrings ist dies jedoch nirgends so.... :o
So kommt man ja auch nicht drauf.

Melde mich wieder nach dem testen.

Patrick

Hi, warum CS auf GND wenn in der Initialisierung steht : CS=*/D0 ???
Denke CS ist doch der ChipSelect , der gebraucht wird, damit sich das Dysplay überhaupt angesprochen fühlt? Denn SPI ist ja ein DatenBUS und wählt das Ziel-Device über CS aus.

LG Stefan

Hallo Stefan.

Dies habe ich bei meinen Recherchen mal irgendwo gelesen, dass dieser nicht gebraucht wird und auf GND gezogen werden kann.

Gibt es da allenfalls ein Unterschied zwischen HW und SW SPI?

Gruss
Patrick

valbuz:
Dies habe ich bei meinen Recherchen mal irgendwo gelesen, dass dieser nicht gebraucht wird und auf GND gezogen werden kann.

Das ist nur bedingt richtig.
Wenn du nur ein Modul am SPI-Bus hängen hast, geht es so.
Sobald du den Bus richtig mit mehreren Modulen einsetzt, brauchst du den CS als Steuersignal.

valbuz:
Hallo Stefan.

Dies habe ich bei meinen Recherchen mal irgendwo gelesen, dass dieser nicht gebraucht wird und auf GND gezogen werden kann.

Gibt es da allenfalls ein Unterschied zwischen HW und SW SPI?

Gruss
Patrick

Hi,
keine Ahnung ob es da zwischen HW un SW SPI nen Unterschied gibt.
Das mit dem CS war nur so ne Idee, die ich einfach mal ausprobiert hätte, wenn eine Komponente am Bus bei mir nicht richtig will.
Wenns dann klappt, .. ok , Fehler gefunden, wenn nicht, .. -> weiter suchen/fragen.

LG Stefan

Hallo,

HotSystems:
Das ist nur bedingt richtig.
Wenn du nur ein Modul am SPI-Bus hängen hast, geht es so.
Sobald du den Bus richtig mit mehreren Modulen einsetzt, brauchst du den CS als Steuersignal.

auch das ist nicht zwingend so. Etliche SPI-ICs brauchen die steigende Flanke an /CS, um das Ende einer Übertragung z.B. bei mehr-byte-Anweisungen zu erkennen. Auch, um neu zu syncronisieren, wenn sie mal den Faden durch Störungen verloren haben.
/CS wird also bei mir immer angesteuert, sicher ist sicher...

Gruß aus Berlin
Michael

amithlon:
Hallo,

auch das ist nicht zwingend so. Etliche SPI-ICs brauchen die steigende Flanke an /CS, um das Ende einer Übertragung z.B. bei mehr-byte-Anweisungen zu erkennen. Auch, um neu zu syncronisieren, wenn sie mal den Faden durch Störungen verloren haben.
/CS wird also bei mir immer angesteuert, sicher ist sicher...

Gruß aus Berlin
Michael

Ahh...ok.
Bisher hat das bei mir noch funktioniert.
Aber ein guter Hinweis, werde den bei zukünftigen Projekten auch berücksichtigen.

HotSystems:
Verwende mal statt de Pin-Bezeichnung D0 - D4 die SPIO-Kennzeichnungen.
Da hatte ich schon häufiger Differenzen.

Verständnisfrage, ich muss ja die PIN's am Wemos angeben nicht die am OLED. Also wo das OLED angeschlossen ist.

valbuz:
Verständnisfrage, ich muss ja die PIN's am Wemos angeben nicht die am OLED. Also wo das OLED angeschlossen ist.

Ja, genau.
Die genaue Bezeichnung findest du im Pinout zu deinem Board.

HotSystems:
Das ist nur bedingt richtig.
Wenn du nur ein Modul am SPI-Bus hängen hast, geht es so.
Sobald du den Bus richtig mit mehreren Modulen einsetzt, brauchst du den CS als Steuersignal.

Also es ist nur ein Modul am SPI.

HotSystems:
Ja, genau.
Die genaue Bezeichnung findest du im Pinout zu deinem Board.

Gebe ich jedoch SDA, SCL etc ein, erhalte Kompilierungsfehler....diese Bezeichnungen werden nicht erkannt.

P.S. kann ich eigentlich praktisch jeden PIN für SCL,SDA etc. nehmen?

Nein, du musst die GPIO Bezeichnung verwenden.

Sorry ich hatte mich oben vertippt.

GPIO ist eine offizielle Kennzeichnung der Pins.

Es werden nur MOSI/MISO und SCK erkannt.

Also GPIO wie bis anhin.

Anschlieesen ist egal, solange die GPIO mit dem Sourcecode stimmen?

Das Ding macht keinen Wank... >:(

Habe es momentan mit folgendem Init versucht:

// Declaration for SSD1306 display connected using software SPI (default case):
#define OLED_MOSI   D7
#define OLED_CLK   D5
#define OLED_DC    D4
#define OLED_CS    D8
#define OLED_RESET D3
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
  OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

valbuz:
Gibt es da allenfalls ein Unterschied zwischen HW und SW SPI?

Ja, gibt es.

Wenn ich APA102-LEDs möglichst schnell mit Informationen versorgen möchte, dann nutze ich an einem UNO/Nano/ProMini HW-SPI, weil diese Hardware für diese Aufgabe optimiert wurde. Die dafür zu nutzenden Pins sind festgelegt. Bei SW-SPI kann man die Pins wählen, ist aber nicht so optimal schnell.

Bei schneller getakteten µCs wird der Vorteil einer speziellen Hardware geringer, beim ESP32 gibt es dann eine IO-Matrix mit freier (?) Pinzuordnung.

Wenn es keine Gründe dagegen gibt, würde ich auch beim WemosD1 HW-SPI nutzen.

Programm für den ESP32 mit SSD1331:

/*
OLED - ESP32
GND - GND
VDD - 3,3V
SCX - 18 (VSPI CLK)
SDA - 23 (VSPI MOSI)
RES - 13
DC -   4
CS -   5 (VSPI CS0)
*/
#include <SPI.h>
#include "Ucglib.h"
Ucglib_SSD1331_18x96x64_UNIVISION_HWSPI ucg(/*cd=*/ 4, /*cs=*/ 5, /*reset=*/ 13);

void setup(void)
{
  ucg.begin(UCG_FONT_MODE_TRANSPARENT);
  ucg.clearScreen();
}

void loop(void)
{
  ucg.setRotate180();
  ucg.setFont(ucg_font_ncenR12_tr);
  ucg.setColor(255, 255, 255);
  
  ucg.setPrintPos(0,25);
  ucg.print("Hallo Welt!");

  delay(500);  
}

Warum ignorierst Du #1?

agmue:
Warum ignorierst Du #1?

Sch... jetzt hab's auch ich geschnallt :wink: es funzt!

Danke
Patrick

valbuz:
Sch... jetzt hab's auch ich geschnallt :wink: es funzt!

Danke
Patrick

Achja.....und wie sieht es jetzt aus ?

Hallo Dieter.

#define OLED_MOSI  4
#define OLED_CLK   5
#define OLED_DC    2
#define OLED_CS    15
#define OLED_RESET 0

Patrick