Mikrocontroller und Digitale Elektronik
›
Thread
CC2500 Funkmodul empfängt nur das erste byte korrekt
CH
C. H.
(hedie)
OP
30.03.2012 18:19
#2615696
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
Bitte melde dich an, um einen Beitrag zu schreiben.
Noch kein Account?
Die Registrierung ist kostenlos und dauert nur eine Minute.
Jetzt registrieren