// preamble -> FORMATTED -> unit id -> dest id -> data -> csum -> close... // copied from transmitter code void rf_xmit_packet(int8 data) { int8 i; int8 outbytes[8]; int16 crc; outbytes[0] = START_ID; outbytes[1] = TX_ID; outbytes[2] = UNIT_ID; outbytes[3] = RX_ID; outbytes[4] = dest_id; outbytes[5] = data; crc = _CRC16_(outbytes, 6); outbytes[6] = make8(crc,0); outbytes[7] = make8(crc,1); WriteCMD(0x8228); // OPEN PA delay_us(4); WriteCMD(0x8238); delay_us(1); WriteFSKbyte(0xAA); // PREAMBLE WriteFSKbyte(0xAA); WriteFSKbyte(0xAA); WriteFSKbyte(0x2D); // SYNCHRO PATTERN 0x2DD4 WriteFSKbyte(0xD4); for (i=0; i<8; i++) WriteFSKbyte(outbytes[i]); WriteFSKbyte(0xAA); WriteFSKbyte(0xAA); WriteFSKbyte(0xAA); WriteCMD(0x8208); // CLOSE PA }
void rf_SendByte(uchar data) { uchar cmd = 0xB800 | data; WaitReady();//while(RFM12_IRQ==1); WriteCMD(cmd); }
void WriteFSKbyte(int8 DATA) { int8 RGIT = 0; int16 temp = 0xB800; output_float(_SDO); output_low(_SCK); temp|= DATA; Loop: SCK = false; RF_EN = false; output_low(_SDA); SCK = true; RGIT = (SDO==true); //Polling SDO SCK = false; output_high(_SDA); RF_EN = true; if (RGIT==0){ goto Loop; } else { RGIT=false; WriteCMD(temp); } }
/**************************************************************************** * Настройка * ****************************************************************************/ void CursorOrDisplayShift(unsigned char SC,unsigned char RL) { unsigned char temp=16; if(SC) {temp|=(1<<3);} if(RL) {temp|=(1<<2);} WriteCMD(temp, 0); }
/**************************************************************************** * Настройка * ****************************************************************************/ void EntryModeSet(unsigned char ID,unsigned char SH) { unsigned char temp=4; if(ID) {temp|=(1<<1);} if(SH) {temp|=(1<<0);} WriteCMD(temp, 0); }
/**************************************************************************** * Настройка * ****************************************************************************/ void DisplayONOFControlBit(unsigned char D,unsigned char C,unsigned char B) { unsigned char temp=8; if(D) {temp|=(1<<2);} if(C) {temp|=(1<<1);} if(B) {temp|=(1<<0);} WriteCMD(temp, 0); }
/**************************************************************************** * * Настройка * ****************************************************************************/ void FunctionSet(unsigned char DL,unsigned char N,unsigned char F) { unsigned char temp=32; if(DL) { temp|=(1<<4); } if(N) { temp|=(1<<3); } if(F) { temp|=(1<<2); } WriteCMD(temp, 0); }
void init(void) { //osccon = 0x70; // 8Mhz internal OSC cmcon = 0x07; //ansel = 0; // all is digital i/o on PortA option_reg.NOT_RBPU = 0; // enable pullup resistors on PB option_reg.INTEDG = 0; // falling edge interrupt CONF_LED1_OUT(); LED1=0; // setup SPI // outputs RFM12_CS_OUT(); // Module Chip Select HI_SEL(); // RF CS is Active Low so set High SCK_OUT(); // SPI SCK as Output LOW_SCK(); SDO_OUT(); // SPI SDO as Output LOW_SDO(); // inputs RFM12_nIRQ_IN(); // nIRQ SDI_IN(); // SPI SDI delay_ms(500); // Wait for RFM12 POR WriteCMD(0x80F7); // 915 EL, EF, 12.0pf WriteCMD(0xA7D0); // 915=A7D0 904.50MHZ = A258 WriteCMD(0xC623); // c608=38400 c611=19200 c623= 9600bps WriteCMD(0xC22C); // Data Filter: AL, !ML, digital filter, 4 dqd WriteCMD(0xC4F7); // AFC Autotune, -10khz..+7.5Khz, !st, !fi, OE, EN WriteCMD(0x96A0); // P16, VDI, FAST, 65khz, 0dBm, -103dBm WriteCMD(0xCA81); // FIFO8, SYNC, !ff, DR //TX Config //WriteCMD(0x9850); // !mp, 9810=30Khz, MAX out WriteCMD(0xE000); // NOT USE WriteCMD(0xC80E); // NOT USE WriteCMD(0xC000); // CLK 1mhz, 2.2v WriteCMD(0x8280); // ER, EBB, !ET, ES, EX, !EB, !EW, !DC }
void Init_RF12() { RF_EN = true; output_high(_SDA); output_low(_SCK); WriteCMD(0x80D8); //enable register,433MHz,12.5pF WriteCMD(0x8208); //Turn on crystal,!PA WriteCMD(0xA640); // WriteCMD(0xC647); // WriteCMD(0XCC77); // WriteCMD(0x94A0); //VDI,FAST,134kHz,0dBm,-103dBm WriteCMD(0xC2AC); WriteCMD(0xCA80); WriteCMD(0xCA83); //FIFO8,SYNC, WriteCMD(0xC49B); WriteCMD(0x9850); //!mp,9810=30kHz,MAX OUT WriteCMD(0xE000); //NOT USE WriteCMD(0xC80E); //NOT USE WriteCMD(0xC000); //1.0MHz,2.2V }
void Init_RF12RX() { RF_EN = true; output_high(_SDA); output_low(_SCK); WriteCMD(0x80D8); //enable register,433MHz,12.5pF WriteCMD(0x82D8); //enable receive,!PA WriteCMD(0xA640); // WriteCMD(0xC647); // WriteCMD(0x94A0); //VDI,FAST,134kHz,0dBm,-103dBm WriteCMD(0xC2AC); WriteCMD(0XCC77); // WriteCMD(0xCA80); WriteCMD(0xCA83); //FIFO8,SYNC, WriteCMD(0xC49B); WriteCMD(0x9850); //!mp,9810=30kHz,MAX OUT WriteCMD(0xE000); //NOT USE WriteCMD(0xC800); //NOT USE WriteCMD(0xC000); //1.0MHz,2.2V WriteCMD(0xCA80); WriteCMD(0xCA83); // reset FIFO and read to receive next Byte RF12_RDFIFO(); }
uchar ReadFifo(void) { WaitReady(); return (WriteCMD(0xB000) & 0xFF); }
/**************************************************************************** * * Дапишем данные в RAM * ****************************************************************************/ void WriteDataToRam(unsigned char Data) { WriteCMD(Data, 1); }
/**************************************************************************** * * Установить указатель DDRAM * ****************************************************************************/ void SetDDRAMAddress(unsigned char AC) { unsigned char temp=128; temp|=AC; WriteCMD(temp, 0); }
/**************************************************************************** * * Установить указатель CGRAM * ****************************************************************************/ void SetCGRAMAddress(unsigned char AC) { unsigned char temp=64; temp|=AC; WriteCMD(temp, 0); }
void main() { uchar i=0, j=0; uint chksum=0; uchar buffer[17]; uchar temp=0; init(); LED1 = 1; // Blink LED twice - slave delay_ms(500); LED1 = 0; delay_ms(500); LED1 = 1; // Blink LED twice - slave delay_ms(500); LED1 = 0; WriteCMD(0xCA81); WriteCMD(0xCA83); // Enable FIFO while(1) { while(RFM12_IRQ==0) { temp= ReadFifo(); // read in next Rx byte buffer[i++] = temp; if(temp!=0){ for(t=0;t<4;t++){ LED1=1; // turn on led delay_ms(25); LED1=0; // turn on led delay_ms(25); } } if (i==17) // received data + checksum = 17 bytes { i=0; WriteCMD(0xCA81); // disable FIFO chksum=0; for(j=0 ; j<16 ; j++) // calc checksum chksum+=buffer[j]; chksum&=0x0FF; if(chksum==buffer[16]&&buffer[16]!=0) // if checksum ok { for(t=0;t<4;t++){ LED1=1; // turn on led delay_ms(25); LED1=0; // turn on led delay_ms(25); } } /// LED1=0; WriteCMD(0xCA81); // disable FIFO WriteCMD(0xCA83); // enable FIFO, re-Sync }//if }//while } //while }
/**************************************************************************** * Вернуть указатель в начало DDRAM * ****************************************************************************/ void ReturnHome(void) { WriteCMD(2, 0); }
/**************************************************************************** * Очистить дисплей * ****************************************************************************/ void ClearDisplay(void) { WriteCMD(1, 0); }