Forum: Mikrocontroller und Digitale Elektronik Hardware-SPI klappt nicht beim LPC2138


von Mark .. (mork)


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

von Matthias (Gast)


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?

von A.K. (Gast)


Lesenswert?

Also was jetzt:
> PINSEL1&=~((3<<2)|(3<<4)|(3<<6));//Spi-Pins als normale IOs
oder
> PINSEL1 |= (1<<3)|(1<<5)|(1<<7); // PIN Konfigurieren

von Mark .. (mork)


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

von Ralph (Gast)


Lesenswert?

Warum denn nicht

 SSPCR0 = 0x08 ; // SPI-Format 9 bit

und du sparst dir das umschalten, Dein Problem liegt mit 99% an diesem 
schalten

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.