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

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