mikrocontroller.net

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


Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht 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:
void LCD_put(unsigned char data,char mode)
{
  PINSEL1&=~((3<<2)|(3<<4)|(3<<6));//Spi-Pins als normale IOs
  
  IOCLR0=(1<<LCD_cs);                                        //'Cs Leitung auf 0  Start der Sequenz
  IOCLR0=(1<<LCD_sclk);                                      //'Clock Leitung auf 0
  
  if(mode==Command)
    IOCLR0=(1<<LCD_sdata);//'0 für Kommando
  else
    IOSET0=(1<<LCD_sdata);//'1 für Parameter
  IOSET0=(1<<LCD_sclk);//clock tackten
  IOCLR0=(1<<LCD_sclk);  
  
  int i;
  
  for(i=8;i>0;i--)    //heraustakten
  {
    if(data&(1<<7))
      IOSET0=(1<<LCD_sdata);
    else 
      IOCLR0=(1<<LCD_sdata);
    IOSET0=(1<<LCD_sclk);  //Clock Leitung auf 1
    IOCLR0=(1<<LCD_sclk);  //Clock Leitung auf 0
    data<<=1;
  }
  
  PINSEL1 |= (1<<3)|(1<<5)|(1<<7); // Spi-pins als spi
  IOSET0=(1<<LCD_cs);   //Cs auf 1 am Ende der Sequenz schalten
  
}

Da das Display ein 9-bit Interface hat, muss man das erste bit manuerll 
setzten.

Und so als Harware-SPI, was nicht funktioniert:(SPI1)
void LCD_put(unsigned char data,char mode)
{
  PINSEL1&=~((3<<2)|(3<<4)|(3<<6));//Spi-Pins als normale IOs
  
  IOCLR0=(1<<LCD_cs);                                        //'Cs Leitung auf 0  Start der Sequenz
  IOCLR0=(1<<LCD_sclk);                                      //'Clock Leitung auf 0
  
  if(mode==Command)
    IOCLR0=(1<<LCD_sdata);//'0 für Kommando
  else
    IOSET0=(1<<LCD_sdata);//'1 für Parameter
  IOSET0=(1<<LCD_sclk);//clock tackten
  IOCLR0=(1<<LCD_sclk);  
  
  PINSEL1 |= (1<<3)|(1<<5)|(1<<7); // Spi-pins als spi
  while(!(SSPSR&(1<<0)));//warten bis FIFO leer
  SSPDR=data;
  while(!(SSPSR&(1<<0)));//warten bis FIFO leer
  IOSET0=(1<<LCD_cs);   //Cs auf 1 am Ende der Sequenz schalten
  
}

Die SPI-Schnittstelle wird so initialisiert:
  PCONP |= (1<<10); // SPI1 einschalten
  PINSEL1 |= (1<<3)|(1<<5)|(1<<7); // PIN Konfigurieren
  SSPCPSR = 60; // Clock Prescale Register setzten(1Mbit)
  SSPCR0 = 0x07 ; // SPI-Format 8 bit  
  SSPCR1 = (1<<1); // Schnittstelle als Master aktivieren

Sieht jemand den Fehler?

MfG Mark

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum denn nicht

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

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.