CC2500 Funkmodul empfängt nur das erste byte korrekt

OP #2615696
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.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.