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