Hallo
Ich möchte hier ein OLED Display ansteuern. Das Display hat 128 x 128
pixel und arbeite mit einem SSD1327 Controller.
Die Ansteuerung soll über I2C erfolgen. Es scheint so, als ob die
Initialisierung funktioniert. Über das Kommando "invers display" kann
ich alle Pixel einschalten bzw. über über "All OFF" kann ich alle Pixel
ausschalten.
Jetzt möchte ich in den Datenspeicher des Displays schreiben. Hieran
scheitere ich wohl im Moment... :-(
Hat hier schonmal jemand mit solch einem Display/Controler gearbeitet
und kann mir sagen was ich beim Beschreiben des Datenspeichers beachten
muss?
Hier mal der Code meiner Initialisierung (zugegeben nicht sehr schön mit
dem Befüllen des buffers, aber sollte fürs erste funktionieren...):
1 | char init_OLED(void)
|
2 | {
|
3 | char buffer[29];
|
4 |
|
5 | //buffer[0] = 0x80;
|
6 | //buffer[1] = 0xAF;
|
7 | buffer[0] = 0x80;
|
8 | buffer[1] = 0xAB; //Function selection A
|
9 | buffer[2] = 0x80;
|
10 | buffer[3] = 0x1B; //Enable internal VDD regulator
|
11 | buffer[4] = 0x80;
|
12 | //buffer[7] = 0xA4; //normal display
|
13 | buffer[5] = 0xA5; //All pixels ON
|
14 | //buffer[5] = 0xA6; //All pixels OFF
|
15 | //buffer[7] = 0xA7; //Inverse display
|
16 | buffer[6] = 0xA8; //set MUX ratio
|
17 | buffer[7] = 0x80;
|
18 | buffer[8] = 0x80; //set MUX ratio to 128
|
19 | buffer[9] = 0x80;
|
20 | buffer[10] = 0x15; //Set column address
|
21 | buffer[11] = 0x80;
|
22 | buffer[12] = 0x00; //Startaddress = 0x00
|
23 | buffer[13] = 0x80;
|
24 | buffer[14] = 0x3F; //Endaddress = 0x3F
|
25 | buffer[15] = 0x80;
|
26 | buffer[16] = 0x75; //Set row address
|
27 | buffer[17] = 0x80;
|
28 | buffer[18] = 0x00; //Startaddress = 0x00
|
29 | buffer[19] = 0x80;
|
30 | buffer[20] = 0x7F; //Endaddress = 0x7F
|
31 | buffer[21] = 0x80;
|
32 | buffer[22] = 0xA0; //Set re-map options
|
33 | buffer[23] = 0x80;
|
34 | buffer[24] = 0x00; //Enable horizontal address increment
|
35 | buffer[25] = 0x80;
|
36 | buffer[26] = 0xAF; //set display on
|
37 | buffer[27] = 0x80;
|
38 | buffer[28] = 0xB2; //NOP
|
39 |
|
40 | printf("Initialisiere OLED...\n");
|
41 | //Power ON sequence
|
42 | GpioPinSetLow(OUTBANK_A, DISP_RESET);
|
43 | NutSleep(5);
|
44 | GpioPinSetHigh(OUTBANK_A, DISP_RESET);
|
45 | NutSleep(5);
|
46 | GpioPinSetHigh(OUTBANK_A, DISP_VCC);
|
47 | NutSleep(50);
|
48 | TwMasterTransact(OLED_ADDRESS, buffer, 29, 0, 0, 50);
|
49 | NutSleep(500);
|
50 | return 0;
|
51 | }
|
und hier mal meine Versuche etwas in den Speicher zu schreiben:
1 | char hello_OLED(void)
|
2 | {
|
3 | char buffer[132];
|
4 | int i;
|
5 |
|
6 | for (i=0; i<=127; i++)
|
7 | {
|
8 | if(i%2 == 0)
|
9 | {
|
10 | buffer[i] = 0x40;
|
11 | }
|
12 | else
|
13 | {
|
14 | buffer[i] = 0x0F;
|
15 | }
|
16 | }
|
17 |
|
18 | buffer[128] = 0x40;
|
19 | buffer[129] = 0xB2;
|
20 |
|
21 | printf("schreibe...\n");
|
22 | TwMasterTransact(OLED_ADDRESS, buffer, 130, 0, 0, 500);
|
23 | return 0;
|
24 | }
|
MIt der Funktion TwMasterTransact wird der buffer auf den I2C Bus
geschickt. Das ganze läuft unter Ethernut. Darum diese Funktion.
Könnt ihr mir hier irgendwie helfen?
Laut Datenblatt muss vor jedem Datenbyte ein 0x40 geschickt werden, vor
jedem Kommando ein 0x80. Sehe ich das richtig!?
Danke schonmal!
Grüße
Bean