Forum: Mikrocontroller und Digitale Elektronik CC2500 Funkmodul empfängt nur das erste byte korrekt


von C. H. (hedie)


Lesenswert?

Guten Abend

Ich habe hier ein CC2500 Funkmodul welches an einem Atmega48 hängt.

Die Kommunikation funktioniert grundsätzlich.
Jedoch nur mit dem ersten Byte...



Ich würde mich sehr freuen, wenn jemand was auffäliges sieht oder sonst 
eine ideee hat...

Die bytes, welche nach dem erfolgreich empfangenen kommen, mehr oder 
weniger zufällig... siehe unten:

Hier ein Empfang: (es sollte von 1..50 empfangen werden)

Data: {0x01,0x08,0x09,0x0A,0x0C,0x0E,0x0F,0x10,0x12,0x14,
0x15,0x16,0x18,0x1A,0x1B,0x1D,0x1E,0x20,0x21,0x23,0x24,
0x26,0x27,0x29,0x2A,0x2C,0x2D,0x2F,0x30,0x32,0x7F,0xFD,
0xDB,0x62,0xDF,0x9F,0x51,0x69,0xBF,0xFD,0xFF,0xDB,0xBF,
0xFF,0xCE,0x1E,0xFF,0xEE,0xBA,0x6E};

Ein weiterer Empfang:

Data: {0x01,0x07,0x09,0x0A,0x0C,0x0D,0x0F,0x10,0x12,0x13,
0x15,0x16,0x18,0x19,0x1B,0x1C,0x1E,0x1F,0x21,0x22,0x24,
0x26,0x27,0x28,0x2A,0x2C,0x2D,0x2E,0x30,0x32,0x3F,0xFF,
0xFF,0xFC,0xA8,0xA7,0xE2,0xD7,0xB6,0xF9,0xE0,0xAF,0x4A,
0xFF,0x5B,0x75,0xDD,0x69,0xFC,0x1C};


Danke schonmal :)


Hier wie ich sende mit pseudocode:


Ich schreibe 0x10 ins FREND0 Register (DB Seite 79)
Ich leere den TXFIFO mit dem Burstbefehl SFTX
warte 10ms
Ich schreibe mit einem kontinuierlichen Schreibzugirff in den TXFIFO
warte 10ms
Ich aktiviere das Senden mit STX
warte 10ms
Warte solange bis (TXBYTES & 0x7F) auf 0 ist


Hier mein Code
1
//-------------------------------------------------------------------------------------------------------
2
//  void halRfSendPacket(BYTE *txBuffer, UINT8 size)
3
//
4
5
//
6
//  ARGUMENTS:
7
//      BYTE *txBuffer
8
//          Pointer to a buffer containg the data that are going to be transmitted
9
//
10
//      UINT8 size
11
//          The size of the txBuffer
12
//-------------------------------------------------------------------------------------------------------
13
14
void halRfSendPacket(BYTE *txBuffer, UINT8 size)
15
{
16
//  unsigned char i=0Xff;
17
  halSpiStrobe(CC2500_SFTX);  //TX FIFO leeren
18
  _delay_ms(10);
19
  halSpiWriteBurstReg(CC2500_TXFIFO, txBuffer, size); //Daten ins FIFO schreiben
20
  _delay_ms(10);
21
  halSpiStrobe(CC2500_STX);  //Senden
22
  _delay_ms(10);
23
24
25
  while((halSpiReadStatus(CC2500_TXBYTES)&0x7F)!=0x00)
26
  {
27
28
    _delay_us(300);
29
    //if(TCNT0 == 255){ return; }
30
31
  }
32
33
  return ;
34
}// halRfSendPacket*/
35
36
37
38
39
40
41
42
43
//-------------------------------------------------------------------------------------------------------
44
//  BOOL halRfReceivePacket(BYTE *rxBuffer, UINT8 *length)
45
//
46
47
//
48
//  ARGUMENTS:
49
//      BYTE *rxBuffer
50
//          Pointer to the buffer where the incoming data should be stored
51
//      UINT8 *length
52
//          Pointer to a variable containing the size of the buffer where the incoming data should be
53
//          stored. After this function returns, that variable holds the packet length.
54
//
55
//  RETURN VALUE:
56
//      BOOL
57
//          TRUE:   CRC OK
58
//          FALSE:  CRC NOT OK
59
//-------------------------------------------------------------------------------------------------------
60
BYTE halRfReceivePacket(BYTE *rxBuffer, UINT8 length)
61
{
62
    BYTE status=0;
63
    UINT8 packetLength;
64
    unsigned char ucCounter = 0;
65
  status = halSpiReadStatus(CC2500_RXBYTES);  //Anzahl bytes im RX FIFO
66
  uart_puts("Status: ");
67
  uart_send_var(status);
68
  uart_putc('\n');
69
70
  if((status & 0x7F)==0x00)  //ist der RX FIFO leer?
71
  {
72
73
    if(halSpiReadStatus(CC2500_MARCSTATE)!=0x0D) halSpiStrobe(CC2500_SRX);  //Prüfen ob RX im gange ist (0x0D) wenn nicht, starte RX
74
    return 0;                                //kehre aus der Funktion zurück
75
  }
76
77
  ucTimeout = 0;
78
  while((halSpiReadStatus(CC2500_MARCSTATE)&0x1f)!=0x01)            //warte bis der chip im IDLE modus ist. (RX sollte dann abgeschlossen sein)
79
  {
80
81
    _delay_us(100);
82
    ucTimeout++;
83
    if(ucTimeout == 200)  //Timeout
84
    {
85
      //halSpiStrobe(CC2500_SFRX);  //Wenn Timeout eingetreten ist, leere den RX FIFO
86
      return 0;
87
    }
88
89
  }
90
    packetLength = halSpiReadReg(CC2500_RXFIFO);  //Vermutlich wird damit das erste Byte aus dem RX FIFO gelesen.
91
                            // dies ist nach dem benutzten Protokoll die Paketlänge
92
    uart_puts("PaketLange: ");
93
    uart_send_var(packetLength);
94
    uart_putc('\n');
95
96
    uart_puts("Soll-Lange: ");
97
    uart_send_var(length);
98
    uart_putc('\n');
99
100
101
102
      //halSpiStrobe(CC2500_SFRX);
103
104
    if (packetLength == length) {  //Stimmt die Länge mit der erwarteten Länge überrein?
105
      //packetLength = 10;
106
    halSpiReadBurstReg(CC2500_RXFIFO, rxBuffer, packetLength);  // Dann lese den gesamten RX FIFO in den Buffer ein.
107
108
    uart_puts("Data: ");
109
    ucCounter = 0;
110
    uart_putc('{');
111
    while(ucCounter != packetLength)
112
    {
113
      uart_puts("0x");
114
      uart_send_as_hex(rxBuffer[ucCounter]);
115
116
      ucCounter++;
117
      if(ucCounter < packetLength) uart_putc(',');
118
    }
119
    uart_putc('}');
120
    uart_putc(';');
121
    uart_putc('\n');
122
    uart_putc('\n');
123
124
        halSpiStrobe(CC2500_SFRX);  //Löschen den RX FIFO wieder.
125
126
        return 1;//(status & CRC_OK);
127
    } else {
128
    halSpiStrobe(CC2500_SFRX);  //Wenn die erwartete Länge nicht übereinstimmt, wird das Paket verworfen.
129
        return 0;
130
    }
131
}// halRfReceivePacket



