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

