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.
|