Hallo an alle
Wer hätte es gedacht, auch ich habe Probleme eine Funkstrecke mit den
Modulen RFM01 und RFM02 aufzubauen. Mir ist bewusst, dass das Thema hier
schon mehr als oft behandelt wurde. Ich habe auch so ziemlich alle
Beiträge dazu gelesen aber komme einfach nicht weiter. Der Empfänger
will einfach nichts empfangen. Dass er defekt ist schliesse ich aus, da
er wie in der Datei "RFM01 status read" zu sehen ist, auf den Befehl
Status read reagiert. Die gesamte Initialisierung des Empfängers ist in
Bild "RFM01 init" zu sehen. Der Sender sendet ca. alle 390ms Daten wie
in Bild "RFM02 übermittlung" zu sehen ist. Die gesendeten Daten sind in
Bild " RFM02 data" zu sehen. Die SPI Kommunikation schliesse ich als
Problem aus.
Zum Code.
Sender:
void RFM02_INIT(void) // Funkmodul initialisieren
{
spi_init(0xCC,0x00);
spi_init(0x8B,0x81);
spi_init(0xA6,0x40);
spi_init(0xC8,0x23);
spi_init(0xD0,0x40);
spi_init(0xC2,0x20);
spi_init(0xC0,0x01);
}
// Prozedur um Daten über FSK zu senden
void send(char data)
{
spi_init(0xC0,0x39);
for (i=0; i<8; i++)
{
while (!NIRQ) {};
while (NIRQ) {};
if(data&0x80) {FSK=1;}
else {FSK=0;}
data=data<<1;
}
Delay10TCYx(20);
spi_init(0xC0,0x01);
}
Folgende Daten werden in einem Abstand von ca. 390ms immer wieder
gesendet:
send(0xAA);
send(0xAA);
send(0xAA);
send(0x2D);
send(0xD4);
send(0x69);
send(0xAA);
Empfänger:
void RFM01_INIT(void) // Funkmodul initialisieren
{
spi_init(0x00,0x00); //
spi_init(0x89,0x8A); // 433 Band, 134kHz
spi_init(0xA6,0x40); // 434 MHz
spi_init(0xC8,0x47); // 9,6kbps
spi_init(0xC6,0x9B); // AFC setting
spi_init(0xC4,0x2A); // Clock recovery manual control, Digital
filter, DQD=4
spi_init(0xC2,0x40); // output 1,66MHz
spi_init(0xC0,0x80);
spi_init(0xCE,0x84); // use FIFO
spi_init(0xCE,0x87);
spi_init(0xC0,0x81);
}
Daraufhin bleibt der µC immer in folgender Schleife hängen, da NIRQ
immer high bleibt:
while (!NIRQ)
{
wert=spi_read();
spi_init(0xCE, 0x84); // FIFO sync word
spi_init(0xCE, 0x87); // FIFO fill und enable
}
Der Aufbau benutzt als antenne einen Draht von ca. 17cm. Der Abstand
Sender Empfäner beträgt ca 10cm. Ich denke, dass auf diese Distanz nicht
mal eine Antenne nötig wäre. Ich hoffe jemand kann mir helfen.
Gruss und Dank im vorraus Marc
kannst du mal spi_init und spi_read posten. bist du sicher dass der sender überhaupt was sendet ? das ist normal dass es nicht beim ersten mal klappt. die jungs von Silicon Labs haben schon eigenartige logik...
Hier die Routinen spi_init und spi_read:
// Prozedur um SPI Init zu schreiben
void spi_init(unsigned char txdata, unsigned char txdata2) //
schreiben von Daten
{
unsigned char rxdata;
LATCbits.LATC6=0;
Delay10TCYx(1);
rxdata = SSPBUF; // Puffer und BF Bit wird gelöscht
SSPBUF = txdata; // Puffer wird geladen
while(!SSPSTATbits.BF) {} // Warten bis Übertragung komplett
rxdata = SSPBUF;
SSPBUF = txdata2;
while(!SSPSTATbits.BF) {}
rxdata = SSPBUF;
Delay10TCYx(1);
LATCbits.LATC6=1;
}
// Prozedur um SPI Daten zu lesen
unsigned char spi_read(void) //schreiben und zurückgeben der
empfangenen Daten
{
unsigned char rxdata;
LATCbits.LATC6=0;
Delay10TCYx(1);
rxdata = SSPBUF; // Puffer und BF Bit wird gelöscht
SSPBUF = 0x00; // Puffer wird geladen
while(!SSPSTATbits.BF) {} // Warten bis Übertragung komplett
rxdata = SSPBUF;
SSPBUF = 0x00;
while(!SSPSTATbits.BF) {}
rxdata = SSPBUF;
SSPBUF = 0x00;
while(!SSPSTATbits.BF) {}
rxdata = SSPBUF;
Delay10TCYx(1);
LATCbits.LATC6=1;
return (rxdata); // Empfangene Daten übergeben, BF Bit
löschen
}
Ach ja und ich denke der Sender sendet was, da er den NIRQ Pin toggelt um die zu sendenden Daten zu bekommen.
um mögliche fehlerquellen zu vermeiden mach soft spi(16bit). ich verzichte gänzlich auf nIRQ und warte auf SDO. Empfangen: nSEL auf 0 und warten bis SDO auf 1 geht. Alles Nötige steht auf Seite 16/17. Mussst halt 20 Mal durchlesen...
Das mit dem soft SPI kann ich mir nicht vorstellen aber ich probiers mal aus. Dennoch müsste der NIRQ Pin auf low gehen wenn korrekte Daten empfangen wurden was er aber nicht tut. Auch das FFIT Bit bleibt auf 0. Ich weiss nicht ob das ein Software oder Hardwareproblem ist.
@Marc Köcher Hallo, stell mal am Empfänger die richtige Baudrate ein! 0xC847 == 4.8kBd der Wert muss mit dem des Senders übereinstimmen, solange das cs-Bit bei Empfänger noch nicht 1 wird stimmen die Formeln noch überein. Sascha
Aber die Datenrate ist doch identisch. Beim Sender wird sie so eingestellt: WriteCMD( 0xC823 ); //9.6kbps WriteCMD( 0xD040 ); //half data rate command,for example:if you want to set the data rate to 4.8k, you must confige the command with 9.6K, then add half data rate command,the really data rate will 4.8kbps. Und beim Empfanger so: WriteCMD(0xC847);//4.8kbps
hmm, in den zwei Datenblättern von HopeRF die ich habe, taucht das Kommando 0xD0nn gar nicht auf. Du kannst ja am Sender mal messen, welchen Takt er vorgibt. Sascha
Die Senderoutine ist schon mal falsch. Während der Übertragung müssen die Daten kontinuierlich ohne Unterbrechung an den RFM02 gesendet werden, d.h. keine Pausen zwischen den einzelnen Bytes. Hier ein Beispiel mit der "Halfrate".
hab noch mal das Bild aus dem 1.Post angeschaut, es sind 4.8kBd! Aber wie Holger schon schreibt, die Daten kommen nicht kontinuierlich. Du must den Sender 1x Einschalten (0xC039), dann alle Bytes senden und dann wieder ausschalten (0xC001)! Sascha
JUHUUUUUUUUUUUUUU erfolg dickes dankeschön. Daran lags. Nun empfängt er die Daten.
Kannst du mal deine funktionierende Version von Sender und Emfänger posten? Du würdest bestimmt sehr vielen einen Riesen gefallen tun. Danke im Voraus! LG
Also ich habe einen neuen Thread zum Thema geschrieben, den ihr unter folgendem Link lesen könnt. Beitrag "RFM01 und RFM02"
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.






