Forum: Mikrocontroller und Digitale Elektronik MSP430 & CC1100 Problem mit RxFIFO


von Gast (Gast)


Lesenswert?

Hallo,

ich habe ein Problem beim empfangen mit dem CC1100 von Chipcon und dem 
MSP430F149.

Was bereits geht:
nach empfang des SyncWords löst mir GDO2 einen Interrupt aus (IOCFG2 
0x06)
nun möchte ich die meine Nutzdaten (2 Bytes nach dem SyncWord), aus dem 
RxFIFO über die SPI Schnittstelle SO auslesen. folgender Code ist in der 
InterruptRoutine drin
1
#pragma vector=PORT2_VECTOR
2
__interrupt void P2_ISR (void) 
3
{
4
   P1OUT &= ~0x02; // /CS enable
5
   U1TXBUF = 0xFF;  // Send address
6
   while (!(IFG2&UTXIFG1));      // Wait for TXBUF ready
7
   U1TXBUF = 0;                  // Dummy write to read 1st data byte
8
// Addr byte is now being TX'ed, with dummy byte to follow immediately 
9
// after
10
   while (!(IFG2&URXIFG1));      // Wait for end of addr byte TX
11
        IFG2 &= ~URXIFG1;        // Clear flag
12
        while (!(IFG2&URXIFG1)); // Wait for end of 1st data byte TX
13
        
14
   // First data byte now in RXBUF
15
   for (i = 0; i < (len-1); i++)
16
   {
17
    U1TXBUF = 0;           //Initiate next data RX, meanwhile..
18
    rxBuffer[i] = U1RXBUF;         // Store data from last data RX
19
    while (!(IFG2&URXIFG1));       // Wait for end of data RX
20
   }
21
    rxBuffer[len-1] = U1RXBUF      // Store last RX byte in buffer
22
               
23
    U1TXBUF = 0x3A;                         // Send strobe
24
    // Strobe addr is now being TX'ed
25
    IFG2 &= ~URXIFG1;                       // Clear flag
26
    while (!(IFG2&URXIFG1));                // Wait for end of addr TX
27
    
28
    P1OUT |= 0x02;// /CS disable
29
}

Den Code habe ich aus einem Beispiel von TI.
Die Daten, welche jetzt auf dem SO Pin ausgegeben werden, sind alles 
andere als jene, welche ich sende. Was da ausgegeben wird ist rein 
zufällig.

Kennt sich jemand mit dem Modul aus und hat schon mal eine 
Empfangssoftware geschrieben?

Dank Euch und Gruß

von Stefan (Gast)


Lesenswert?

Hallo,

ich arbeite mit einem CC2500 und einem CC1101, ich empfehle dir die 
MSP430-CC1100 Interface Bibliotheken von der TI-Homepage. Einfach den 
Suchbegriff "slaa325" eingeben, da kannst du dir die Sachen runterladen. 
Das hat den Vorteil, das vieles von deinem gezeigten Programmcode 
entfällt. Bei mir löst GDO0=0x06 ebenfalls einen Interrupt aus, 
allerdings auf der fallenden Flanke, wenn das Paket empfangen wurde. 
Erst dann macht es Sinn, dieses Paket aus dem RX-FIFO zu lesen.
Meine ISR sieht folgendermaßen aus:
1
#pragma vector=PORT1_VECTOR
2
__interrupt void port1_ISR (void)
3
4
{
5
  if((GDO_PxIFG & GDO0_PIN) && (GDO_PxIE & GDO0_PIN))
6
  {
7
    LED(GREEN,ON);
8
    char length = 64;
9
10
    if(RFReceivePacket(rxBuffer, &length));
11
12
    {
13
      if(!(strncmp(rxBuffer, ser_nr, 64)))
14
        {
15
          LED(GREEN,OFF);
16
        }
17
18
  }
19
20
  GDO0_FLAG;
21
}

Das Abholen des Paketes aus dem FIFO übernimmt die Funktion 
RFReceivePacket. Die erste if-Abfrage wird wahr, wenn der CRC ok ist, 
andernfalls wird das Paket verworfen und der FIFO gelöscht. Diese 
Funktion ist in der Bibliothek enthalten. Die zweite if-Abfrage 
vergleicht eigentlich nur den Inhalt des FIFO's mit einer von mir vorher 
gespeicherten Variablen ser_nr auf Gleichheit. Nicht zu vergessen, das 
das Flag, welches den Interrupt ausgelöst hat, wieder zu löschen.
Dieses Beispiel funktioniert aber nur für Pakete <64 Byte.

von Stefan (Gast)


Lesenswert?

Sorry, in meiner ISR fehlt noch eine geschweifte "}" -Klammer

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.