Forum: Mikrocontroller und Digitale Elektronik Display 8 Bit SPI


von Simon (Gast)


Angehängte Dateien:

Lesenswert?

Tach,

ich versuche das folgende Display im 8 Bit SPI Modus mit einem PIC32 
anzusteuern:

http://www.buydisplay.com/default/3-inch-240x120-graphic-displays-lcd-serial-interface-black-on-white

Verschaltet habe ich das Display wie im "Series Interfacing Document" 
beschrieben und siehe dazu noch einmal Anhang!

An den VLCD Pin habe ich leider keinen 10M Widerstand mehr vorrätig und 
habe einen um die 0.5MOhm genommen. An den VB+ und VB- Pins habe ich 
2,2u statt 4,7u Elkos angelötet.

Pull Ups habe ich an SDO, Chipselect und SCLK. Jeweils nur 4K7 
Widerstände, bis dato habe ich 10K verwendet, jedoch leider nicht mehr 
vorrätig! 4K7 dürften bei SPI aber unproblematisch sein??

Den Reset Pin und den CD Pin habe ich ohne Pull Ups direkt mit dem MCU 
verbunden. Ist dies korrekt so?

Mit der CD Leitung (siehe auch Interface Anhang) wird nur unterschieden 
ob Daten (High) oder Instructions (Low) an den Display Controller 
gesendet werden.

Diese beiden Funktionen habe ich geschrieben. Leider gibt das Display 
gar keine Ausgabe. Sind gerade die Write_Data Funktion (CS -> Low; 
CD-Leitung auf High; 8Bit senden; CS -> High) so richtig realisert?

Welches SPI Mode (CKE und CLK Bit?) wird bei Displays fast immer 
genutzt?

