mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SPI Read mit MSP430 (nRF24L01 Funkmodul)


Autor: Fabian Braun (fabbraun)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo miteinander,

Ich habe ein Funkmodul (Olimex MOD-NRF24L mit Nordic Semiconductor 
nRF24L01 Chip), welches ich mit dem MSP430F449 über SPI (polling mode) 
ansteuere.

Folgendes Problem besteht jedoch noch:
Wenn ich per SPI ein Byte einlese, so ist dieses immer um 1 Bit 
verschoben.
Das letzte Bit (LSB) scheint immer unterzugehen, obwohl es korrekt 
übertragen wird.

Ich habe die Kommunikation sowohl mittels Logic Analyzer und dem KO 
überprüft. Der MSP430 und auch der nRF24L01 scheinen die Daten 
einwandfrei zu senden. (siehe Screenshots)

Schreiben über SPI mit dem MSP430 ist kein Problem:
Ich kann die Register des nRF24L01 beschreiben und anschliessend wieder 
auslesen. Die Daten stimmen (zumindest vom Interpreter des Logic 
Analyzers) überein. Das jeweilige Datenbyte im Empfangsbuffer des MSP430 
ist jedoch immer um dieses eine Bit nach rechts geschoben mit einem 
vorangehenden 0.
Ja sogar die Funkschnittstelle habe ich (mit ein paar Umwegen) 
unidirektional zum laufen gebracht!

Ich glaube mir scheint irgendwo ein gravierender Fehler in der 
Konfiguration oder in der Implementation der SPI-routine unterlaufen zu 
sein, aber welcher?
Für mich sieht es so aus, als ob ich den Receive-Buffer auslese, bevor 
das letzte bit "hinein-geshiftet" wurde. aber ich prüfe doch alle flags, 
sodass dies nicht der fall sein wird?

Ich habe heute schon einige Stunden verzweifelt danach gesucht. Ich 
vermute jedoch schwer, dass jemand von euch das Problem auch schon 
hatte.

Meine SPI-Routine sieht wie folgt aus:
unsigned char SPI_WriteByte(unsigned char dataByte) {
  #if NRF24L_SPI_NUMBER == 0
      
      
    while(!(IFG1&UTXIFG0))    //wait for transmission buffer to be empty
      ;;    

    IFG1 &=~URXIFG0;      //URXIFGx is automatically reset if the pending interrupt is served or when UxRXBUF is read.

    U0TXBUF = dataByte;          //fill buffer with desired data
    
    while(!(IFG1&URXIFG0))    //wait for reception to be completed
      ;;    
    while(!(TXEPT&U0TCTL))    //wait for reception to be completed
      ;;    
    
    dataByte = U0RXBUF;
    return dataByte;
    
  #else
    return 0;
  #endif
}

Und die Initialisierungsroutine so:
void NRF24L_Init(void) {
  //Initialize all I/O Ports
  #if NRF24L_SPI_NUMBER == 0    
    
    U0CTL = 0;
//    U0CTL &= ~I2C;  //SPI mode
    U0CTL |= CHAR;  //8-bit data
    U0CTL |= SYNC;  //synchronous mode (SPI)
    U0CTL |= MM;  //master mode (SPI)
    
    U0TCTL = 0;
    U0TCTL |= CKPH; 
    U0TCTL &= ~CKPL;   //data valid on rising edge 
    U0TCTL |= SSEL1 | SSEL0;    //SMCLK (valid for master mode only)
    U0TCTL |= STC;    //3-pin SPI mode: STE disabled.  
    
    U0BR1 = (CPU_SMCLK / NRF24L_SPI_BAUDRATE) >> 8;    //set baudrate
    U0BR0 = (CPU_SMCLK / NRF24L_SPI_BAUDRATE) & 0x00FF;
    U0MCTL = 0;      //modulator - for SPI mode and is recommended to be set to 000h    

    ME1 |= USPIE0;    //enable SPI module
    
    P3DIR |= BIT1;      //SIMO    
    P3SEL |= BIT1;
    P3DIR &= ~BIT2;      //SOMI  
    P3SEL |= BIT2;
    P3DIR |= BIT3;      //UCLK    
    P3SEL |= BIT3;  
  #else
    #error "Only SPI0 implemented for now!"
  #endif
  
  //IRQ signal
  NRF24L_IRQ_PDIR &= ~NRF24L_IRQ_BIT;
  P2IES |= NRF24L_IRQ_BIT;  //... on falling edge
  P2IFG &= ~NRF24L_IRQ_BIT;    //pre-clear flag
  P2IE |= NRF24L_IRQ_BIT;    //enable interrupt for IRQ pin
  
  //Chip enable signal
  NRF24L_CE_PDIR |= NRF24L_CE_BIT;
  NRF24L_CE_POUT &= ~NRF24L_CE_BIT;
  
  //Chip select signal
  NRF24L_CSN_PDIR |= NRF24L_CSN_BIT;
  NRF24L_CSN_POUT |= NRF24L_CSN_BIT;
  
  
  /* DEBUG STUFF START */
  //NRF24L_ISR();
  
  
  /* DEBUG STUFF END */
  
}


