www.mikrocontroller.net

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


Autor: Rex Gildo jr. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :

//------------------------------------------------------------------
// Write FRAM Status Register
//------------------------------------------------------------------

unsigned char WriteStatus(unsigned char CS) {
  unsigned long int j;
  IFG2 &=~ URXIFG1;           // Clear  receive flag

  P5OUT &= ~CS;               // 0100 0000 // Enable Ramtron by enabling /CS
  for (j = 2; j>0; j--);      // Delay XXX *

  U1TXBUF = FM_WREN;          // WREN op-  code
  while (!(IFG2 & URXIFG1));  // Wait for previous byte to  be transferred
  IFG2 &=~ URXIFG1;           // Clear receive flag

  P5OUT |= CS;                // 0100 0000 // Disable Ramtron by enabling /CS
  for (j = 200; j>0; j--);      // Delay XXX *

  P5OUT &= ~CS;               // 0100 0000 // Enable Ramtron by  enabling /CS
  for (j = 2; j>0; j--); // Delay XXX *

  U1TXBUF = FM_WRSR;          // Write op-code
  while (!(IFG2 & URXIFG1));  // Wait for previous byte to be transferred
  IFG2 &=~ URXIFG1;           // Clear receive flag

  U1TXBUF = 0x04;             // BP0 ->  set  ( 0b00000100 )
  while (!(IFG2 & URXIFG1));  // Wait for previous byte to be transferred
  IFG2 &=~ URXIFG1;           // Clear receive flag

  P5OUT |= CS;                // 0100 0000 // Disable Ramtron by enabling /CS
  
  
}


funktioniert auch.

denn beim Auslesen mit :
//------------------------------------------------------------------
// Read FRAM Status Register
//------------------------------------------------------------------

unsigned char ReadStatus(unsigned char CS) {
  unsigned long int j;
  unsigned char data;
  IFG2 &=~ URXIFG1;             // Clear receive flag

  P5OUT &= ~CS;                // 0100 0000 // Enable Ramtron by enabling /CS
  for (j = 2; j>0; j--);      // Delay XXX * 15us?

  U1TXBUF = FM_RDSR;           // Read memory data op-code
  while (!(IFG2 & URXIFG1));   // Wait for previous byte to be transferred
  IFG2 &=~ URXIFG1;            // Clear receive flag

  U1TXBUF = 0x00;              // Send Data
  while (!(IFG2 & URXIFG1));   // Wait for previous byte to be transferred
  //IFG2 &=~ URXIFG1;            // Clear receive flag
  data = U1RXBUF;              // data

  P5OUT |= CS;                 // 0100 0000 // Disable Ramtron by enabling /CS
 
  return data;
}


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 :

void init_spi(void) {  
  UCTL1 |= SWRST;
  ME1 |= USPIE0;                        // Enable USART0 SPI mode
  ME2 |= USPIE1;                        // Enable USART1 SPI mode
  UTCTL0 = CKPH+CKPL+SSEL1+SSEL0+STC;   // SMCLK, SPI Mode 3 !!! 3-pin mode
  UTCTL1 = CKPH+CKPL+SSEL1+SSEL0+STC;   // SMCLK, SPI mode 3 !!! 3-pin mode 
  UCTL0 = CHAR+SYNC+MM;                 // 8-bit SPI Master **SWRST**
  UCTL1 = CHAR+SYNC+MM;                 // 8-bit SPI Master **SWRST**
  UBR00 = 0x02;                         // UCLK/2 
  UBR10 = 0x00;                         // 0
  UBR01 = 0x02;                         // UCLK/2 
  UBR11 = 0x00;                         // 0
  UMCTL0 = 0x00;                        // no modulation

  UCTL1 &= ~SWRST;
  _EINT();                              // Enable interrupts
}

Vielen Dank

Rex

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...?!

Autor: Rex Gildo jr. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin!

Danke Stefan, das wars :)

Gruß

Rex

Autor: Rex Gildo jr. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?!

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rex Gildo jr. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin!

@ Stefan

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


Nochmals besten Dank :)

Gruß

Rex

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.