Hardware-SPI klappt nicht beim LPC2138

OP #573638
Lesenswert?
• ▲
▼
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
Gast #573648
Lesenswert?
• ▲
▼
Den Code hab ich jetzt nicht genauer angesehen, aber was mir zu LPC und 
SPI einfällt:
Beim 2124 ists so, dass CS nicht als GPIO Ausgang verwendet werden darf, 
sondern irgendwie immer der CS Eingang ist (auch wenn das SPI als Master 
eingestellt ist). Da muss maan dann den Pin fest auf High legen und nen 
anderen Pin als CS Ausgang verwenden. Evtl ist das beim 2138 auch so?
OP #573684
Lesenswert?
• ▲
▼
Hallo,

erstmal danke für die Antworten.

@Matthias
Als CS benutzte ich nicht den Hardware-CS-Pin sondern einen anderen.

@A.K.
Das Display hat ein 9-bit Interface. Beim Senden muss ich zuerst die 
SPI-Pins als normale IO-Pins setzten, um das erste Steuerbit manuell zu 
schreiben. Dann werden die SPI-Pins wieder als SPI geschaltet, damit man 
die restlichen 8bits mit dem Hardware-SPI übertragen kann.

MfG Mark

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren