Also wie gewünscht stelle ich meine Erkenntnisse mit den Modulen RFM01 und RFM02 zur Verfügung. Die Beschaltung ist den Beiden Bildern "Sender" und "Empfänger" zu entnehmen. Zum C-Code: Sender: Zur Initialisierung werden folgende Befehle per SPI zum Modul gesendet: ------------------------------------------------------------------------ --- // Funkmodul Initialisieren void RFM02_INIT(void) { spi_init(0xCC,0x00); // Statur Register Read Command spi_init(0x8B,0x81); // Configuration Setting Command spi_init(0xA6,0x40); // Frequency Setting Command spi_init(0xC8,0x23); // Data Rate Command spi_init(0xD0,0x40); // Halbe Datenrate spi_init(0xC2,0x20); // Low Battery Detector / TX Bit Sync spi_init(0xC0,0x01); // Power Management Command } ------------------------------------------------------------------------ --- Es stehen immer 2x8Bit in der klammer, da der verwendete µC nur einen SPI Puffer von 8 Bit hat. Dies wird ersichtlich durch die Prozedur "spi_init". ------------------------------------------------------------------------ --- // Prozedur um SPI Init zu schreiben void spi_init(unsigned char txdata, unsigned char txdata2) { unsigned char rxdata; LATCbits.LATC6=0; // Chipselect auf "0" Delay10TCYx(1); rxdata = SSPBUF; // Puffer und BF Bit wird gelöscht SSPBUF = txdata; // Puffer wird mit Daten geladen while(!SSPSTATbits.BF) {} // Warten bis Übertragung komplett rxdata = SSPBUF; SSPBUF = txdata2; while(!SSPSTATbits.BF) {} rxdata = SSPBUF; Delay10TCYx(1); LATCbits.LATC6=1; // Chipselect auf "1" } ------------------------------------------------------------------------ --- Zum senden von daten werden folgende Befehle zum Modul gesendet: ------------------------------------------------------------------------ --- if(Rot) { spi_init(0xC0,0x39); // Start der Datenübertragung send(0xAA); // Preambel send(0xAA); // Preambel send(0xAA); // Preambel send(0x2D); // Syncwort send(0xD4); // Syncwort send(0xFF); // Datenbyte send(0x00); // Datenbyte send(0xAA); // Schlusswort Delay10TCYx(20); // kurze Pause spi_init(0xC0,0x01); // Datenübertragung beenden } ------------------------------------------------------------------------ --- Bei mir werden diese Befehle jedesmal gesendet, wenn die Taste "Rot" gedrückt wird. Es werden nur 2x8 Bit übertragen. Jedoch können belibig viele Daten übertragen werden. Zu beachten ist nur, dass der Empfänger einen Puffer von 16 Bit hat, sodass die Daten schnell genug abgehölt werden müssen. Die "send" Routine sieht folgendermassen aus: ------------------------------------------------------------------------ --- // Prozedur um Daten über FSK zu senden void send(char data) { int i; for (i=0; i<8; i++) { while (!NIRQ) {}; while (NIRQ) {}; if(data&0x80) {FSK=1;} else {FSK=0;} data=data<<1; } } ------------------------------------------------------------------------ --- Hierbei wird zunächst gewartet, bis NIRQ auf "1" geht. Danach wird so lange gewartet, bis NIRQ wieder auf "0" geht um das erste Datenbit an FSK anzulegen. Dies wird widerholt, bis das Byte komplett ist. Kommen wir nun zum Empfänger: Der Empfänger wird wie folgt Initialisiert: ------------------------------------------------------------------------ --- // Funkmodul initialisieren void RFM01_INIT(void) { spi_init(0x00,0x00); spi_init(0x89,0x8A); // 134kHz spi_init(0xA6,0x40); // 434 MHz spi_init(0xC8,0x47); // 4,8kbps spi_init(0xC6,0x9B); // AFC setting spi_init(0xC4,0x2A); // Clock recovery manual control, // Digital filter, DQD=4 spi_init(0xCE,0xF4); // use FIFO spi_init(0xCE,0xF7); spi_init(0xC0,0x81); } ------------------------------------------------------------------------ --- Hierbei wird das Empfängermodul so eingestellt, dass es na 8 empfangenen Bits den NIRQ Pin auf low zieht. Die "spi_init" Routine ist die selbe wie beim Sender. Auslesen der Daten: ------------------------------------------------------------------------ --- while (!NIRQ) { read(); spi_init(0xCE, 0xF4); // FIFO sync word spi_init(0xCE, 0xF7); // FIFO fill und enable } ------------------------------------------------------------------------ --- Sobald NIRQ auf "0" geht stehen Daten bereit die abgeholt werden können. Dies geschieht über die "read" Prozedur. ------------------------------------------------------------------------ --- // Daten von RF-Modul einlesen (8Bit) void read(void) { data=0; LATBbits.LATB6=0; // SCK RF-Empfänger PORTBbits.RB4=0; // SDI RF-Empfänger LATCbits.LATC6=0; // Chip Select RF-Empfänger for(i=0;i<16;i++) // skip status bits { LATBbits.LATB6=1; // SCK RF-Empfänger Delay1TCY(); // Pause 1 µC Zyclus Delay1TCY(); // Pause 1 µC Zyclus LATBbits.LATB6=0; // SCK RF-Empfänger Delay1TCY(); // Pause 1 µC Zyclus } for(i=0;i<8;i++) // read fifo data byte { data=data<<1; if(PORTBbits.RB4) // Speichern der Daten in "data" { data|=1; } LATBbits.LATB6=1; // SCK RF-Empfänger Delay1TCY(); // Pause 1 µC Zyclus Delay1TCY(); // Pause 1 µC Zyclus LATBbits.LATB6=0; // SCK RF-Empfänger Delay1TCY(); // Pause 1 µC Zyclus Delay1TCY(); // Pause 1 µC Zyclus } LATCbits.LATC6=1; // SCK RF-Empfänger } ------------------------------------------------------------------------ --- Danach ist das empfangene Byte in "data" gespeichert. Ich hoffe das hilft um die Module in Betrieb zu nehmen. Viel Erfolg!
:
Verschoben durch User
Mir ist gerade noch ein Fehler im Bild "Sender" aufgefallen. "NIRQ" ist mit Pin 13 und "FSK" mit Pin 12 des µC verbunden.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.