mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zwei LPC2148 im Master-Slave-Betrieb


Autor: G. B. (geri)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen

Ich versuche gerade per SPI1 eine Verbindung zwischen zwei LPC2148 
controller boards von Olimex aufzubauen.
Der Slave empfägt sechs Datenbtes, der Master liest anschliessend 8 
Datenbytes zurück.

Beim Zurücklesen lese ich für Byte 0 aus dem Fifo des Masters aber immer 
den Wert 0xFF. Auf dem Oszilloskoop sehe ich, dass tatsächlich aber die 
richtigen Werte vom Slave geschickt werden. Hat jemand von Euch hierzu 
vielleicht eine logische Begründung und weiss wie man das Problem lösen 
kann (ohne Indexverschiebung:))?

Hier der Code des Masters:
#include "LPC214X.H" /* LPC214x definitions */

#define SPI_SEL 0x00100000

/* SPI and MMC commands related modules. */
void SPI_Init( void )
{
  unsigned long portConfig;
  volatile unsigned char i, Dummy;

  SSPCR1 = 0x00;       /* SSP master (off) in normal mode */
  portConfig = PINSEL1;
  PINSEL1 = portConfig | 0x02A8;
  IODIR0 = SPI_SEL;   /* SSEL is output */
  IOSET0 = SPI_SEL;   /* set SSEL to high */
  VPBDIV = 0x04;
  /* Set data to 8-bit, Frame format SPI, CPOL = 0, CPHA = 1, and SCR is 7 */
  SSPCR0 = 0x0787; // CPHA = 1;
  SSPCPSR = 0x20;   /* SSPCPSR clock prescale register */
  SSPCR1 = 0x02; /* Device select as master, SSP Enabled, normal operational mode */

  for ( i = 0; i < 8; i++ )
  {
    Dummy = SSPDR; /* clear the RxFIFO */
  }
  return;
}

/* SPI Send a block of data based on the length */
void SPI_Send( unsigned char *buf, unsigned long Length )
{
  volatile unsigned char Dummy;

  if (Length == 0 ) return;
  while ( Length != 0 )
  {  
    while ((SSPSR & 0x02) == 0);   /* wait if  SPI transmit buffer full */
    SSPDR = *buf;    
    while ( !(SSPSR & 0x04) ); /* Wait until the Busy bit is cleared */
    Dummy = SSPDR; /* Flush the RxFIFO */
    Length--;
    buf++;
  }
  return;
}


unsigned char SPI_ReceiveByte( void )
{
  unsigned char data;

  SSPDR = 0xFF;  // Write 
  while (((SSPSR & 0x10) != 0) ); // wait until busy flag is cleared
  data = SSPDR;
  return ( data );
}


/* SPI receives a block of data based on the length */
void SPI_Receive(unsigned char *buf, unsigned long Length)
{
  unsigned long i;
  volatile unsigned char a;

/* clear input buffer has no effect
  volatile unsigned char Dummy;
  for ( i = 0; i < 8; i++ )
  {
    Dummy = SSPDR; //clear the RxFIFO 
  }
*/

  for (i = 0; i < Length; i++ )
  {
    *buf = SPI_ReceiveByte();
    buf++;
  }
  return;
}


void Delay(unsigned long Delay)
{
  volatile unsigned long i;

  i= Delay*30;
  while  ((i--) > 0);
}


int main(void)
{
  unsigned char OutBuf[] = {0x24,0x02,0x02,0xAA,0xBB,0xCC};
  unsigned char InBuf[20];
  int i;

  SPI_Init();
  while (1==1)
  {
    for (i=0;i<20;i++)
      InBuf[i] = 0;

    SPI_Send(OutBuf,6);
    Delay(50000UL);    
    SPI_Receive(InBuf,9);
    Delay(1000);                     
  }
}



Vielen Dank für die Rückmeldung und beste Grüsse

Geri

Autor: G. B. (geri)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen

Bin noch nicht

Ich habe auch geprüft:  Vor dem Einsprung in die Receive-Routine sind 
RNE = 0 (Rx-Fifo leer) und TFE = 1 (Transmitt Fifo empty. Die am 
Oszilloskop gemessenen Daten entsprechen genau dem Soll.

Datenblatt und Erata sheets geben auch keine Auskunft.


Habe ich etwas wichtiges übersehen?.

Beste Grüsse

Geri

Autor: Tobias Plüss (hubertus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mich dünkt, dein Wert für PINSEL1 ist falsch....

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.