Beste Dank für eure Hilfe!
Grüsse aus der Schweiz
Fabian

Autor: Fabian Braun (fabbraun)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
anbei noch die werte, die der prozessor einliest.
das array test[index 0-2] sollte die SPI werte {0xE0, 0x11, 0x0A} 
enthalten, aber es sind genau diese bytes einfach bitweise um eins nach 
rechts geschoben.
why that?

Autor: Peter Diener (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

man kann beim MSP430 einstellen, ob die Daten als Slave SPI bei 
fallender oder steigender Flanke des Clock-Signals übernommen werden. 
Wenn du das falsch eingestellt hast, gibt es deinen Fehler.

Ließ dir dazu am besten den User Guide durch, da steht das drin.

Viele Grüße,

Peter

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>man kann beim MSP430 einstellen, ob die Daten als Slave SPI bei
>fallender oder steigender Flanke des Clock-Signals übernommen werden.
Das wäre dann CKPL (clock polarity).
Ich tippe jedoch eher auf eine falsche Clock Phase (CKPH), siehe 
Diagramm im User-Guide!

Autor: Fabian Braun (fabbraun)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hallo peter, hallo dieter

entweder ich habe mich nicht richtig ausgedrückt, oder ihr habt mein 
problem nicht genau verstanden.

1. mein MSP430 arbeitet als MASTER!!!
2. die clock-polarisation und clock-flanke stimmt (siehe angefügtes 
bild: oben spezifikationen aus datenblatt, mitte logic-analyzer, unten 
MSP430 configuration)
3. das SCHREIBEN auf den SPI slave (funkmodul) funktioniert!
4. nur das LESEN funktioniert nicht!!!!!!!

irgendwelche andere vorschläge?

besten dank und grüsse
fabian

Autor: Christian R. (supachris)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Warum beachtest du nicht die fett gedruckten Sachen im User Guide? Die 
USART kann alle möglichen lustigen Sachen machen, wenn man während der 
Intitialisierung das SWRST Bit nicht gesetzt hat....

Autor: Fabian Braun (fabbraun)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Christian
Hmm...das ist mir wohl entgangen. Shame on me!!!!
echt peinlich:-( das waren wohl ein paar arbeiststunden zuviel und ich 
hatte keinen klaren durchblick mehr!

das wird ziemlich sicher die fehlerquelle sein.
ich werde es am montag sofort überprüfen.

ich danke für die hilfe!
grüsse fabian

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>1. mein MSP430 arbeitet als MASTER!!!
Die Einstellungen für CKPH und CKPL gelten auch für den Master!

>2. die clock-polarisation und clock-flanke stimmt
Da wäre ich mir eben nicht so sicher!

>3. das SCHREIBEN auf den SPI slave (funkmodul) funktioniert!
glaub ich Dir ;-)

>4. nur das LESEN funktioniert nicht!!!!!!!
Nach meinem Verständnis des User-Guides bedeutet ein gesetztes UKPH-bit, 
dass mit der ersten CLK-Flanke Daten gelesen werden und danach mit 
der zweiten Flanke Daten geschrieben/gesendet werden. (Ich meine damit 
jeweils die steigende und fallende Flanke einer CLK-Periode).
Mein Verständnis ist aber auch so, dass der Master erst was sendet und 
dann was empfangen kann.
D.h. mit der ersten Flanke will Dein MSP ein Bit reinlesen, obwohl noch 
gar keins da ist (daher liest er eine '0'). Jetzt "rutscht" sozusagen 
Dein ganzes Timing um ein Bit nach hinten, wodurch das letzte Bit nicht 
mehr gelesen werden kann, weil für den MSP das Timing schon zu Ende 
ist... das ist jedenfalls meine Vermutung!

Autor: Fabian Braun (fabbraun)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Intitialisierung mit gesetzten SWRST Bit wirkt wunder!

Ich danke euch für eure inputs und entschuldige die unannehmlichkeiten.

merci und gruss
fabian

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.