Hier noch die Konfig des Modules:
1
   halSpiWriteReg(CC2500_FSCTRL1    ,0x07);
2
   halSpiWriteReg(CC2500_FSCTRL0    ,0x00);
3
   halSpiWriteReg(CC2500_FREQ2      ,0x5D);
4
   halSpiWriteReg(CC2500_FREQ1      ,0x44);
5
   halSpiWriteReg(CC2500_FREQ0      ,0xEC);
6
   halSpiWriteReg(CC2500_MDMCFG4    ,0x2D); //250kBaud
7
   halSpiWriteReg(CC2500_MDMCFG3    ,0x3B); //250kBaud
8
   halSpiWriteReg(CC2500_MDMCFG2    ,0x73); //30/32 SyncByte
9
   halSpiWriteReg(CC2500_MDMCFG1    ,0x23);
10
   halSpiWriteReg(CC2500_MDMCFG0    ,0x3B);
11
   halSpiWriteReg(CC2500_CHANNR     ,0x03);
12
   halSpiWriteReg(CC2500_DEVIATN    ,0x01);
13
   halSpiWriteReg(CC2500_FREND1     ,0xB6);
14
   halSpiWriteReg(CC2500_FREND0     ,0x10);
15
   halSpiWriteReg(CC2500_MCSM0      ,0x18);
16
   halSpiWriteReg(CC2500_FOCCFG     ,0x1D);
17
   halSpiWriteReg(CC2500_BSCFG      ,0x1C);
18
   halSpiWriteReg(CC2500_AGCCTRL2   ,0xC7);
19
   halSpiWriteReg(CC2500_AGCCTRL1   ,0x00);
20
   halSpiWriteReg(CC2500_AGCCTRL0   ,0xB0);
21
   halSpiWriteReg(CC2500_FSCAL3     ,0xEA);
22
   halSpiWriteReg(CC2500_FSCAL2     ,0x0A);
23
   halSpiWriteReg(CC2500_FSCAL1     ,0x00);
24
   halSpiWriteReg(CC2500_FSCAL0     ,0x11);
25
   halSpiWriteReg(CC2500_FSTEST     ,0x59);
26
   halSpiWriteReg(CC2500_TEST2      ,0x88);
27
   halSpiWriteReg(CC2500_TEST1      ,0x31);
28
   halSpiWriteReg(CC2500_TEST0      ,0x0B);
29
   halSpiWriteReg(CC2500_FIFOTHR    ,0x07);
30
   halSpiWriteReg(CC2500_IOCFG2     ,0x29);
31
   halSpiWriteReg(CC2500_IOCFG0     ,0x06);
32
   halSpiWriteReg(CC2500_PKTCTRL1   ,0x04);
33
   halSpiWriteReg(CC2500_PKTCTRL0   ,0x01);  //Variable Paketlänge (erstes byte nach dem syncword gibt länge an)
34
   halSpiWriteReg(CC2500_ADDR       ,0x00);
35
   halSpiWriteReg(CC2500_PKTLEN     ,0xFF);  //Maximale Paketlänge im RX. Wenn LenghtByte grösser ist als PKTLEN dann wird es verworfen.

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.