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();

}
示例#3
0
//=======================================================================================
//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
}
示例#5
0
/* 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();    
//
	}




}
示例#6
0
//-------------------------------------------------------
//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();
}