Forum: Mikrocontroller und Digitale Elektronik SSD1306 OLED, VBAT und VDD zusammen an 3.3V?


von C. H. (hedie)


Lesenswert?

Hallo zusammen

Ich habe hier ein OLED mit einem SSD1306 Controller drauf.

Im Datenblatt steht bei VBAT 3.5V-4.2V
Auf der Herstellerwebseite: 
http://www.solomon-systech.com/en/product/display-ic/oled-driver-controller/ssd1306/
Steht: 3.3V-4.2V

Zudem steht:  VDD= 1.65V - 3.3V, <VBAT for IC Logic

Ich gehe deshalb davon aus, dass man VDD kleiner als VBAT wählen sollte.
Leider habe ich immoment nur 3.3V zur verfügung und habe deshalb VDD und 
VBAT zusammen an 3.3V.

Ich habe die interne ChargePump aktiviert. Vermute ich mal.
Am VCC Pin welcher über einen C gegen GND liegt messe ich leider keine 
Spannung. Ob das nun am VBAT oder meinem Code liegt weiss ich nicht.

Das Display zeigt leider nichts an. Nun weiss ich nicht, ob das an 
dieser Spannung oder an meinem Code liegt.

Deshalb wollte ich fragen, ob jemand bereits erfahrungen mit dem SSD1306 
hat und hierzu etwas schreiben könnte.

Danke

von G. H. (schufti)


Lesenswert?

also ich habe hier das typ. 0.96" OLED mit SSD1306 an 3.3V problemlos 
laufen.

von C. H. (hedie)


Lesenswert?

G. H. schrieb:
> also ich habe hier das typ. 0.96" OLED mit SSD1306 an 3.3V
> problemlos
> laufen.

Habe auch das 0.96" OLED

Sprichst du von einem Modul, welches evtl. noch einen Spannungswandler 
drauf hat oder von einem OLED mit Controller?

Ich habe dieses hier:

http://www.buydisplay.com/default/datasheet-128x64-oled-module-spi-0-96-inch-graphic-displays-white-on-black

Ich betreibe es, bzw. versuche es im SPI 4-Wire Mode zu betreiben.
BS0,1,2 habe ich auf GND.

Zur verifikation des Codes, versuche ich nach der initialisierung das 
Display zu invertieren mit 0xA7 und 0xA6. Genügt das oder muss ich 
wirklich noch Daten senden? Es geht mir im ersten Schritt lediglich 
darum, meine SPI Kommunikation zu verifizieren.

Hier mein Init Code:
1
  GPIO_SetBits(OLED_Port,OLED_RST_Pin);
2
  delay_ms(5);
3
  GPIO_ResetBits(OLED_Port,OLED_RST_Pin);
4
  delay_ms(500);
5
6
  SPI2_SendLCD(0xAE, 0); //0 bedeutet Command (DC ist auf low)
7
  SPI2_SendLCD(0xD5, 0);
8
  SPI2_SendLCD(0x80, 0);
9
10
  SPI2_SendLCD(0xA8, 0);
11
  SPI2_SendLCD(0x3F, 0);
12
13
  SPI2_SendLCD(0xD3, 0);
14
  SPI2_SendLCD(0x00, 0);
15
16
  SPI2_SendLCD(0x8D, 0);
17
  SPI2_SendLCD(0x14, 0);
18
19
  SPI2_SendLCD(0x40, 0);
20
  SPI2_SendLCD(0xA6, 0);
21
22
  SPI2_SendLCD(0xA4, 0);
23
24
  SPI2_SendLCD(0xA1, 0);
25
  SPI2_SendLCD(0xC8, 0);
26
27
  SPI2_SendLCD(0xDA, 0);
28
  SPI2_SendLCD(0x12, 0);
29
30
  SPI2_SendLCD(0x81, 0);
31
  SPI2_SendLCD(0xCF, 0);
32
33
  SPI2_SendLCD(0xD9, 0);
34
  SPI2_SendLCD(0xF1, 0);
35
36
  SPI2_SendLCD(0xDB, 0);
37
  SPI2_SendLCD(0x40, 0);
38
39
  SPI2_SendLCD(0xAF, 0);
40
41
42
.....
43
44
  while(1)
45
  {
46
47
    SPI2_SendLCD(0xA7,0); 
48
    GPIO_SetBits(GPIOB,GPIO_Pin_7);
49
    delay_ms(500);
50
    SPI2_SendLCD(0xA6,0);
51
    GPIO_ResetBits(GPIOB,GPIO_Pin_7);
52
    delay_ms(500);
53
  }

Leider geschieht nichts...

von G. H. (schufti)


Angehängte Dateien:

Lesenswert?

Hi, hier mal der InitCode aus der Lib die ich verwende (12c oder isp ist 
da ja egal)
1
  #if defined SSD1306_128_64
2
    // Init sequence for 128x64 OLED module
3
    ssd1306_command(SSD1306_DISPLAYOFF);                    // 0xAE
4
    ssd1306_command(SSD1306_SETDISPLAYCLOCKDIV);            // 0xD5
5
    ssd1306_command(0x80);                                  // the suggested ratio 0x80
6
    ssd1306_command(SSD1306_SETMULTIPLEX);                  // 0xA8
7
    ssd1306_command(0x3F);
8
    ssd1306_command(SSD1306_SETDISPLAYOFFSET);              // 0xD3
9
    ssd1306_command(0x0);                                   // no offset
10
    ssd1306_command(SSD1306_SETSTARTLINE | 0x0);            // line #0
11
    ssd1306_command(SSD1306_CHARGEPUMP);                    // 0x8D
12
    if (vccstate == SSD1306_EXTERNALVCC) 
13
      { ssd1306_command(0x10); }
14
    else 
15
      { ssd1306_command(0x14); }
16
    ssd1306_command(SSD1306_MEMORYMODE);                    // 0x20
17
    ssd1306_command(0x00);                                  // 0x0 act like ks0108
18
    ssd1306_command(SSD1306_SEGREMAP | 0x1);
19
    ssd1306_command(SSD1306_COMSCANDEC);
20
    ssd1306_command(SSD1306_SETCOMPINS);                    // 0xDA
21
    ssd1306_command(0x12);
22
    ssd1306_command(SSD1306_SETCONTRAST);                   // 0x81
23
    if (vccstate == SSD1306_EXTERNALVCC) 
24
      { ssd1306_command(0x9F); }
25
    else 
26
      { ssd1306_command(0xCF); }
27
    ssd1306_command(SSD1306_SETPRECHARGE);                  // 0xd9
28
    if (vccstate == SSD1306_EXTERNALVCC) 
29
      { ssd1306_command(0x22); }
30
    else 
31
      { ssd1306_command(0xF1); }
32
    ssd1306_command(SSD1306_SETVCOMDETECT);                 // 0xDB
33
    ssd1306_command(0x40);
34
    ssd1306_command(SSD1306_DISPLAYALLON_RESUME);           // 0xA4
35
    ssd1306_command(SSD1306_NORMALDISPLAY);                 // 0xA6
36
  #endif

im angehängten Bild (i2c) kannst du die Beschaltung am breakoutboard 
erkennen.

von C. H. (hedie)


Lesenswert?

Man sollte zuvor den RST freigeben...

Asche auf mein Haupt. Ich habe Hi-Low anstelle Low-Hi gemacht.
Nun funktioniert alles!

Danke euch trozdem :)

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.