Forum: Mikrocontroller und Digitale Elektronik Displaya 16-Bit Mode?


von marcel (Gast)


Lesenswert?

Servus,

ich habe hier eine Displayroutine gefunden. Das Display wird via SPI 
angesteuert. Die Hauptroutinen sehen wie folgt aus:
1
//*********4W_SPI_Write()
2
void SPI_Write(unsigned char dat)
3
{
4
  unsigned char t = 8;
5
  do
6
  {
7
    SDI = (bit)(dat & 0x80);
8
    dat <<= 1;
9
    SCLK = 0;  
10
    //SPI_Delay();
11
    SCLK = 1;
12
    //SPI_Delay();
13
  
14
  } while ( --t != 0 );
15
  //SCLK = 1;
16
  //SDI = 1;
17
}
18
19
20
//////////////SPI Write command
21
void LCD_CmdWrite(uchar cmd)
22
{  
23
  SCLK = 1;  
24
  SDI = 1;  
25
  SCS = 0;
26
  //SPI_Delay();
27
  SPI_Write(0x80); 
28
  SPI_Write(cmd);
29
  SCS = 1;
30
  //SPI_Delay();
31
}
32
33
//////////////SPI Write data or  parameter
34
void LCD_DataWrite(uchar Data)
35
{
36
  SCLK = 1;  
37
  SDI = 1;    
38
  SCS = 0;
39
  SPI_Write(0x00); 
40
  SPI_Write(Data);
41
  //SPI_Delay();
42
  SCS = 1;
43
}

Die SPI_Write Funktion kann einfach durch eine Funktion ersetzt werden, 
die 8 Bit in den SPI-Buffer schreibt.

Meine Frage: Wenn ich das richtig verstehe werden zum Senden 1 Bytes 
vorher 8-Bit gesendet (entweder 0x80 oder 0x00), wobei das erste Bit der 
8-Bit zur Unterscheidung zwischen Daten und Kommandos dient.

Ist dies richtig so? Sowas habe ich bisher noch nicht gesehen. Entweder 
kenne ich Displays im 9-bit SPI Mode, wobei das erste Bit für 
Daten/Kommandos genutzt wird oder heirfür wird eine separate Leitung 
spendiert. Das hier aber 16 Bit gesendet werden ist mir nicht geläufig. 
Wenn dies so stimmen würde, müßte ich dann meinen SPI auch im 16-BIT 
MOde initialisieren??

MFG

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

marcel schrieb:
> Das Display
Welches?

von marcel (Gast)


Lesenswert?


von Karl H. (kbuchegg)


Lesenswert?

marcel schrieb:

> Meine Frage: Wenn ich das richtig verstehe werden zum Senden 1 Bytes
> vorher 8-Bit gesendet (entweder 0x80 oder 0x00), wobei das erste Bit der
> 8-Bit zur Unterscheidung zwischen Daten und Kommandos dient.
> Ist dies richtig so?

Sieht zumindest so aus.

> Sowas habe ich bisher noch nicht gesehen. Entweder
> kenne ich Displays im 9-bit SPI Mode, wobei das erste Bit für
> Daten/Kommandos genutzt wird oder heirfür wird eine separate Leitung
> spendiert.

Kommt aufs Display an. Stell dir einfach vor, dass im Display 2 Bit 
Schieberegister sitzen. Aus dem einen kommen die 8 Datenleitungen raus, 
aus dem anderen die Steuerleitungen. Die da zb Kommando/Daten aber auch 
'Schreiben/Lesen' sind. 2 Stück Standard 8-Bit Schieberegister können 
einfacher sein, als ein spezielles mit einer unüblichen Bitzahl. Zudem 
ist man bei der Ansteuerung universeller. Denn 8 Bit bzw. Vielfache von 
8 kann jeder. Bei nicht durch 8 teilbaren Werten muss man andrerseits 
wieder tricksen.

