Zwei LPC2148 im Master-Slave-Betrieb

OP #1004337
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:
1
#include "LPC214X.H" /* LPC214x definitions */
2

3
#define SPI_SEL 0x00100000
4

5
/* SPI and MMC commands related modules. */
6
void SPI_Init( void )
7
{
8
  unsigned long portConfig;
9
  volatile unsigned char i, Dummy;
10

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

22
  for ( i = 0; i < 8; i++ )
23
  {
24
    Dummy = SSPDR; /* clear the RxFIFO */
25
  }
26
  return;
27
}
28

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

34
  if (Length == 0 ) return;
35
  while ( Length != 0 )
36
  {  
37
    while ((SSPSR & 0x02) == 0);   /* wait if  SPI transmit buffer full */
38
    SSPDR = *buf;    
39
    while ( !(SSPSR & 0x04) ); /* Wait until the Busy bit is cleared */
40
    Dummy = SSPDR; /* Flush the RxFIFO */
41
    Length--;
42
    buf++;
43
  }
44
  return;
45
}
46

47

48
unsigned char SPI_ReceiveByte( void )
49
{
50
  unsigned char data;
51

52
  SSPDR = 0xFF;  // Write 
53
  while (((SSPSR & 0x10) != 0) ); // wait until busy flag is cleared
54
  data = SSPDR;
55
  return ( data );
56
}
57

58

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

65
/* clear input buffer has no effect
66
  volatile unsigned char Dummy;
67
  for ( i = 0; i < 8; i++ )
68
  {
69
    Dummy = SSPDR; //clear the RxFIFO 
70
  }
71
*/
72

73
  for (i = 0; i < Length; i++ )
74
  {
75
    *buf = SPI_ReceiveByte();
76
    buf++;
77
  }
78
  return;
79
}
80

81

82
void Delay(unsigned long Delay)
83
{
84
  volatile unsigned long i;
85

86
  i= Delay*30;
87
  while  ((i--) > 0);
88
}
89

90

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

97
  SPI_Init();
98
  while (1==1)
99
  {
100
    for (i=0;i<20;i++)
101
      InBuf[i] = 0;
102

103
    SPI_Send(OutBuf,6);
104
    Delay(50000UL);    
105
    SPI_Receive(InBuf,9);
106
    Delay(1000);                     
107
  }
108
}


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

Geri
OP #1004898
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

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.