Hier mal mein Code:
1
#define _SUPPRESS_PLIB_WARNING 1
2
3
#include <p32xxxx.h>
4
#include <stdio.h>
5
#include <stdlib.h>
6
#include <plib.h>
7
8
//#include <math.h>
9
10
#include "SPI_ERC240.h"
11
12
// SYSCLK = 80 MHz (8MHz Crystal / FPLLIDIV * FPLLMUL / FPLLODIV)
13
// PBCLK = 80 MHz (SYSCLK / FPBDIV)
14
// Primary Osc w/PLL (XT+,HS+,EC+PLL)
15
// WDT OFF
16
// Other options are don't care
17
#pragma config FPLLMUL = MUL_20, FPLLIDIV = DIV_2, FPLLODIV = DIV_1, FWDTEN = OFF
18
#pragma config POSCMOD = HS, FNOSC = PRIPLL, FPBDIV = DIV_1 // Primary Oszillator -> HS: High Speed crystal
19
#define SYS_FREQ (80000000L)
20
21
22
23
24
int main() {
25
26
    // Configure the device for maximum performance but do not change the PBDIV
27
    // Given the options, this function will change the flash wait states, RAM
28
    // wait state and enable prefetch cache but will not change the PBDIV.
29
    // The PBDIV value is already set via the pragma FPBDIV option above.
30
    SYSTEMConfig(SYS_FREQ, SYS_CFG_WAIT_STATES | SYS_CFG_PCACHE);
31
32
    ERC_CS_OUT;     // Chipselext Ausgang
33
    ERC_RES_OUT;    // Reset Ausgang
34
    ERC_CD_OUT;     // CD Ausgang
35
36
    SpiChannel spiChn=SPI_CHANNEL1;  // the SPI channel to use
37
38
//    OpenSPI1(SPI_MODE8_ON | MASTER_ENABLE_ON  | CLK_POL_ACTIVE_LOW | SPI_CKE_OFF, SPI_ENABLE);
39
    OpenSPI1(SPI_MODE8_ON | MASTER_ENABLE_ON  | CLK_POL_ACTIVE_LOW |  SPI_CKE_ON | SEC_PRESCAL_8_1  | PRI_PRESCAL_64_1, SPI_ENABLE);
40
//    OpenSPI1(SPI_MODE8_ON | MASTER_ENABLE_ON  | CLK_POL_ACTIVE_HIGH | SPI_CKE_ON | SEC_PRESCAL_8_1 | PRI_PRESCAL_16_1, SPI_ENABLE);
41
//    OpenSPI1(SPI_MODE8_ON | MASTER_ENABLE_ON  | CLK_POL_ACTIVE_HIGH | SPI_CKE_OFF | SEC_PRESCAL_8_1 | PRI_PRESCAL_16_1, SPI_ENABLE);
42
//    ConfigIntSPI1(SPI_TX_INT_EN | SPI_RX_INT_EN | SPI_FAULT_INT_EN);
43
44
//    spi_init();
45
46
    ERC_CS_1;
47
48
    waitlcd(1000);
49
    Initial();
50
51
    waitlcd(1000);
52
    Clear_Display();
53
    while(1)
54
    {
55
        Display_Picture(pic240120);
56
        show_character('A');
57
               Display_Picture(pic240120);
58
    Delay(65000);
59
      Delay(65000);
60
    Write_Instruction(0xA7);//--set inverse display
61
    Delay(65000);
62
      Delay(65000);
63
    Write_Instruction(0xA6);//--set normal display
64
65
    Display_Picture(pic2401201);
66
    Delay(65000);
67
      Delay(65000);
68
    Write_Instruction(0xA7);//--set inverse display
69
    Delay(65000);
70
      Delay(65000);
71
    Write_Instruction(0xA6);//--set normal display
72
73
    Display_Picture(pic2401202);
74
    Delay(65000);
75
      Delay(65000);
76
    Write_Instruction(0xA7);//--set inverse display
77
    Delay(65000);
78
      Delay(65000);
79
    Write_Instruction(0xA6);//--set normal display
80
81
82
    Clear_Display();
83
84
    Display_Chinese(font);
85
    Delay(65000);
86
      Delay(65000);
87
    Write_Instruction(0xA7);//--set inverse display
88
    Delay(65000);
89
      Delay(65000);
90
    Write_Instruction(0xA6);//--set normal display
91
    Display_Chinese_Column(font);
92
    Delay(65000);
93
      Delay(65000);
94
    Write_Instruction(0xA7);//--set inverse display
95
    Display_Chinese_Column(font);
96
    Delay(65000);
97
      Delay(65000);
98
    Write_Instruction(0xA6);//--set normal display
99
    show_character(character);
100
    }
101
    
102
103
//    return;
104
105
106
SPI_ERC240.c:
107
108
void Write_Data(unsigned char dat)
109
{
110
    ERC_CS_0;
111
    ERC_CD_1;         //  Instruction auf 1 ziehen
112
    SPI_Write(dat);
113
    ERC_CS_1;
114
    return;
115
}
116
117
void Write_Instruction(unsigned char cmd)
118
{
119
    ERC_CS_0;
120
    ERC_CD_0;      //  Instruction auf 0 ziehen
121
    SPI_Write(cmd);
122
    ERC_CS_1;
123
    return;
124
}
125
126
void Initial(void)
127
{
128
        ERC_RES_1;
129
//  RST=1;
130
//  Delay(200);
131
        waitlcd(2000);
132
//  RST=0;
133
        ERC_RES_0;
134
        waitlcd(2000);
135
//  Delay(200);
136
//  RST=1;
137
        ERC_RES_1;
138
//  Delay(200);
139
        waitlcd(2000);
140
  Write_Instruction(0xE2);//system reset
141
//  Delay(200);
142
        waitlcd(200);
143
  Write_Instruction(0x27);// Multiples rate :128   set temperature consenpation
144
145
     Write_Instruction(0xC4);//set LCD mapping control   MX=1,MY=0
146
147
  Write_Instruction(0xEA);//set bias:1/12bias
148
149
150
  Write_Instruction(0x81);//Set Gain and Potentiometer
151
    Write_Instruction(0x40|Contrast_level);//Set Gain and Potentiometer  xx xxxxxx
152
153
  Write_Instruction(0x2f);//Power Control:internal
154
  Write_Instruction(0x40);//Set Start Line
155
156
  Write_Instruction(0xA4);//--set normal display
157
//  Write_Instruction(0xA5);//--set  all pixel on
158
  Write_Instruction(0xA6);//--set normal display
159
//  Write_Instruction(0xA7);//--set inverse display
160
161
  Write_Instruction(0x89);//set RAM Address control
162
163
//    Write_Instruction(0x90);//set fixed lines      1001xxxx
164
165
    Write_Instruction(0xB0);//set pageaddress
166
167
168
169
     Write_Instruction(0xAf);//set Display Enable
170
171
}
172
173
void Clear_Display(void)
174
{
175
    unsigned char i,j;
176
  for(i=0;i<15;i++)
177
  {
178
            Set_Page_Address(i);
179
            Set_Column_Address(0x00);
180
        for(j=0;j<240;j++)
181
    {
182
        Write_Data(00);
183
    }
184
  }
185
 return;
186
}
187
188
void Display_Picture(unsigned char pic[])
189
{
190
    unsigned char i,j,num=0;
191
  for(i=0;i<15;i++)
192
  {
193
  Set_Page_Address(i);
194
    Set_Column_Address(0x00);
195
        for(j=0;j<240;j++)
196
    {
197
        Write_Data(pic[num*240+j]);
198
    }
199
    num++;
200
  }
201
    return;
202
}
203
204
205
}
206
207
unsigned char SPI_Write (unsigned char c)
208
209
{
210
211
    SPI1BUF = c;                   // send data to slave
212
213
    while (SPI1STATbits.SPIBUSY);  // wait until SPI transmission complete
214
215
    return SPI1BUF;
216
217
}

