int main () { // start delay _delay_ms(DEVICE_START_DELAY_MS); Init_Spi(); DDRC |= 0x01; PORTC |= 0x01; RFM73_Initialize(); RFM73_SetPower(MODULE_POWER); SwitchToRxMode(); DDRD = 0b00000000; PORTD = 0b00000100; SetupTIMER1(); sei(); sleep_enable(); while (1) { if (state == OFF){ DOWNBIT(PORTC, 0); sleep_cpu(); } else { SwitchToTxMode(); for(char i=0;i<POWERCOUNT;i++) { SwitchToTxMode(); Send_Packet(W_TX_PAYLOAD_NOACK_CMD,tx_buf,4); SwitchToRxMode(); //switch to Rx mode _delay_ms(150); INVBIT(PORTC, 0); } } } return 0; }
void RFM73_SetPower(char power) { UINT8 power_mask = (((power << 1) & 0b00000110) | 0b11111001); SPI_Write_Reg((WRITE_REG|Bank0_Reg[6][0]),( Bank0_Reg[6][1] & power_mask)); SwitchToRxMode(); }
//======================================================================================= //inline void sendMachine_3(){ enum { DATAMAXLEN = 64, DATAMARKERPOSITION = 0, DATAMARKER = '?', DATACODELENPOSITION = 1, DATACODEPOSION = 2 }; #define ASKDATALEN 3 char ASKDATA[ASKDATALEN] = "***"; #define ANSWERDATALEN 3 char ANSWERDATA[ANSWERDATALEN] = "+++"; static char data[DATAMAXLEN]; #define REPCOUNTER 3 static char repeat_counter = REPCOUNTER; enum {WAITNEWCODE, WAITCODEDONE, WAITBOX, SENDTOBOX, WAITDELAY}; static char state = WAITNEWCODE; switch (state){ //======================== case WAITNEWCODE: //======================== if (getFlag(FLAG_NEW_NOCK) == TRUE) state = WAITCODEDONE; break; //======================== case WAITCODEDONE: //======================== if (getFlag(FLAG_NEW_NOCK) == FALSE){ //state = WAITBOX; //DEBUG state = SENDTOBOX; } break; //======================== case WAITBOX:{ //======================== char len = Receive_Packet(data, DATAMAXLEN); if (len > 0){ #ifdef LOGG loggerWriteToMarker((LogMesT)" WAITBOX get data: *", '*'); loggerWrite((LogMesT)data, len); #endif for (char i = 0; i < ANSWERDATALEN; i++) if (data[i] != ANSWERDATA[i]) return; state = SENDTOBOX; break; } SwitchToTxMode(); Send_Packet(W_TX_PAYLOAD_NOACK_CMD, (unsigned char *)ASKDATA, ASKDATALEN); //Send_Packet(0, ASKDATA, ASKDATALEN); SwitchToRxMode(); state = WAITDELAY; }break; //======================== case WAITDELAY: //======================== if (processWait() == TRUE) #ifdef LOGG loggerWriteToMarker((LogMesT)" goto WAITBOX\r*", '*'); #endif state = WAITBOX; break; //======================== case SENDTOBOX:{ //======================== #ifdef LOGG loggerWriteToMarker((LogMesT)" SENDTOBOX\r*", '*'); #endif SwitchToTxMode(); Nock * nock = getNock(NOCK_PATTERN); data[DATAMARKERPOSITION] = DATAMARKER; data[DATACODELENPOSITION] = nock->count; unsigned char i; for (i = 0; i < nock->count; i++){ int time = nock->nock[i]; char * p = &time; data[DATACODEPOSION + i*2] = *p; p++; data[DATACODEPOSION + i*2 + 1] = *p; } data[DATACODEPOSION + i * 2] = DATAMARKER; Send_Packet(W_TX_PAYLOAD_NOACK_CMD, (unsigned char *)data, DATACODEPOSION + nock->count * 2 + 1); //Send_Packet(0, (unsigned char *)data, DATACODEPOSION + nock->count + 1); #ifdef LOGG loggerWriteToMarker((LogMesT)" nock count: *", '*'); char ch = nock->count + 48; loggerWrite(&ch, 1); #endif if (repeat_counter-- <= 0){ repeat_counter = REPCOUNTER; state = WAITNEWCODE; } }break; //======================== default: break; //======================== } }
void RFM73_Initialize() { UINT8 i,j,temp; UINT8 WriteArr[12]; //DelayMs(100);//delay more than 50ms. _delay_ms(200); SwitchCFG(0); for(i=0;i<20;i++) { SPI_Write_Reg((WRITE_REG|Bank0_Reg[i][0]),Bank0_Reg[i][1]); } /*//reg 10 - Rx0 addr SPI_Write_Buf((WRITE_REG|10),RX0_Address,5); //REG 11 - Rx1 addr SPI_Write_Buf((WRITE_REG|11),RX1_Address,5); //REG 16 - TX addr SPI_Write_Buf((WRITE_REG|16),RX0_Address,5);*/ //reg 10 - Rx0 addr for(j=0;j<5;j++) { WriteArr[j]=RX0_Address[j]; } SPI_Write_Buf((WRITE_REG|10),&(WriteArr[0]),5); //REG 11 - Rx1 addr for(j=0;j<5;j++) { WriteArr[j]=RX1_Address[j]; } SPI_Write_Buf((WRITE_REG|11),&(WriteArr[0]),5); //REG 16 - TX addr for(j=0;j<5;j++) { WriteArr[j]=RX0_Address[j]; } SPI_Write_Buf((WRITE_REG|16),&(WriteArr[0]),5); // printf("\nEnd Load Reg"); i=SPI_Read_Reg(29);//read Feature Register ???????§??¶??¬?¤¶?»??? Payload With ACK?¬???????????¬·??? ACTIVATE????????????0x73),?»??????¶??¬?¤¶?»??? Payload With ACK (REG28,REG29). if(i==0) // i!=0 showed that chip has been actived.so do not active again. SPI_Write_Reg(ACTIVATE_CMD,0x73);// Active for(i=22;i>=21;i--) { SPI_Write_Reg((WRITE_REG|Bank0_Reg[i][0]),Bank0_Reg[i][1]); //SPI_Write_Reg_Bank0(Bank0_Reg[i][0],Bank0_Reg[i][1]); } //********************Write Bank1 register****************** SwitchCFG(1); for(i=0;i<=8;i++)//reverse { for(j=0;j<4;j++) WriteArr[j]=(Bank1_Reg0_13[i]>>(8*(j) ) )&0xff; SPI_Write_Buf((WRITE_REG|i),&(WriteArr[0]),4); } for(i=9;i<=13;i++) { for(j=0;j<4;j++) WriteArr[j]=(Bank1_Reg0_13[i]>>(8*(3-j) ) )&0xff; SPI_Write_Buf((WRITE_REG|i),&(WriteArr[0]),4); } //SPI_Write_Buf((WRITE_REG|14),&(Bank1_Reg14[0]),11); for(j=0;j<11;j++) { WriteArr[j]=Bank1_Reg14[j]; } SPI_Write_Buf((WRITE_REG|14),&(WriteArr[0]),11); //toggle REG4<25,26> for(j=0;j<4;j++) //WriteArr[j]=(RegArrFSKAnalog[4]>>(8*(j) ) )&0xff; WriteArr[j]=(Bank1_Reg0_13[4]>>(8*(j) ) )&0xff; WriteArr[0]=WriteArr[0]|0x06; SPI_Write_Buf((WRITE_REG|4),&(WriteArr[0]),4); WriteArr[0]=WriteArr[0]&0xf9; SPI_Write_Buf((WRITE_REG|4),&(WriteArr[0]),4); //**************************Test spi*****************************// //SPI_Write_Reg((WRITE_REG|Bank0_Reg[2][0]),0x0f); //test_data = SPI_Read_Reg(0x02); //DelayMs(10); _delay_ms(50); //********************switch back to Bank0 register access****************** SwitchCFG(0); SwitchToRxMode();//switch to RX mode }
/* first function that receives code for on/off the light. Never exists! */ void legacy_receiver(){ //requred vars: UINT8 sta; extern unsigned int angle; #define BUFFER_LENGTH 1 UINT8 g_RFSendBuff[BUFFER_LENGTH]; SwitchToRxMode(); //Set RF to TX mode UINT8 rlen; cnt=0; is_on=0; for (;;) { /* i = 71*100; do (i--); while (i != 0); */ // P1OUT ^= 0x01; i = 75; do (i--); while (i != 0); /* Is this just a pause to settle down the receiver? */ //receive code: sta = RF_GET_STATUS(); //Get the RF status if(sta & STATUS_RX_DR){ //Receive OK? rlen = RF_ReadRxPayload( (UINT8 *)&g_RFSendBuff, BUFFER_LENGTH ); // P2OUT ^=TRIAC; if((char)g_RFSendBuff[0]=='a'){ if(angle<=MIN_ANGLE) angle=MIN_ANGLE; else angle-=ANGLE_STEP; } if((char)g_RFSendBuff[0]=='b'){ if(angle>MAX_ANGLE) { angle=MAX_ANGLE; //a trick. we turn on the triac to get interrupt P2OUT |=TRIAC; } else angle+=ANGLE_STEP; } } if( sta & STATUS_MAX_RT ) //Send fail? { RF_FLUSH_TX(); //Flush the TX FIFO } RF_CLR_IRQ( sta ); //Clear the IRQ flag /* cnt++; //turn off for approx 1 period if(cnt==20){ if(P1OUT&0x01) { is_on=1; //turn off momentary P1OUT &=~0x01; } else { is_on=0; cnt=0; } } if(cnt==25 && is_on){ is_on=0; P1OUT |=0x01; cnt=0; } */ // sta=SPI_Read_Reg(CONFIG)&0x0f; // if(sta==0x0f) // P1OUT ^=0x01; //transmit code: // SPI_Write_Buf(WR_TX_PLOAD, g_RFSendBuff, 1); // Writes data to TX FIFO // // sta = SPI_Read_Reg( STATUS ); // read register STATUS's value // // /* if( (sta & STATUS_TX_DS) || (sta & STATUS_MAX_RT) ) //TX IRQ? // { // if( sta & STATUS_MAX_RT ) //if send fail // { // RF_FLUSH_TX(); // } // */ // // RF_CLR_IRQ( sta ); // clear RX_DR or TX_DS or MAX_RT interrupt flag // // } // // SwitchToRxMode(); // } }
//------------------------------------------------------- //Function: //Desc : //Input : //Output: //Return: //Others: //Author: //Date : 2011/03/01 //------------------------------------------------------- void system_test_mode(void) { BYTE i=0; BYTE channel = 0; BYTE sc_sub_mode = 0; BYTE sc_count = 0; BYTE uTestCHIndex; BYTE uLEDBlinkDuty; BK2401_RETR = 0x00; BK2401_ENAA = 0x00; BK2401_ENRX = 0x00; PowerUp_RF(); SwitchToTxMode(); BK2401_CE = 0X00; BK2401_CE = 0X01; i = 1; uTestCHIndex = TEST_CHANNEL[i]; BK2401_RFCH=RF_TABLE[uTestCHIndex]; channel = RF_TABLE[uTestCHIndex]; RF_SetLowOuput(); // RF_Set_Mode(1); RF_Set_Mode(0); system.work_sub_mode = TEST_SC; uLEDBlinkDuty = 0; if(get_bindkey()) system.Key.bKey.bBindKeyState = 1; while(system.work_mode == SYSTEM_TEST) { if(u10msFlag & bSysCheck) { u10msFlag &= ~bSysCheck; Sys_KeyScan(); if(system.Key.bKey.bBindKeyValid) { system.Key.bKey.bBindKeyValid = 0; i++; if(i>=3) { i=0; } uTestCHIndex = TEST_CHANNEL[i]; BK2401_RFCH=RF_TABLE[uTestCHIndex]; channel = uTestCHIndex; } if(++uLEDBlinkDuty > 99) { uLEDBlinkDuty = 0; LEDToggle(); } switch(system.work_sub_mode) //²âÊÔģʽ { case TEST_SC: //µ¥Ôز¨ break; case TEST_CD: //µ÷ÊÔ £¬FCC²âÊÔ FIFO_data[0] = 0xCC; FIFO_data[1] = 0xCC; FIFO_data[2] = 0xCC; FIFO_data[3] = 0xCC; FIFO_data[4] = 0xCC; FIFO_data[5] = 0xCC; FIFO_data[6] = 0xCC; FIFO_data[7] = 0xCC; FIFO_data[8] = 0xCC; FIFO_data[9] = 0xCC; FIFO_data[10] = 0xCC; FIFO_data[11] = 0xCC; FIFO_data[12] = 0xCC; FIFO_data[13] = 0xCC; FIFO_data[14] = 0xCC; FIFO_data[15] = 0xCC; FIFO_data[16] = 0xCC; FIFO_data[17] = 0xCC; FIFO_data[18] = 0xCC; FIFO_data[19] = 0xCC; FIFO_data[20] = 0xCC; FIFO_data[21] = 0xCC; FIFO_data[22] = 0xCC; FIFO_data[23] = 0xCC; FIFO_data[24] = 0xCC; W_TX_PAYLOAD_NOACK(FIFO_data,25); WaitUs(50); W_TX_PAYLOAD_NOACK(FIFO_data,25); WaitUs(50); W_TX_PAYLOAD_NOACK(FIFO_data,25); WaitUs(50); W_TX_PAYLOAD_NOACK(FIFO_data,25); WaitUs(50); W_TX_PAYLOAD_NOACK(FIFO_data,25); WaitUs(50); break; case TEST_RF_DATA: //·¢ËÍÊý¾Ý FIFO_data[0] = DATATYPE_MOUSE; FIFO_data[1] = 0; FIFO_data[2] = 0; FIFO_data[3] = 2; FIFO_data[4] = 0; W_TX_PAYLOAD_NOACK(FIFO_data,5); WaitUs(50); W_TX_PAYLOAD_NOACK(FIFO_data,5); WaitUs(50); W_TX_PAYLOAD_NOACK(FIFO_data,5); WaitUs(50); W_TX_PAYLOAD_NOACK(FIFO_data,5); WaitUs(50); W_TX_PAYLOAD_NOACK(FIFO_data,5); WaitUs(50); break; default: system.work_sub_mode = TEST_SC; break; } switch(sc_sub_mode) { case 0 : break; case 1 : sc_count++; if(sc_count >= 2) { sc_count = 0; channel++; if(channel >= 82) { channel = 0; } BK2401_RFCH=channel; } break; case 2 : sc_count++; if(sc_count >= 2) { sc_count = 0; if(channel == 0) { channel = 82; }else{ channel--; } BK2401_RFCH=channel; } break; default: break; } } //usb data dispose if(system.usbp0_data.aceept) { system.usbp0_data.aceept = 0; if(COMMAND_TEST == system.usbp0_data.set_report_data[0]) { switch(system.usbp0_data.set_report_data[1]) { case COM_TEST_SC : system.work_sub_mode = TEST_SC; RF_Set_Mode(0); system.usbp0_data.reday_report_flag = 1; break; case COM_TEST_CD: system.work_sub_mode = TEST_CD; RF_Set_Mode(1); system.usbp0_data.reday_report_flag = 1; break; case COM_TEST_DAT: system.work_sub_mode = TEST_RF_DATA; RF_Set_Mode(1); system.usbp0_data.reday_report_flag = 1; break; case COM_TEST_LOW_CH: i=0; uTestCHIndex = TEST_CHANNEL[i]; BK2401_RFCH=RF_TABLE[uTestCHIndex]; channel = uTestCHIndex; system.usbp0_data.reday_report_flag = 1; break; case COM_TEST_MID_CH: i=1; uTestCHIndex = TEST_CHANNEL[i]; BK2401_RFCH=RF_TABLE[uTestCHIndex]; channel = uTestCHIndex; system.usbp0_data.reday_report_flag = 1; break; case COM_TEST_HIG_CH: i=2; uTestCHIndex = TEST_CHANNEL[i]; BK2401_RFCH=RF_TABLE[uTestCHIndex]; channel = uTestCHIndex; system.usbp0_data.reday_report_flag = 1; break; case COM_TEST_SW_HIG: sc_sub_mode = 1; system.usbp0_data.reday_report_flag = 1; break; case COM_TEST_SW_LOW: sc_sub_mode = 2; system.usbp0_data.reday_report_flag = 1; break; case COM_TEST_SW_STOP: sc_sub_mode = 0; system.usbp0_data.reday_report_flag = 1; break; case COM_TEST_POW_5: RF_Set_ouput_power(3); system.usbp0_data.reday_report_flag = 1; break; case COM_TEST_POW_0: RF_Set_ouput_power(2); system.usbp0_data.reday_report_flag = 1; break; case COM_TEST_POW_N5: RF_Set_ouput_power(1); system.usbp0_data.reday_report_flag = 1; break; case COM_TEST_POW_N10: RF_Set_ouput_power(0); system.usbp0_data.reday_report_flag = 1; break; case COM_TEST_EXIT: system.work_mode = SYSTEM_WORK; system.usbp0_data.reday_report_flag = 1; break; default : system.usbp0_data.reday_report_flag = 0; break; } } else if(COMMAND_CURRENT_MODE == system.usbp0_data.set_report_data[0]) { system.usbp0_data.get_report_data[1] = COMMAND_TEST; system.usbp0_data.reday_report_flag = 1; } } } BK2433_RF_Initial(); SwitchToRxMode(); PowerUp_RF(); }