Sziasztok !
Adott két darab RFM22B transceiver modul és két PIC18F67J50-IPT. Az egyik PIC és RFM22B lenne az adó a másik egység PIC és RFM22B lenne a vevő egység.A frekvencia amivel működne 434MHz lenne.
Le töltöttem az Internetről egy RFM22B SI443x regiszter kalkulátor.
Ahogy szeretném a rendszert használni ,azaz úgynevezett "FIFO mode". A feladat az lenne ,hogy az adó elküldi az "0xAA" üzenetet ,a vevő veszi eszt és egy LED világítana.
Régebben dolgoztam már ezzel a rádió típussal jó pár éve ,de már elfelejtettem ,hogy kell inicializálni . És nem tudom ,hogy jól használom a regiszter kalkulátort.
Amit készítettem saját függvényeket és eljárásokat :
Radio_init() // vevő inicializálás
{
Radio_Write(address,data);
....;
}
Transmitter_init() // adó inicializálás
{
Radio_Write(address,data);
}
Ezek a gyakorlatban :
// Az adó forráskódjában
unsigned short SPI_Transfer(unsigned short DataOut) // SPI kommunikáció ez jó
{
unsigned short DataIn;
unsigned short i = 0;
for( i = 0; i < 8; i++)
{
if(DataOut & 0x80) LATE.RE3 = 1; else LATE.RE3 = 0; // Data Out SPI_SDO from controler
DataOut <<= 1;
LATE.RE4 = 1; // SPI_SCLK
DataIn <<= 1;
if(PORTE.RE2 == 1) DataIn |= 0x01; // SPI_SDI to controller
LATE.RE4 = 0;
}
return DataIn;
}
unsigned short Radio_Read(unsigned short cim_R ) // RFM regiszter kiolvasás ez jó
{
unsigned short regiszter;
//PORTA.RA2 = 1 ;
//PORTC.RC1 = 1;
Delay_ms(1);
LATE.RE5 = 0; // Csak RF_CS engedélyezve
Delay_ms(1);
SPI_Transfer(cim_R);
regiszter = SPI_Transfer(0);
Delay_ms(1);
LATE.RE5 = 1;
Delay_ms(1);
return regiszter ;
}
void Radio_Write( unsigned short cim ,unsigned short adat) // RFM regiszter beállítás ez jó
{
unsigned short cim_W;
cim_W = cim | 0x80 ;
//PORTA.RA2 = 1 ;
//PORTC.RC1 = 1;
Delay_ms(1);
LATE.RE5 = 0 ; // Az RF_CS funkció lába csak engedélyezve
Delay_ms(1);
SPI_Transfer(cim_W );
SPI_Transfer(adat);
Delay_ms(1);
LATE.RE5 = 1 ;
Delay_ms(1);
}
void Transmitter_init() // nem tudom ,hogy jók-e a benne lévő beállítások
{ // TRANSMITTER MODE
Radio_Write(0x6E , 0x19);
Radio_Write(0x6F , 0x9A);
Radio_Write(0x70 , 0x04);
Radio_Write(0x71 , 0x23);
Radio_Write(0x72 , 0x50);
Radio_Write(0x75 , 0x77);
Radio_Write(0x76 , 0x89);
Radio_Write(0x77 , 0x80);
}
//*********************Most a vevő oldal következik***************************
void Radio_init()
{ // RECEIVE MODE nem tudom ,hogy jók-e a benne lévő beállítások
Radio_Write(0x05,0x02); // enable valid packet received ,RX FIFO almost full
Radio_Write(0x06,0x00); // valid preamble detect ,syncronize word (words)
Radio_Write(0x09,0x7F); // cap 12,5pF
Radio_Write(0x0F,0x70); // Az ADC konverete nincs használva
Radio_Write(0x10,0x00); // Az ADC nincs használva
Radio_Write(0x12,0x00); // A hőmérséklet érzékelő szenzor nincs használva
Radio_Write(0x13,0x00); // A hőérzékelő szenzor nincs hasdználva
Radio_Write(0x70,0x24); // Manchester kodolás : nincs
Radio_write(0x1C,0x1E); // KF szűrő sávszélessége
Radio_Write(0x1D,0x44); // AFC hurok
Radio_Write(0x1E,0x0A); // AFC késleltetés
Radio_Write(0x1F,0x03);
Radio_Write(0x20,0xD0); // Az órajel helyreállítása
Radio_Write(0x21,0x00);
Radio_Write(0x22,0x9D);
Radio_write(0x23,0x49);
Radio_Write(0x24,0x00); // Az órajel visszaállításának időzítése
Radio_Write(0x25,0x45); // Az órajel visszaállításának időzítése
Radio_Write(0x2A ,0x20); // AFC limiter értéke
Radio_Write(0x30,0x81); //Data access control
Radio_Write(0x32,0x00); //Header control
Radio_Write(0x33,0x0A); // header 3 , 2 , 1 , 0 is used for head length ,fixed packed length ,
// syncronize word length , 3 , 2
Radio_Write(0x34,0x0A); // 64 nibble = 32 preamble
Radio_Write(0x35,0x2A); // 0x35 need to detect 20 bit preamble
Radio_Write(0x36,0x2D); // A szavak szinkronizálása
Radio_Write(0x37,0xD4);
Radio_Write(0x38,0x00);
Radio_Write(0x39,0x00);
Radio_Write(0x69,0x60);
// Tx power to max ?
Radio_Write(0x79,0x00); // No frequency hopping
Radio_Write(0x7A,0x00); // No frequency hopping
Radio_Write(0x71,0x22); // GFSK no invert for Tx/Rx FIFO mode //
Radio_Write(0x72,0x48); //Frequency deviation 45KHz
Radio_Write(0x75,0x53); // a frekvencia beállítva 434 MHz-re
Radio_Write(0x76,0x64); // a frekvencia beállítva 434 MHz-re
Radio_Write(0x77,0x00); // a frekvencia beállítva 434 MHZ-re
}
// A többi függvény és eljárás ugyan az mint az adó oldalon
A radio_Write(address,data); // Ezzel tudom beírni a regisztereket az RFM modulban.
A Radio_Read(address) // Ezzel tudok visszaolvasni egy adott regisztertAz SPI busz-on.
***********************Ami nem működik***************************
Arra kérnék segítséget ,hogy milyen address ,data beállításokat kell csinálnom ,mint az adó mint a vevő oldalon ahhoz ,hogy amikor az adó elküldi az 0xAA kódot, a vevő veszi a 0xAA kódot és jelzi. Előre is köszönöm a segítséget mindenkinek !
Üdv : Lengyel József
Hali!
Itt találsz példakódot a Si4432-höz:
https://www.silabs.com/documents/public/example-code/AN415_EZRadioPRO_Sa...
Mind az RX_operation, mind a TX_operation FIFO-t használ. Elég sok komment van benne, láthatod, hogy melyik regisztereket kell írni.
imrus101
0
Szia imrus101 !
Nagyon szépen köszönöm,és bocsánat ,hogy késve válaszolok ! Próbálkoztam eddig vele a rádió modullal ,megnézem a példákat amelyeket csatoltál és referálok mire jutottam .Pár éve ezelőtt dolgoztam ezzel de már elfelejtettem ,hogyan volt. A projektet meg oda adtam az ügyfélnek és nagy hiba ,hogy nem maradt másolatom.
Köszönöm szépen és referálok !
Üdv : Lengyel József
0