von Erich (Gast)


Lesenswert?

Ohne jetzt dein Programm überhaupt anzusehen:
> 10M Widerstand
> um die 0.5MOhm
ist ein so erheblicher Unterschied, daß es nicht passen kann.
Oder ist das Schaltbild überhaupt für DEIN Display?

Ob an den SPI Pins was rauskommt, solltest du mit'n Scope prüfen.

Gruss

von Simon (Gast)


Lesenswert?

Ja es ist genau die Beschaltung, die ich benötige. An dem 1 MOhm liegt 
es leider nicht!

von Simon (Gast)


Lesenswert?

Wie sieht es mit dem 8 Bit SPI Nodus aus, wenn man eine gesonderte 
Leitung für die Unterscheidung zwischen Daten und Kommandos hat:

Mach tman dies dann genaus so: ?
1
void Write_Data(unsigned char dat)
2
{
3
    ERC_CS_0;
4
    ERC_CD_1;         //  Instruction auf 1 ziehen
5
    SPI_Write(dat);
6
    ERC_CS_1;
7
    return;
8
}
9
10
void Write_Instruction(unsigned char cmd)
11
{
12
    ERC_CS_0;
13
    ERC_CD_0;      //  Instruction auf 0 ziehen
14
    SPI_Write(cmd);
15
    ERC_CS_1;
16
    return;
17
}

von Simon (Gast)


Lesenswert?

Aha,

so erfahren bin ich nocht nicht.
Aber gibt es tatsächlich SPI Devices bzw. Displays, deren CHIP Select 
NICHT Low-aktiv ist, sondern High aktiv?

Dies scheint hier der Fall zu sein.

von Karl H. (kbuchegg)


Lesenswert?

Wo hast du den Schaltplan her?
Ja doch wohl aus dem Datenblatt des Herstellers.

Und wenn der Hersteller in seinen Plan reinschreibt: Chip selected when 
high
dann denke ich, dass man dem Hersteller schon vertrauen kann. Denn wenn 
es einer weiss, dann ja wohl er.

von Simon (Gast)


Lesenswert?

Ja Danke.
Ich habe es einfach überlesen, weil ich so so etwas bei Nutzung von SPI 
noch NIE gesehen habe!

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.