⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ia443x_demo.c

📁 silicon wireless开发套件F920+Si4432原理图,源码
💻 C
📖 第 1 页 / 共 3 页
字号:
/*
** ============================================================================
**
** FILE
**  IA443x_demo.c
**
** DESCRIPTION
**  Contains the RF dependent functions
**
** CREATED
**  Silicon Laboratories Hungary Ltd
**
** COPYRIGHT
**  Copyright 2008 Silicon Laboratories, Inc.  
**	http://www.silabs.com
**
** ============================================================================
*/
/*------------------------------------------------------------------------*/
/*						INCLUDE											  */
/*------------------------------------------------------------------------*/
#include "IA443x_demo.h"
#include "global_definitions.h"
#include "IA443x_rf.h"
#include "IA443x_rf_callback.h"
#include "menu.h"
#include "IAI_EBID.h"


/*------------------------------------------------------------------------*/
/*						GLOBAL variables								  */
/*------------------------------------------------------------------------*/
idata DEMO_STATES DemoStates, NewDemoStates;
bit fChangeDemoStates, AutoTx;
idata UU16 DemoTimer;
idata uint8 LongDelay;
xdata PACKET_TYPE fWaitForPacketOrAck,fPacketSent;
xdata uint8 rf_param[10];

xdata uint16 NmbrOfSentPackets, NmbrOfReceivedPackets,NmbrOfMissedPackets,LastPacketId;
xdata ANTENNA_TYPE SelectedAntennaType;

idata PHY_STATUS RfStatus;
xdata uint8 RxTxBuffer[MAX_LENGTH_OF_PAYLOAD];
xdata HEADER HeaderBuffer;
xdata MESSAGE MessageBuffer;
xdata RECEIVE_COMMAND RxCommand;
xdata RECEIVED_DATA ReceivedData;

//EXTERN variables
	//global_constans.c
extern code DEMO_FREQ demo_freqs[MAX_FREQ_SETTING];
extern code DEMO_FREQ arib_freqs[MAX_ARIB_FREQ_SETTING];
	//IAI_EBID.c
extern xdata EBID_DATA	TestcardData;
	//menu.c
extern xdata MENU_ITEM_VALUE	MenuItems;
extern code uint16 v_max_packets[8];
extern code uint8 t_packet_length[8];
extern code uint8 t_chip_type[2][6];
extern code uint8 t_chip_revision[1][2];

/*------------------------------------------------------------------------*/
/*						LOCAL function prototypes						  */
/*------------------------------------------------------------------------*/
void DemoAckSent(uint8 success);
void DemoPingReceived(void);
void DemoAckReceived(uint8 success);

/*------------------------------------------------------------------------*/
/*						LOCAL definitions								  */
/*------------------------------------------------------------------------*/
#define PER_RESET_INPUT		PB2_PIN
#define SEND_PACKET_INPUT 	PB1_PIN
#define LED_TX				LED1_PIN
#define LED_RX 				LED2_PIN
#define LED_ANT1			LED3_PIN
#define	LED_ANT2			LED4_PIN

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  +
  + FUNCTION NAME:  void DemoInit(void)
  +
  + DESCRIPTION:    initializes the demo
  +
  + RETURN:         None
  +
  + NOTES:          
  +
  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
void DemoInit(void)
{
	//initialize the demo variables
	DemoStates = sDemoInit;
}

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  +
  + FUNCTION NAME:  void DemoStateMachine(void)
  +
  + DESCRIPTION:    state machine of the demo
  +
  + RETURN:         None
  +
  + NOTES:          
  +
  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
