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


von G. B. (geri)


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

von G. B. (geri)


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

von Tobias P. (hubertus)


Lesenswert?

Mich dünkt, dein Wert für PINSEL1 ist falsch....

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.