> Das hier aber 16 Bit gesendet werden ist mir nicht geläufig.
> Wenn dies so stimmen würde, müßte ich dann meinen SPI auch im 16-BIT
> MOde initialisieren??

Kommt auf deine SPI an. Hat die denn einen 16 Bit Modus?
Sonst eben: 2 Stück 8 Bit Taktungen und gut ists. Das LCD kann ja 
sowieso nicht unterscheiden (ausser an einem ganz kurzen Timingdelay am 
Clock), ob du jetzt 1 Befehl oder deren 2 benutzt, um die SPI Hardware 
zu befüllen.

von Mike (Gast)


Lesenswert?

marcel schrieb:
> Ist dies richtig so?

Das sollte dir das Datenblatt zu dem Display verraten. Wenn die 
Display-Routine bisher funktioniert hat, spricht einiges dafür.

von marcel (Gast)


Lesenswert?

was mir halt unklar ist, warum die Chipselect Leitung vor den 16 Bit 
nach unten gezogen wird und erst danach wieder hoch. Das sind doch dann 
eindeutig 16 Bit die gesendet werden. Deswegen die Frage nach dem 16-Bit 
Modus.

CS_LOW
8Bit // (0x80 oder 0x00)
CS_High

und dann

CS_LOW
8Bit // DAten
CS_High

hätte ich verstehen können.

Aber so bin ich mir noch unklar über den Modus, da im Datenblatt auch 
nichts vom 16-Bit Modus steht.

von Karl H. (kbuchegg)


Lesenswert?

marcel schrieb:
> was mir halt unklar ist, warum die Chipselect Leitung vor den 16 Bit
> nach unten gezogen wird und erst danach wieder hoch.

Es geht zwar nicht aus dem von dir verlinkten Datenblatt hervor, aber 
normalerweise ist genau dieses das Kennzeichen für das Gerät: Achtung, 
die nächsten Bits sind für dich.

> Das sind doch dann
> eindeutig 16 Bit die gesendet werden. Deswegen die Frage nach dem 16-Bit
> Modus.

Ja, macht ja nichts.
Die Sache funktioniert ja grundsätzlich so:
solange die Chip Select Leitung falsch steht, kann sich an der Daten 
bzw. Taktleitung tun was will, das interessiert das LCD nicht.
Erst mit der Aktivierung des Chip Select schaltet das LCD seine Eingänge 
'scharf'.
Ab da gibt es jetzt 2 Möglichkeiten.
Entweder das LCD zählt die Taktpulse mit und erklärt sich mit dem 16. 
Taktpuls als befriedigt. Oder aber es taktet einfach mit dem Takt die 
Datenleitungen seinerseits in ein Schieberegister (mit 16 Bit Länge) 
ein, egal wieviele Takte und das was beim Deaktivieren des Chip Select 
in den 16 Bit dieses Schieberegisters rauskommt, das wird anhand der 
Position im Schie beregister benutzt.

Du machst du jetzt mehr draus, als tatsächlich dahinter steckt.

> CS_LOW
> 8Bit // (0x80 oder 0x00)
> CS_High

Wo siehst du das?
Genau DAS passiert eben nicht.

CS geht auf Low, dann werden 16 Bits rausgetaktet, wobei jeder 
Datenpegel von einem Puls auf der Taktleitung gefolgt sind.
Und erst dann, wenn alle 16 draussen sind, geht CS wieder auf High.

Das da 16 Bits übertragen werden, hat aber nichts mit einem 8 Bit oder 
16 Bit Modus des Senders zu tun. Das LCD wil 16 Bits haben (in der Form, 
dass die Clock Leitung 16 mal gepulst wird). Ob du das im Sender mit 
einem Modus machst, der 16 Bit kann, oder mit einer SPI Einheit die nur 
8 Bit kann (und daher dann 2 mal angesprochen wird), oder einer 
Hardwrae, die nur 4 Bit auf einmal raustakten kann (und dann 4 mal 
hintereinander benutzt wird) oder mit einer die gar nur 1 Bit raustakten 
kann (und dann 16 mal benutzt wird), ist ja dem LCD wurscht. Das 
interessiert sich immer nur für den nächsten Clock Puls. Egal wie der 
zustande kommt.

> hätte ich verstehen können.

ganz im Gegenteil. Das wäre noch viel ungewöhnlicher. Denn dann bräuchte 
man wieder einen Mechanismus, mit dem man das erste Byte vom 2-ten Byte 
unterscheiden können muss.

Du liest da etwas zuviel in den Chip Select hinein. Chip Select bedeutet 
einfach nur: Achtung! - Die nächsten Bits sind für dich.
Mit einer Aufteilung in Bytes hat ein Chip Select erst mal nichts zu 
tun.

von Purzel H. (hacky)


Lesenswert?

Meine Erfahrung mit dem SPI Modus ist, dass da alle moeglich ist. 8, 16, 
24, 32 bit am stueck. Es gibt auch solche Modi, da muss der Chipselect 
vor oder waehrend dem letzt bit hoch, und solch geschichten. Daher immer 
das Datenblatt genau (!) lesen und auch so implementieren. Nicht einfach 
SPI Mode, und passt schon. Dann mit dem Scope verifizieren. Dh 
Testpunkte auf der Leiterplatt vorsehen um die Probe einzustecken.
Falls es mit einem vorgesehenen SPI Mode nicht geht, haendisch mit dem 
Pin wackeln.

von Mike (Gast)


Lesenswert?

Siebzehn Für Fuenfzehn schrieb:
> Meine Erfahrung mit dem SPI Modus ist, dass da alle moeglich ist. 8, 16,
> 24, 32 bit am stueck

Und wenn da hintereinander 16 Stk 74xx595 dran hängen, sind es 256 Bit 
am Stück ;-)

von marcel (Gast)


Lesenswert?

OK, danke für die Antworten.
Versuche jetzt seit längerer Zeit das oben angesprochene Dispaly mit 
einem PIC32 im 4 wire SPI Mode anzusprechen, ohne Erfolg.

Ich poste mal meinen Code, vielleicht fällt Jemanden etwas aus. Die 
Hardwarekonfigs habe ich alle dementsprechend angepasst.
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
9
#define color_brown   0x40c0
10
#define color_black   0x0000
11
#define color_white   0xffff
12
#define color_red     0xf800
13
#define color_green   0x07e0
14
#define color_blue    0x001f
15
#define color_yellow  color_red|color_green
16
#define color_cyan    color_green|color_blue
17
#define color_purple  color_red|color_blue
18
19
20
// Configuration Bit settings
21
22
// SYSCLK = 80 MHz (8MHz Crystal / FPLLIDIV * FPLLMUL / FPLLODIV)
23
// PBCLK = 80 MHz (SYSCLK / FPBDIV)
24
// Primary Osc w/PLL (XT+,HS+,EC+PLL)
25
// WDT OFF
26
// Other options are don't care
27
#pragma config FPLLMUL = MUL_20, FPLLIDIV = DIV_2, FPLLODIV = DIV_1, FWDTEN = OFF
28
#pragma config POSCMOD = HS, FNOSC = PRIPLL, FPBDIV = DIV_1 // Primary Oszillator -> HS: High Speed crystal
29
#define SYS_FREQ (80000000L)
30
31
// SPI
32
#define LCD_CS_OUT              mPORTBSetPinsDigitalOut(BIT_12)
33
#define LCD_CS_0                mPORTBClearBits(BIT_12)
34
#define LCD_CS_1                mPORTBSetBits(BIT_12)
35
36
37
38
void Delay1ms(unsigned int i)
39
{
40
    unsigned char j;
41
  while(i--)
42
    for(j=0;j<125;j++);
43
}
44
45
46
void Delay10ms(unsigned int i)
47
{  while(i--)
48
  Delay1ms(10);
49
}
50
51
void Delay100ms(unsigned int i)
52
{  while(i--)
53
  Delay1ms(100);
54
}
55
56
//*********4W_SPI_Write()
57
unsigned char SPI_Write(unsigned char dat)
58
{
59
    SPI1BUF = dat;                     // write to shift register to begin transmission
60
    while( !SPI1STATbits.SPIRBF);    // wait for transfer to complete
61
    return SPI1BUF;
62
}
63
64
//////////////SPI Write command
65
void LCD_CmdWrite(unsigned char cmd)
66
{
67
68
        LCD_CS_0;
69
  //SPI_Delay();
70
  SPI_Write(0x80);
71
  SPI_Write(cmd);
72
        LCD_CS_1;  
73
}
74
75
//////////////SPI Write data or  parameter
76
void LCD_DataWrite(unsigned char Data)
77
{
78
        LCD_CS_0;
79
  SPI_Write(0x00);
80
  SPI_Write(Data);
81
        LCD_CS_1;
82
}
83
84
85
///////////////Background color settings
86
void Text_Background_Color1(unsigned int b_color)
87
{
88
89
  LCD_CmdWrite(0x60);//BGCR0
90
  LCD_DataWrite((unsigned char)(b_color>>11));
91
92
  LCD_CmdWrite(0x61);//BGCR0
93
  LCD_DataWrite((unsigned char)(b_color>>5));
94
95
  LCD_CmdWrite(0x62);//BGCR0
96
  LCD_DataWrite((unsigned char)(b_color));
97
}
98
99
100
////////////////Write command and parameter
101
void Write_Dir(unsigned char Cmd,unsigned char Data)
102
{
103
  LCD_CmdWrite(Cmd);
104
  LCD_DataWrite(Data);
105
}
106
107
/////////////PLL setting
108
void PLL_ini(void)
109
{
110
    LCD_CmdWrite(0x88);
111
    LCD_DataWrite(0x0a);
112
113
    Delay1ms(1);
114
    LCD_CmdWrite(0x89);
115
    LCD_DataWrite(0x02);
116
    Delay1ms(1);
117
}
118
119
/////////////LCM initial
120
void LCD_Initial(void)
121
{
122
123
        PLL_ini();
124
  LCD_CmdWrite(0x10);   //SYSR   bit[4:3]=00 256 color  bit[2:1]=  00 8bit MPU interface
125
  LCD_DataWrite(0x0C);   //                 1x 64k color             1x  16bit
126
127
  LCD_CmdWrite(0x04);    //PCLK
128
  LCD_DataWrite(0x82);   //
129
//        DelayMs(1);
130
        Delay1ms(1);
131
132
  //Horizontal set
133
  LCD_CmdWrite(0x14);   //HDWR//Horizontal Display Width Setting Bit[6:0]
134
  LCD_DataWrite(0x3b); //Horizontal display width(pixels) = (HDWR + 1)*8       0x27
135
  LCD_CmdWrite(0x15);   //HNDFCR//Horizontal Non-Display Period fine tune Bit[3:0]
136
  LCD_DataWrite(0x02); //(HNDR + 1)*8 +HNDFCR
137
  LCD_CmdWrite(0x16);   //HNDR//Horizontal Non-Display Period Bit[4:0]
138
  LCD_DataWrite(0x03); //Horizontal Non-Display Period (pixels) = (HNDR + 1)*8
139
  LCD_CmdWrite(0x17);   //HSTR//HSYNC Start Position[4:0]
140
  LCD_DataWrite(0x01); //HSYNC Start Position(PCLK) = (HSTR + 1)*8
141
  LCD_CmdWrite(0x18);   //HPWR//HSYNC Polarity ,The period width of HSYNC.
142
  LCD_DataWrite(0x03); //HSYNC Width [4:0]   HSYNC Pulse width(PCLK) = (HPWR + 1)*8
143
144
  //Vertical set
145
  LCD_CmdWrite(0x19); //VDHR0 //Vertical Display Height Bit [7:0]
146
  LCD_DataWrite(0x0f); //Vertical pixels = VDHR + 1  0xef
147
  LCD_CmdWrite(0x1a); //VDHR1 //Vertical Display Height Bit [8]
148
  LCD_DataWrite(0x01); //Vertical pixels = VDHR + 1   0x00
149
  LCD_CmdWrite(0x1b); //VNDR0 //Vertical Non-Display Period Bit [7:0]
150
  LCD_DataWrite(0x0F); //Vertical Non-Display area = (VNDR + 1)
151
  LCD_CmdWrite(0x1c); //VNDR1 //Vertical Non-Display Period Bit [8]
152
  LCD_DataWrite(0x00); //Vertical Non-Display area = (VNDR + 1)
153
  LCD_CmdWrite(0x1d); //VSTR0 //VSYNC Start Position[7:0]
154
  LCD_DataWrite(0x0e); //VSYNC Start Position(PCLK) = (VSTR + 1)
155
  LCD_CmdWrite(0x1e); //VSTR1 //VSYNC Start Position[8]
156
  LCD_DataWrite(0x06); //VSYNC Start Position(PCLK) = (VSTR + 1)
157
  LCD_CmdWrite(0x1f);   //VPWR //VSYNC Polarity ,VSYNC Pulse Width[6:0]
158
  LCD_DataWrite(0x01); //VSYNC Pulse Width(PCLK) = (VPWR + 1)
159
160
  LCD_CmdWrite(0x8a);//PWM setting
161
  LCD_DataWrite(0x80);
162
  LCD_CmdWrite(0x8a);//PWM setting
163
  LCD_DataWrite(0x81);//open PWM
164
  LCD_CmdWrite(0x8b);//Backlight brightness setting
165
  LCD_DataWrite(0xff);//Brightness parameter 0xff-0x00
166
}
167
168
169
170
void NextStep(void)
171
{
172
    Delay1ms(100);
173
    Delay1ms(100);
174
    Delay1ms(100);
175
}
176
177
178
//full display test
179
void Test(void)
180
{  ///display red
181
  Text_Background_Color1(color_red);//Background color setting
182
  Write_Dir(0x8E,0x80);//Began to clear the screen (display window)
183
  NextStep();
184
  ///display green
185
  Text_Background_Color1(color_green);//Background color setting
186
  Write_Dir(0x8E,0x80);//Began to clear the screen (display window)
187
  NextStep();
188
  ///display blue
189
  Text_Background_Color1(color_blue);//Background color setting
190
  Write_Dir(0x8E,0x80);//Began to clear the screen (display window)
191
  NextStep();
192
  ///display white
193
  Text_Background_Color1(color_white);//Background color setting
194
  Write_Dir(0x8E,0x80);//Began to clear the screen (display window)
195
  NextStep();
196
  ///display cyan
197
  Text_Background_Color1(color_cyan);//Background color setting
198
  Write_Dir(0x8E,0x80);//Began to clear the screen (display window)
199
  NextStep();
200
  ///display yellow
201
  Text_Background_Color1(color_yellow);//Background color setting
202
  Write_Dir(0x8E,0x80);//Began to clear the screen (display window)
203
  NextStep();
204
  ///display purple
205
  Text_Background_Color1(color_purple);//Background color setting
206
  Write_Dir(0x8E,0x80);//Began to clear the screen (display window)
207
  NextStep();
208
  ///display black
209
  Text_Background_Color1(color_blue);//Background color setting
210
//  Write_Dir(0x8E,0x80);//Began to clear the screen (display window)
211
  NextStep();
212
}
213
214
215
216
217
 /*
218
 Initialize SPI module in pic32
219
 */
220
 void InitSPI(void)
221
 {
222
 // 8 Bit, Master-Mode, eanable SPI-1
223
 // nano_CS_LAT_BIT=1;      //nano deselected
224
// OpenSPI1(SPI_MODE16_ON | MASTER_ENABLE_ON , SPI_ENABLE);
225
226
     /* Idle state for clock is high, active is low
227
     /* Transmit happens from active clock state to idle clock state*/
228
229
230
// OpenSPI1(SPI_MODE8_ON | MASTER_ENABLE_ON  | CLK_POL_ACTIVE_LOW | SPI_CKE_ON, SPI_ENABLE);
231
 OpenSPI1(SPI_MODE8_ON | MASTER_ENABLE_ON  | CLK_POL_ACTIVE_LOW | SPI_CKE_ON  | SEC_PRESCAL_1_1 | PRI_PRESCAL_4_1 | SPI_SMP_ON , SPI_ENABLE);
232
//     OpenSPI1(SPI_MODE8_ON | MASTER_ENABLE_ON  | CLK_POL_ACTIVE_HIGH | SPI_CKE_ON | SEC_PRESCAL_8_1 | PRI_PRESCAL_16_1, SPI_ENABLE);
233
 ConfigIntSPI1(SPI_TX_INT_EN | SPI_RX_INT_EN | SPI_FAULT_INT_EN);
234
// EnableIntSPI1;
235
 }
236
//
237
////////////////Foreground color settings
238
void Text_Foreground_Color1(unsigned int b_color)
239
{
240
241
  LCD_CmdWrite(0x63);//BGCR0
242
  LCD_DataWrite((unsigned char)(b_color>>11));
243
244
  LCD_CmdWrite(0x64);//BGCR0
245
  LCD_DataWrite((unsigned char)(b_color>>5));
246
247
  LCD_CmdWrite(0x65);//BGCR0
248
  LCD_DataWrite((unsigned char)(b_color));
249
} 
250
251
 
252
/*
253
 * 
254
 */
255
int main() {
256
    LCD_CS_OUT;
257
    InitSPI();
258
    LCD_CS_1;
259
260
        Delay100ms(5);
261
262
  LCD_Initial();
263
264
  Write_Dir(0x01,0x80);//display on
265
266
        while(1)
267
        {
268
            //full display test
269
       Test();
270
                         Text_Foreground_Color1(color_white);//Set the foreground color
271
       Text_Background_Color1(color_black);//Set the background color
272
273
        }
274
275
276
}

von marcel (Gast)


Lesenswert?

Konkret bleiche ich immer in der Schleife:
1
//*********4W_SPI_Write()
2
unsigned char SPI_Write(unsigned char dat)
3
{
4
    SPI1BUF = dat;                     // write to shift register to begin transmission
5
    while( !SPI1STATbits.SPIRBF);    // wait for transfer to complete
6
    return SPI1BUF;
7
}

Irgendetwas muss mit den SPI Leitungen/Initialisierunge noch im Argen 
sein. Jemand der sich mit dem Controller auskennt und auf Anhieb eine 
Idee hat?

von marcel (Gast)


Lesenswert?

Niemanden, dem etwas auffällt oder ne Idee hat, welche SPI 
Konfigurationen fehlerhaft sein könnten?

von grundschüler (Gast)


Lesenswert?

hast du die Reset-Leitung des Lcd verbunden? Ohne Reset funktionieren 
die meisten lcds nicht.

von Michael K. (Gast)


Lesenswert?

Such Dir das Datenblatt zum RA8875.
Überprüfe auf welche Betriebsart der auf dem Display eingestellt ist und 
dann schau Dir an was der genau erwartet.

Das ist die einzige Möglichkeit weiter zu kommen wenn Du nicht auf 
fertige LIBs setzen kannst oder der Chip einfach nicht mit Dir spricht.

Die Hersteller verwenden gerne wohl klingende Namen für Ihre 
Ansteuerungen, die sich dann nur leider völlig anders verhalten als es 
ein z.B. SPI normalerweise tut.
Die Dokumentation der Displays ist oft so schlecht das man gerade noch 
erfährt wie der Controller heißt, aber schon nicht mehr wie der 
gejumpert ist.

Schau Dir auch mit dem Oszi an was wirklich an Signalen bei Dir 
rauskommt sonst kannst Du bis in alle Ewigkeit die Fehler suchen.

