Probleme beim Einlesen über SPI (MSP430F1611)

Gast #1519946
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
Gast #1520101
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.
Gast #1520102
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.

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.