void DemoStateMachine(void)
{	
	uint8 temp8,i,string[6];	
	uint16 temp16;
	float temp_float;

	switch( DemoStates )
	{
		case sDemoInit:
			
			MenuItems.name.eeprom_off = FALSE; //default - EEPROM is enabled 
			//diable the EEPROM
			if( PB4_PIN == 0 ) 
			{
				while ( PB4_PIN == 0 );
				MenuItems.name.eeprom_off = TRUE;
			}
			 

			//set default variables
			DemoStates = sDemoStartScreen;
			//find out what kind of testcard is plugged into the PIC SW Dev board
			if ( MenuItems.name.eeprom_off == FALSE ) //if EEPROM is enabled
			{
				GetEBIDDataFromEEPROM();
				if( TestcardData.valid_info == FALSE )
				{//there is no Testcard inserted or there is no EEPROM on the testcard
					PerformMenu(sMenuTestcardOrEEPROMError);
					DemoStates = sDemoDoNothing;
					return;	
				}
				//find out whether the chip is supported by the current FW or not
				switch( TestcardData.chip_type )
				{
					case SI4030:
					case SI4031:
					case SI4032:
						temp8 = TRUE;
					break;
					case SI4330:
						temp8 = TRUE;
					break;
					case SI4430:
					case SI4431:
					case SI4432:
						if( TestcardData.chip_revision[0] == 'V' ) 
						{
							temp8 = TRUE;
						}
					break;
		
					default:
						temp8 = FALSE;
					break;
				}
				if( temp8 == TRUE )
				{//the chip is supported, check the POR
					//initialize the RF chip
					temp8 = RfInitHw();
					if( temp8 == RF_ERROR_TIMING )
					{//POR Timeout error
						PerformMenu( sMenuPORTimeout );
						DemoStates = sDemoDoNothing;
						return;
					}
				}
				else
				{//the chip is not supported by the current FW
					PerformMenu(sMenuNotSupportedChip);
					DemoStates = sDemoDoNothing;
					return;	
				}
				//disable hidden menu
				MenuItems.name.show_hidden_menu = FALSE;
				//set the antenna type
				switch( TestcardData.ant_type )
				{
					case SMA_TRX_SWITCH:	SelectedAntennaType = RX_TX_SWITCH;		 break;
					case SEPARATE_SMA: 		SelectedAntennaType = SEPARATE_RX_TX; 	 break;
					case ANT_DIVERSITY: 	SelectedAntennaType = ANTENNA_DIVERSITY; break;
					default: 				SelectedAntennaType = SEPARATE_RX_TX; 	 break;
				}


			}
			else
			{	
				MenuItems.name.show_hidden_menu = TRUE;
				//initialize the RF chip
				temp8 = RfInitHw();
				if( temp8 == RF_ERROR_TIMING )
				{//POR Timeout error
					PerformMenu( sMenuPORTimeout );
					DemoStates = sDemoDoNothing;
					return;
				}

			}
		break;

		case sDemoStartScreen:
			//draw the startup screen
			PerformMenu( sMenuStartScreen );
			//start long timeout -> ~3s
			LongDelay = START_SCREEN_DELAY_SW_DIV;
			DemoTimer.U16 = START_SCREEN_DELAY;
			StartTmr3(START_SCREEN_DELAY_DIV, DemoTimer, FALSE);

			DemoStates = sDemoDelayAfterScreens;
		break;

		case sDemoDelayAfterScreens:
			//check whether the timer expired or not
			if( Tmr3Expired() == TRUE )
			{//TMR expired
				StopTmr3();
				if( --LongDelay == 0 )
				{
					DemoStates = sDemoInitRf;
					return;
				}
				else
				{//restart timer
					DemoTimer.U16 = START_SCREEN_DELAY;
					StartTmr3(START_SCREEN_DELAY_DIV, DemoTimer, FALSE);
				}
			}
			//enable the hidden menu if needed
			if( (PB1_PIN == 0) && (PB2_PIN == 0) )
			{	//wait for releasing the buttons
				while( (PB1_PIN == 0) && (PB2_PIN == 0) );
				//enable the hidden menu
				MenuItems.name.show_hidden_menu = TRUE;
				DemoStates = sDemoInitRf;
				return;
			}
			//skip the start screen if any of the PB is pressed
			if( (PB1_PIN == 0) || (PB2_PIN == 0) || (PB3_PIN == 0) || (PB4_PIN == 0) )
			{
				while( (PB1_PIN == 0) || (PB2_PIN == 0) || (PB3_PIN == 0) || (PB4_PIN == 0) );
				DemoStates = sDemoInitRf;
			}
		break;

		case sDemoInitRf: 
			if ( MenuItems.name.eeprom_off == FALSE ) 
			{
				if( SpiReadByteFromTestcardEEPROM( EE_ADDRESS_FIRST_PLUG ) == 0xFF )
				{//no data is saved previously into the EEPROM
					//reset menu variables
					for(i=0;i<NMBR_OF_MENU_ITEM;i++) MenuItems.value[i] = 0;
                    //set default values for some registers
					MenuItems.name.antenna_mode = 1;	   
                    MenuItems.name.max_packets = 4;
                    MenuItems.name.output_power = 3;
					//-> set destination ID equal to the source ID
					MenuItems.name.dest_id = (uint8)(TestcardData.serial_nmbr & 0x00FF);
					MenuItems.name.self_id = (uint8)(TestcardData.serial_nmbr & 0x00FF);
					MenuItems.name.antenna_mode = 1;	   
				}
				else
				{//read menu items from the EEPROM
					for(i=0;i<NMBR_OF_MENU_ITEM-1;i++)
					{
						MenuItems.value[i] = SpiReadByteFromTestcardEEPROM(EE_ADDRESS_FIRST_PLUG + i + 1);
					}
					MenuItems.name.self_id = (uint8)(TestcardData.serial_nmbr & 0x00FF);
                    //if the read value is out of the valid range, then set the default
					if (MenuItems.name.system_function >= 2) MenuItems.name.system_function = 0;
					if (MenuItems.name.lab_mode >= 4) MenuItems.name.lab_mode = 0;
					if (MenuItems.name.demo_mode >= 3) MenuItems.name.demo_mode = 0;
					if (MenuItems.name.data_rate >= 9) MenuItems.name.data_rate = 0;
					if (MenuItems.name.modulation_mode >= 3) MenuItems.name.modulation_mode = 0;
					if (MenuItems.name.frequency >= 20) MenuItems.name.frequency = 12;  
					if (MenuItems.name.gps_enabled >= 2) MenuItems.name.gps_enabled = 0;
					if (MenuItems.name.arib_mode >= 2) MenuItems.name.arib_mode = 0;
					if (MenuItems.name.full_menu >= 2) MenuItems.name.full_menu = 0;
					if (MenuItems.name.output_power >= 4) MenuItems.name.output_power = 3;
					if (MenuItems.name.max_packets >= 7) MenuItems.name.max_packets = 4;
					if (MenuItems.name.packet_length >= 13) MenuItems.name.packet_length = 0; 
				}	
			}
			else
			{		//EEPROM mode disabled, all variable must be set manually
					MenuItems.name.system_function = 0;	
					MenuItems.name.demo_mode = 0;
					MenuItems.name.data_rate = 0;
					MenuItems.name.antenna_mode = 1;
					MenuItems.name.modulation_mode = 0;
					MenuItems.name.frequency = 12;
					MenuItems.name.self_id = 0;
					MenuItems.name.dest_id = 0;
					MenuItems.name.arib_mode = 0; 
					MenuItems.name.max_packets = 4;
					MenuItems.name.gps_enabled = 0;
					MenuItems.name.output_power = 3;
					MenuItems.name.sma_connection_type = 0;	
					MenuItems.name.chip_type = 0;
					MenuItems.name.chip_revision = 0;
					MenuItems.name.packet_length = 0;
               		MenuItems.name.full_menu = 1;
			}
            //set parameters what are not saved into the EEPROM
			MenuItems.name.gpio0_select = 0;
			MenuItems.name.rssi_format = 0;
    		MenuItems.name.preamble_length = 24; 
			MenuItems.name.preamble_detection_treshold = 10;
            //check whether the settings are correlated to other settings - change if needed
			ChangeSettingsIfNotvalid();

			temp8 = TestcardData.board_status & 0x03;
			switch (temp8)
			{
				
				case 1: DemoStates = sDemoBoardStatusModifiedDraw;	break;		
 				case 2: DemoStates = sDemoBoardStatusEngineeringDraw; break;
				default:
					if (MenuItems.name.eeprom_off == FALSE) DemoStates = sDemoSettingScreen;
					else DemoStates = sDemoDrawSP0;
				break;
			}			
			 

			MenuSetCursorPosition(0);
		break;

		case sDemoBoardStatusModifiedDraw:
			//draw board status modified screen
			PerformMenu( sMenuBoardStatusModified );
			LongDelay = START_SCREEN_DELAY_SW_DIV;
			DemoTimer.U16 = START_SCREEN_DELAY;
			StartTmr3(START_SCREEN_DELAY_DIV, DemoTimer, FALSE);
			DemoStates = sDemoDelay;
						 
		break;

		case sDemoBoardStatusEngineeringDraw:
			//draw board status engineering screen
			PerformMenu( sMenuBoardStatusEngineering );
			LongDelay = START_SCREEN_DELAY_SW_DIV;
			DemoTimer.U16 = START_SCREEN_DELAY;
			StartTmr3(START_SCREEN_DELAY_DIV, DemoTimer, FALSE);
			DemoStates = sDemoDelay;	
		break;

		case sDemoDelay:
			if( Tmr3Expired() == TRUE )
			{//TMR expired
				StopTmr3();
				if( --LongDelay == 0 )
				{
					if (MenuItems.name.eeprom_off == FALSE) DemoStates = sDemoSettingScreen;
					else DemoStates = sDemoDrawSP0;
				}
				else
				{//restart timer
					DemoTimer.U16 = START_SCREEN_DELAY;
					StartTmr3(START_SCREEN_DELAY_DIV, DemoTimer, FALSE);
				}
			}
			//skip the start screen if any of the PB is pressed
			if( (PB1_PIN == 0) || (PB2_PIN == 0) || (PB3_PIN == 0) || (PB4_PIN == 0) )
			{
				while( (PB1_PIN == 0) || (PB2_PIN == 0) || (PB3_PIN == 0) || (PB4_PIN == 0) );
				if (MenuItems.name.eeprom_off == FALSE) DemoStates = sDemoSettingScreen;
				else DemoStates = sDemoDrawSP0;
			} 	
		break;

		case sDemoDrawSP0:
			//draw first setting page
			PerformMenu( sMenuDrawChipSelection );
			DemoStates = sDemoChangeSP0;
		break;

		case sDemoChangeSP0:
			switch( PerformMenu(sMenuChangeChipSelection) )
			{
				case UPDATE_PAGE: 	DemoStates = sDemoDrawSP0; break;
				case NEXT_PAGE:	
					if ( MenuItems.name.eeprom_off == TRUE )
					{
						switch (MenuItems.name.chip_type)
						{
							case 0: TestcardData.chip_type = SI4432; break;
							case 1: TestcardData.chip_type = SI4431; break;
							default: TestcardData.chip_type = SI4432; break; 	 
						}	
						TestcardData.chip_revision[0] = t_chip_revision[MenuItems.name.chip_revision][0];
						switch( MenuItems.name.sma_connection_type ) 
						{
							case 0:	SelectedAntennaType = SEPARATE_RX_TX; break;
							case 1: SelectedAntennaType = ANTENNA_DIVERSITY; break;
							case 2: SelectedAntennaType = RX_TX_SWITCH; break;
							case 3: SelectedAntennaType = DIRECT_TILE; break;
							default: SelectedAntennaType = SEPARATE_RX_TX; break;
						} 
					}
					DemoStates = sDemoSettingScreen;
					MenuSetCursorPosition(0);		 
				break;
				default: break;
			}
		break;

		
			

		case sDemoSettingScreen:
			//draw first setting page
			PerformMenu( sMenuDrawSystemFunctionScreen );
			DemoStates = sDemoChangeSP1;
		break;

		case sDemoChangeSP1:
			switch( PerformMenu(sMenuChangeSystemFunction) )
			{
				case UPDATE_PAGE: 	DemoStates = sDemoSettingScreen; break;
				case NEXT_PAGE:		
					DemoStates = sDemoDrawSP2;		 
					MenuSetCursorPosition(0);
				break;
				default: break;
			}
		break;

		case sDemoDrawSP2:
			PerformMenu( sMenuDrawRfParametersScreen1 );
			DemoStates = sDemoChangeSP2;
		break;

		case sDemoChangeSP2:
			switch( PerformMenu(sMenuChangeRfParameters1) )
			{
				case UPDATE_PAGE: 	DemoStates = sDemoDrawSP2; break;
				case NEXT_PAGE:		
					DemoStates = sDemoDrawSP3; 			
					MenuSetCursorPosition(0);
 				break;
				default: break;
			}
		break;

		case sDemoDrawSP3:
			PerformMenu( sMenuDrawRfParametersScreen2 );
			DemoStates = sDemoChangeSP3;
		break;

		case sDemoChangeSP3:
			switch( PerformMenu(sMenuChangeRfParameters2) )
			{
				case UPDATE_PAGE: 	DemoStates = sDemoDrawSP3; break;
				case NEXT_PAGE:		
					DemoStates = sDemoDrawSP4; 	
					if ( MenuItems.name.eeprom_off == FALSE )
					{		
						MenuSetCursorPosition(1);
					}
					else
					{
						MenuSetCursorPosition(0);	
					}		
 				break;
				default: break;
			}
		break;

		case sDemoDrawSP4:
			PerformMenu( sMenuDrawNodeParametersScreen );
			DemoStates = sDemoChangeSP4;
		break;

		case sDemoChangeSP4:
			switch( PerformMenu( sMenuChangeNodeParameters ) )
			{
				case UPDATE_PAGE: 	DemoStates = sDemoDrawSP4; break;
				case NEXT_PAGE:
					if(MenuItems.name.show_hidden_menu == TRUE) DemoStates = sDemoDrawSP5; 
					else DemoStates = sDemoDefineDemoOrTest;
					MenuSetCursorPosition(0);
				break;
				default: break;
			}
		break;

		case sDemoDrawSP5:
			PerformMenu( sMenuDrawHiddenScreen1 );
			DemoStates = sDemoChangeSP5;
		break;

		case sDemoChangeSP5:
			switch( PerformMenu( sMenuChangeHiddenScreen1 ) )
			{
				case UPDATE_PAGE: 	DemoStates = sDemoDrawSP5; break;
				case NEXT_PAGE:	
					DemoStates = sDemoDrawSP6; 
					MenuSetCursorPosition(0);
				break;
				default: break;
			}
		break;
		
		case sDemoDrawSP6:
			PerformMenu( sMenuDrawHiddenScreen2 );
			DemoStates = sDemoChangeSP6;
		break;

		case sDemoChangeSP6:
			switch( PerformMenu( sMenuChangeHiddenScreen2 ) )
			{
				case UPDATE_PAGE: 	DemoStates = sDemoDrawSP6; break;
				case NEXT_PAGE:		DemoStates = sDemoDefineDemoOrTest; break;
				default: break;
			}
		break;
			
		
		case sDemoDefineDemoOrTest:
			ChangeSettingsIfNotvalid();
			if ( MenuItems.name.eeprom_off == FALSE ) 
			{	
				//save the settings into the EEPROM
				for(i=0;i<NMBR_OF_MENU_ITEM;i++)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -