Hallo,
ich bin gerade dabei, meine Displayansteuerung von Sw-SPI auf Hw-SPI am
umprogrammieren. Leider klappt es nicht so, wie es laut Datenblatt sein
sollte.
So sieht die das Senden eins bytes zum LCD in software aus:
1 | void LCD_put(unsigned char data,char mode)
|
2 | {
|
3 | PINSEL1&=~((3<<2)|(3<<4)|(3<<6));//Spi-Pins als normale IOs
|
4 |
|
5 | IOCLR0=(1<<LCD_cs); //'Cs Leitung auf 0 Start der Sequenz
|
6 | IOCLR0=(1<<LCD_sclk); //'Clock Leitung auf 0
|
7 |
|
8 | if(mode==Command)
|
9 | IOCLR0=(1<<LCD_sdata);//'0 für Kommando
|
10 | else
|
11 | IOSET0=(1<<LCD_sdata);//'1 für Parameter
|
12 | IOSET0=(1<<LCD_sclk);//clock tackten
|
13 | IOCLR0=(1<<LCD_sclk);
|
14 |
|
15 | int i;
|
16 |
|
17 | for(i=8;i>0;i--) //heraustakten
|
18 | {
|
19 | if(data&(1<<7))
|
20 | IOSET0=(1<<LCD_sdata);
|
21 | else
|
22 | IOCLR0=(1<<LCD_sdata);
|
23 | IOSET0=(1<<LCD_sclk); //Clock Leitung auf 1
|
24 | IOCLR0=(1<<LCD_sclk); //Clock Leitung auf 0
|
25 | data<<=1;
|
26 | }
|
27 |
|
28 | PINSEL1 |= (1<<3)|(1<<5)|(1<<7); // Spi-pins als spi
|
29 | IOSET0=(1<<LCD_cs); //Cs auf 1 am Ende der Sequenz schalten
|
30 |
|
31 | }
|
Da das Display ein 9-bit Interface hat, muss man das erste bit manuerll
setzten.
Und so als Harware-SPI, was nicht funktioniert:(SPI1)
1 | void LCD_put(unsigned char data,char mode)
|
2 | {
|
3 | PINSEL1&=~((3<<2)|(3<<4)|(3<<6));//Spi-Pins als normale IOs
|
4 |
|
5 | IOCLR0=(1<<LCD_cs); //'Cs Leitung auf 0 Start der Sequenz
|
6 | IOCLR0=(1<<LCD_sclk); //'Clock Leitung auf 0
|
7 |
|
8 | if(mode==Command)
|
9 | IOCLR0=(1<<LCD_sdata);//'0 für Kommando
|
10 | else
|
11 | IOSET0=(1<<LCD_sdata);//'1 für Parameter
|
12 | IOSET0=(1<<LCD_sclk);//clock tackten
|
13 | IOCLR0=(1<<LCD_sclk);
|
14 |
|
15 | PINSEL1 |= (1<<3)|(1<<5)|(1<<7); // Spi-pins als spi
|
16 | while(!(SSPSR&(1<<0)));//warten bis FIFO leer
|
17 | SSPDR=data;
|
18 | while(!(SSPSR&(1<<0)));//warten bis FIFO leer
|
19 | IOSET0=(1<<LCD_cs); //Cs auf 1 am Ende der Sequenz schalten
|
20 |
|
21 | }
|
Die SPI-Schnittstelle wird so initialisiert:
1 | PCONP |= (1<<10); // SPI1 einschalten
|
2 | PINSEL1 |= (1<<3)|(1<<5)|(1<<7); // PIN Konfigurieren
|
3 | SSPCPSR = 60; // Clock Prescale Register setzten(1Mbit)
|
4 | SSPCR0 = 0x07 ; // SPI-Format 8 bit
|
5 | SSPCR1 = (1<<1); // Schnittstelle als Master aktivieren
|
Sieht jemand den Fehler?
MfG Mark