Forum: Mikrocontroller und Digitale Elektronik Probleme beim Einlesen über SPI (MSP430F1611)


von Rex Gildo jr. (Gast)


Lesenswert?

Hallo!

Ich habe Probleme ein Register eines FRAM FM25CL64 auszulesen. Zwar 
liegen auf den Datenleitungen (mit Osziloskop sichtbar) die richtigen 
Daten auf dem Bus, allerdings steht ein falscher Wert im RX Register der 
Schnittstelle. Weiterhin wird viel zu früh (wahrscheinlich der Grund) 
das URXIFG1 Flag gesetzt, obwohl der Datenempfang noch gar nicht 
abgeschlossen sein kann. Und zwar immer dann wenn ein Wert ins U1TXBUF 
Register geschrieben wirdm wird gleichzeitig das URXIFG1 Flag gesetzt. 
Wie kommt das ? Bin absolut ratlos :(

Anbei mein SPI-Code:


Das Beschreiben des Registers mit dem Wert 0x04 (U1TXBUF = 0x04; ) mit 
der Funktion :
1
//------------------------------------------------------------------
2
// Write FRAM Status Register
3
//------------------------------------------------------------------
4
5
unsigned char WriteStatus(unsigned char CS) {
6
  unsigned long int j;
7
  IFG2 &=~ URXIFG1;           // Clear  receive flag
8
9
  P5OUT &= ~CS;               // 0100 0000 // Enable Ramtron by enabling /CS
10
  for (j = 2; j>0; j--);      // Delay XXX *
11
12
  U1TXBUF = FM_WREN;          // WREN op-  code
13
  while (!(IFG2 & URXIFG1));  // Wait for previous byte to  be transferred
14
  IFG2 &=~ URXIFG1;           // Clear receive flag
15
16
  P5OUT |= CS;                // 0100 0000 // Disable Ramtron by enabling /CS
17
  for (j = 200; j>0; j--);      // Delay XXX *
18
19
  P5OUT &= ~CS;               // 0100 0000 // Enable Ramtron by  enabling /CS
20
  for (j = 2; j>0; j--); // Delay XXX *
21
22
  U1TXBUF = FM_WRSR;          // Write op-code
23
  while (!(IFG2 & URXIFG1));  // Wait for previous byte to be transferred
24
  IFG2 &=~ URXIFG1;           // Clear receive flag
25
26
  U1TXBUF = 0x04;             // BP0 ->  set  ( 0b00000100 )
27
  while (!(IFG2 & URXIFG1));  // Wait for previous byte to be transferred
28
  IFG2 &=~ URXIFG1;           // Clear receive flag
29
30
  P5OUT |= CS;                // 0100 0000 // Disable Ramtron by enabling /CS
31
  
32
  
33
}

funktioniert auch.

denn beim Auslesen mit :
1
//------------------------------------------------------------------
2
// Read FRAM Status Register
3
//------------------------------------------------------------------
4
5
unsigned char ReadStatus(unsigned char CS) {
6
  unsigned long int j;
7
  unsigned char data;
8
  IFG2 &=~ URXIFG1;             // Clear receive flag
9
10
  P5OUT &= ~CS;                // 0100 0000 // Enable Ramtron by enabling /CS
11
  for (j = 2; j>0; j--);      // Delay XXX * 15us?
12
13
  U1TXBUF = FM_RDSR;           // Read memory data op-code
14
  while (!(IFG2 & URXIFG1));   // Wait for previous byte to be transferred
15
  IFG2 &=~ URXIFG1;            // Clear receive flag
16
17
  U1TXBUF = 0x00;              // Send Data
18
  while (!(IFG2 & URXIFG1));   // Wait for previous byte to be transferred
19
  //IFG2 &=~ URXIFG1;            // Clear receive flag
20
  data = U1RXBUF;              // data
21
22
  P5OUT |= CS;                 // 0100 0000 // Disable Ramtron by enabling /CS
23
 
24
  return data;
25
}

sieht man auf dem OSZI, dass auf der MISO Leitung eben diese 0x04 
ausgegeben werden.

Das Problem bei der Sache ist, dass diese 0x04 jedoch nicht im U1RXBUF 
Register stehen, sonder eine 0x01.

Initialisiert wird die UART mit :
1
void init_spi(void) {  
2
  UCTL1 |= SWRST;
3
  ME1 |= USPIE0;                        // Enable USART0 SPI mode
4
  ME2 |= USPIE1;                        // Enable USART1 SPI mode
5
  UTCTL0 = CKPH+CKPL+SSEL1+SSEL0+STC;   // SMCLK, SPI Mode 3 !!! 3-pin mode
6
  UTCTL1 = CKPH+CKPL+SSEL1+SSEL0+STC;   // SMCLK, SPI mode 3 !!! 3-pin mode 
7
  UCTL0 = CHAR+SYNC+MM;                 // 8-bit SPI Master **SWRST**
8
  UCTL1 = CHAR+SYNC+MM;                 // 8-bit SPI Master **SWRST**
9
  UBR00 = 0x02;                         // UCLK/2 
10
  UBR10 = 0x00;                         // 0
11
  UBR01 = 0x02;                         // UCLK/2 
12
  UBR11 = 0x00;                         // 0
13
  UMCTL0 = 0x00;                        // no modulation
14
15
  UCTL1 &= ~SWRST;
16
  _EINT();                              // Enable interrupts
17
}
Vielen Dank

Rex

von Stefan (Gast)


Lesenswert?

Hab das DB vom FM25CL64 nur kurz überflogen...
Möglicherweise stimmt das SPI-Timing nicht (Clock polarity and phase).
Ich würde CKPH=1 und CKPL=0 wählen...?!

von Rex Gildo jr. (Gast)


Lesenswert?

Moin!

Danke Stefan, das wars :)

Gruß

Rex

von Rex Gildo jr. (Gast)


Lesenswert?

Nachtrag :

Es funktioniert zwar ,aber im Datenblatt des FRAM ist doch von SPI MODE 
0 und 3 die rede ?

CKPH=1 und CKPL=0 sind aber doch SPI Mode 1.

Merkwürdig ?!

von Stefan (Gast)


Lesenswert?

Ich hab mir ehrlich gesagt noch Gedanken über die Benennung/Benummerung 
der SPI-Modes gemacht...
Guckst Du unter:
http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus

Zitat:
Some products use different naming conventions. For example, the TI 
MSP430 uses the name UCCKPL instead of CPOL, and its UCCKPH is the 
inverse of CPHA. When connecting two chips together, carefully examine 
the clock phase initialization values to be sure of using the right 
settings.

von Stefan (Gast)


Lesenswert?

Ich hab mir ehrlich gesagt noch nie Gedanken über die 
Benennung/Benummerung der SPI-Modes gemacht...
Guckst Du unter:
http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus

Zitat:
Some products use different naming conventions. For example, the TI 
MSP430 uses the name UCCKPL instead of CPOL, and its UCCKPH is the 
inverse of CPHA. When connecting two chips together, carefully examine 
the clock phase initialization values to be sure of using the right 
settings.

von Rex Gildo jr. (Gast)


Lesenswert?

Moin!

@ Stefan

Ah alles klar, damit ist es logisch. Ein kleiner aber feiner 
Unterschied.


Nochmals besten Dank :)

Gruß

Rex

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.