Als letzte Lösung frage beim Hersteller nach Code zum Testen.
Eine Handvoll 8051 ASM Code war für mich mal die einzige Möglichkeit 
herauszufinden wie der Dreck angesteuert wird.

von Purzel H. (hacky)


Lesenswert?

Nochwas. Das Reset timing ist immer etwas speziell : Plane eine lange 
Zeit fuer die Reset sequenz, gemaess Datenblatt. Dass kann schon mal 
100ms nach Powerup oder dem ersten Befehl sein.
Und. Warte nicht auf das Display. Die Ready Leitung kannst du vergessen. 
Machs mit einem Timer. Dh einem timerinterrupt. Ich verwende eine 
Display Statusmaschine, die wird alle 10ms zu meinem Tick im main einen 
Schritt weitergefuehrt. Dh alle 10ms geht ein Befehl raus. Das kann 
Cursor Position, oder Daten sein. Ich mach so alle 500ms einen refresh 
eines Character displays. Fuer einen graphischen display geht man dann 
vielleicht auf 1ms oder so.

von grundschüler (Gast)


Lesenswert?

pol und pha stimmen?

hat dein controller vielleicht einen fifo? dann sieht die Spi-routine 
mglw. anders aus, weil der fifo geleert werden muss.

Zum testen kannst du statt des hw-spi einen sw-spi einsetzen. das müsste 
dann einfacher funktionieren:
1
#define pol 0
2
#define pha 0
3
char SWSPI_Transfer (char SPI_byte)
4
{
5
 unsigned char SPI_count; // counter for SPI transaction
6
 for (SPI_count = 8; SPI_count > 0; SPI_count--) // single byte SPI loop
7
 {
8
#if pha==0
9
if(SPI_byte & 0x80){swmosi_h;}else{swmosi_l;}
10
#endif
11
      #if pol
12
      swsck_l; // set SCK high
13
      #else
14
      swsck_h; // set SCK high
15
      #endif
16
17
#if pha==0
18
SPI_byte = SPI_byte << 1; // shift next bit into MSB
19
if(swmiso_v) SPI_byte++; // capture current bit on MISO
20
#else
21
if(SPI_byte & 0x80){swmosi_h;}else{swmosi_l;}
22
#endif
23
24
      #if pol
25
      swsck_h; // set SCK high
26
      #else
27
      swsck_l; // set SCK high
28
      #endif
29
#if pha==1
30
SPI_byte = SPI_byte << 1; // shift next bit into MSB
31
if(swmiso_v) SPI_byte++; // capture current bit on MISO
32
#endif
33
}
34
return (SPI_byte);
35
} // END SPI_Transfer

von grundschüler (Gast)


Lesenswert?

pardon, ich

grundschüler schrieb:
> zum testen kannst du statt des hw-spi einen sw-spi einsetzen

pardon, du willst ja den sw-spi durch einen hw-spi ersetzen. 
Funktioniert es denn mit dem sw-spi?

von marcel (Gast)


Lesenswert?

SW-SPI funktioniert, aber das ist nicht das was ich gerne möchte. Es ist 
ja eine Beispiel Routine unter dem obigen Link gepostet -> Diese 
funktioniert auch, aber ich persönlich finde das etwas unschön. Ich habe 
eigentlich nur die

unsigned char SPI_Write(unsigned char dat)

Routine umgeschrieben.

Ist die Reset Leitung Pflicht?
Im Datenblatt des Controllers steht die Reset Leitung nicht als Belegung 
mit dabei, ebenso wird sie in der Beispielroutine nicht verwendet.

von grundschüler (Gast)


Lesenswert?

marcel schrieb:
> Ist die Reset Leitung Pflicht?

wenn das lcd mit dem sw-spi funktioniert reicht das An- und Ausschalten 
offenbar für den lcd-reset, kannst du dann so lassen.

für hw-spi pha, pol und fifo prüfen, dann müsste es gehen

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.