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

📄 radiomoduleswcmd.c

📁 SI47**系列DSP的收音芯片驱动C源代码
💻 C
字号:
//***************************************************************
//  ARM BOOT ROUTE VER1.0 for NXP_ARM release
//  bjwork2007@gmail.com
//  chenjun @ 2008-7-19
//***************************************************************

#include "..\inc\NXP_ARM.h"
#include "..\inc\usart.h"
#include "..\inc\common.h"
#include "..\inc\RadioModuleTypeDEF.h"
#include "..\inc\RadioModuleHwDrv.h"
#include "..\inc\RadioModuleSwCmd.h"
#include "..\inc\RadioModuleGUI.h"
#include "..\inc\RadioModuleAPI.h"

#ifdef UseSI473X_Radio

	RevInfoStruct		RadioRevInfo;
	FmTuneStatusStruct	FmTuneStatusInfo;
	FmRSQStatusStruct	FmRSQStatusInfo;
	FmRDSStatusStruct	FmRDSStatusInfo;
	FMAGCStatusStruct	FMAGCStatusInfo;
	AmTuneStatusStruct	AmTuneStatusInfo;
	AmRSQStatusStruct	AmRSQStatusInfo;
	
	RM_U8 Wait_CTS_High(RM_U8 CMD);
	#ifdef Radio_Module_Console_Debug
	void WaitContinue(void);
	#endif
	
	//CMD1 0x01
	RM_U8 RadioModule_Power_Up(RM_U8 PowerUpMode)
	{
		RM_U8 Status;
		RM_U8 PowerUpArray[3];
		
		AM_FM_Receive_SEL = PowerUpMode;
		switch(PowerUpMode)
		{
			case FM_Receive:
				PowerUpArray[0] = 0x01;
				#if(Osc_source==UseExtCYC)
					PowerUpArray[1] = 0xd0;
				#else
					PowerUpArray[1] = 0xc0;
				#endif
				PowerUpArray[2] = 0x05;
				#ifndef SI474X_Radio
					AMAntATU();
				#else
					AMPreAmpSwitch(TurnOffAMAmp);
					AM_ATTU(AMAttuOn);
				#endif
				break;
				
			case AM_Receive:
				PowerUpArray[0] = 0x01;
				#if(Osc_source==UseExtCYC)
					PowerUpArray[1] = 0xd1;
				#else
					PowerUpArray[1] = 0xc1;
				#endif
				PowerUpArray[2] = 0x05;
				#ifndef SI474X_Radio
					AMAntNoATU();
				#else
					AMPreAmpSwitch(TurnOnAMAmp);
					AM_ATTU(AMAttuOff);
				#endif
				break;
				
			default:
				#ifdef Radio_Module_Console_Debug
					puts("Error:Want to send unknown power up mode!\n");
				#endif
				#ifndef SI474X_Radio
					AMAntATU();
				#else
					AMPreAmpSwitch(TurnOffAMAmp);
					AM_ATTU(AMAttuOn);
				#endif
				return UnknownPowerUpMode;
				break;
		}
		ResetRadioModule();
		Delay(6000);
		Status = OpRadioModule(WriteOp,PowerUpArray,3);
		if(Status != OK)
			return Status;
		
		Status = Wait_CTS_High(Power_Up);
		if(Status != OK)
			return Status;
			
		Delay(500000);
		
		Status = RadioModule_Set_Prop(Prop_REFCLK_FREQ,CYCFreq);
		if(Status != OK)
			return Status;
		
		Delay(6000);
		
		switch(PowerUpMode)
		{
			case FM_Receive:
				Status = Rds_Enable();
				if(Status != OK)
					return Status;
				break;
			case AM_Receive:
				Status = Rds_Disable();
				if(Status != OK)
					return Status;
				break;
			default:
				Status = Rds_Disable();
				if(Status != OK)
					return Status;
				break;
		}	
				
	    return OK;
	}
	
	//CMD2 0x10
	RM_U8 RadioModule_Get_Rev(void)
	{
		RM_U8 Status;
		RM_U8 GetRevArray[2];
		
		GetRevArray[0] = 0x10;
		GetRevArray[1] = 0x00;
		
		Status = OpRadioModule(WriteOp,GetRevArray,2);
		if(Status != OK)
			return Status;
		
		Status = Wait_CTS_High(Get_Rev);
		if(Status != OK)
			return Status;
			
		Status = OpRadioModule(ReadOp,(RM_U8 *)(&RadioRevInfo),9);
		if(Status != OK)
			return Status;
		
		return OK;
	}
	
	//CMD3 0x11
	RM_U8 RadioModule_Power_Down(void)
	{
		RM_U8 Status;
		RM_U8 PD_cmd;
		
		PD_cmd = 0x11;
		
		Status = OpRadioModule(WriteOp,(RM_U8 *)(&PD_cmd),1);
		if(Status != OK)
			return Status;
		
		Status = Wait_CTS_High(Get_Rev);
		AMPTurnOff();
		
		return Status;	
	}
	
	//CMD4 0x12
	RM_U8 RadioModule_Set_Prop(RM_U16 PropName,RM_U16 PropVal)
	{
		RM_U8 Status;
		RM_U8 SetPropArray[6];
		
		SetPropArray[0] = 0x12;
		SetPropArray[1] = 0x00;
		SetPropArray[2] = (RM_U8)((PropName >> 8) & 0xff);
		SetPropArray[3] = (RM_U8)(PropName & 0xff);
		SetPropArray[4] = (RM_U8)((PropVal >> 8) & 0xff);
		SetPropArray[5] = (RM_U8)(PropVal & 0xff);
		
		Status = OpRadioModule(WriteOp,SetPropArray,6);
		if(Status != OK)
			return Status;
		
		Status = Wait_CTS_High(Set_Prop);
		
		return Status;	
	}
	
	//CMD5 0x13
	RM_U8 RadioModule_Get_Prop(RM_U16 PropName,RM_U16 *PropVal)
	{
		RM_U8 Status;
		RM_U8 GetPropArray[4];
		
		GetPropArray[0] = 0x13;
		GetPropArray[1] = 0x00;
		GetPropArray[2] = (RM_U8)((PropName >> 8) & 0xff);
		GetPropArray[3] = (RM_U8)(PropName & 0xff);
		
		Status = OpRadioModule(WriteOp,GetPropArray,4);
		if(Status != OK)
			return Status;
		
		Status = Wait_CTS_High(Get_Prop);
		if(Status != OK)
			return Status;
			
		//WaitContinue();//only for debug
		Status = OpRadioModule(ReadOp,GetPropArray,4);
		if(Status != OK)
			return Status;
		
		*PropVal = (RM_U16)(((GetPropArray[2] << 8) | GetPropArray[3]) & 0xffff);
		
		return OK;
	}
	
	//CMD6 0x14
	RM_U8 RadioModule_Get_Int_Status(RM_U8 *IntStatus)
	{
		RM_U8 Status;
		RM_U8 GetIntStatus_cmd;
		
		GetIntStatus_cmd = 0x14;
		Status = OpRadioModule(WriteOp,(RM_U8 *)(&GetIntStatus_cmd),1);
		if(Status != OK)
			return Status;
		
		Status = Wait_CTS_High(Get_Int_Status);
		if(Status != OK)
			return Status;
			
		Status = OpRadioModule(ReadOp,IntStatus,1);
		return Status;	
	}
	
	//CMD7 0x20
	RM_U8 RadioModule_FM_Tune_Freq(RM_U16 FMFreqVal,RM_U8 ANTCAP)
	{
		RM_U8 Status;
		RM_U8 FMTuneFreqArray[5];
		
		FMTuneFreqArray[0] = 0x20;
		FMTuneFreqArray[1] = 0x00;
		FMTuneFreqArray[2] = (RM_U8)((FMFreqVal >> 8) & 0xff);
		FMTuneFreqArray[3] = (RM_U8)(FMFreqVal & 0xff);
		FMTuneFreqArray[4] = ANTCAP;
		
		Status = OpRadioModule(WriteOp,FMTuneFreqArray,5);
		if(Status != OK)
			return Status;
		
		Status = Wait_CTS_High(FM_Tune_Freq);
		
		return Status;
	}
		
	//CMD8 0x21
	RM_U8 RadioModule_FM_Seek_Start(RM_U8 SeekMode)
	{						
		RM_U8 Status;							//SeekUp_Halt		
		RM_U8 FMSeekStartArray[2];				//SeekUp_Wrap	
												//SeekDn_Halt
		FMSeekStartArray[0] = 0x21;				//SeekDn_Wrap
		FMSeekStartArray[1] = SeekMode;
		
		Status = OpRadioModule(WriteOp,FMSeekStartArray,2);
		if(Status != OK)
			return Status;
		
		Status = Wait_CTS_High(FM_Seek_Start);
		
		return Status;
	}
	
	//CMD9 0x22
	RM_U8 RadioModule_FM_Tune_Status(RM_U8 SetTuneStatus)
	{					
		RM_U8 Status;							//Clr_Seek_Tune_Int
		RM_U8 FMTuneStatusArray[2];				//Cancel_Seek
		
		FMTuneStatusArray[0] = 0x22;
		FMTuneStatusArray[1] = SetTuneStatus;
		
		Status = OpRadioModule(WriteOp,FMTuneStatusArray,2);
		if(Status != OK)
			return Status;
		
		Status = Wait_CTS_High(FM_Tune_Status);
		if(Status != OK)
			return Status;
		
		Status = OpRadioModule(ReadOp,(RM_U8 *)(&FmTuneStatusInfo),8);
		if(Status != OK)
			return Status;
		
		return OK;
	}
	
	//CMD10 0x23
	RM_U8 RadioModule_FM_RSQ_Status(RM_U8 ClrRSQInt)
	{				
		RM_U8 Status;							//Get_RSQ_Status
		RM_U8 FMRSQStatusArray[2];				//Clr_RSQ_Int
		
		FMRSQStatusArray[0] = 0x23;
		FMRSQStatusArray[1] = ClrRSQInt;
		
		Status = OpRadioModule(WriteOp,FMRSQStatusArray,2);
		if(Status != OK)
			return Status;
		
		Status = Wait_CTS_High(FM_RSQ_Status);
		if(Status != OK)
			return Status;
		
		Status = OpRadioModule(ReadOp,(RM_U8 *)(&FmRSQStatusInfo),8);
		if(Status != OK)
			return Status;
		
		return OK;
	}
	
	//CMD11 0x24
	RM_U8 RadioModule_FM_RDS_Status(RM_U8 GetRDSStatus)
	{
		RM_U8 Status;							//FM_RDS_Status_Only
		RM_U8 FMRDSStatusArray[2];				//FM_Empty_RDS_FIFO
												//FM_Clr_RDS_Int
		FMRDSStatusArray[0] = 0x24;
		FMRDSStatusArray[1] = GetRDSStatus;
		
		Status = OpRadioModule(WriteOp,FMRDSStatusArray,2);
		if(Status != OK)
			return Status;
		
		Status = Wait_CTS_High(FM_RSQ_Status);
		if(Status != OK)
			return Status;
		
		if(GetRDSStatus == FM_RDS_Status_Only)
		{
			Status = OpRadioModule(ReadOp,(RM_U8 *)(&FmRDSStatusInfo),13);
			if(Status != OK)
				return Status;
		}
		
		return OK;
	}
	
	//CMD12 0x27
	RM_U8 RadioModule_FM_AGC_Status(void)
	{
		RM_U8 Status;
		RM_U8 FMAGCStatusCMD;
		
		FMAGCStatusCMD = 0x27;
		
		Status = OpRadioModule(WriteOp,(RM_U8 *)(&FMAGCStatusCMD),1);
		if(Status != OK)
			return Status;
		
		Status = Wait_CTS_High(FM_AGC_Status);
		if(Status != OK)
			return Status;
		
		Status = OpRadioModule(ReadOp,(RM_U8 *)(&FMAGCStatusInfo),3);
		if(Status != OK)
			return Status;
		
		return OK;
	}	
	
	//CMD13 0x28
	RM_U8 RadioModule_FM_AGC_Override(RM_U8	AGC_Dis,RM_U8 LNA_Gain_Index)
	{	
		RM_U8 Status;
		RM_U8 FMAGCOverrideArray[3];
		
		FMAGCOverrideArray[0] = 0x28;
		FMAGCOverrideArray[1] = (AGC_Dis & 0x01);
		if(LNA_Gain_Index > 0x1a)
			FMAGCOverrideArray[2] = 0x1a;
		else
			FMAGCOverrideArray[2] = LNA_Gain_Index;
		
		Status = OpRadioModule(WriteOp,(RM_U8 *)(&FMAGCOverrideArray),1);
		if(Status != OK)
			return Status;
		
		Status = Wait_CTS_High(FM_AGC_Override);
		
		return Status;
	}
	
	//CMD14 0x40
	RM_U8 RadioModule_AM_Tune_Freq(RM_U16 AMFreqVal,RM_U16 ANTCAP)
	{
		RM_U8 Status;
		RM_U8 AMTuneFreqArray[6];
		
		AMTuneFreqArray[0] = 0x40;
		AMTuneFreqArray[1] = 0x00;
		AMTuneFreqArray[2] = (RM_U8)((AMFreqVal >> 8) & 0xff);
		AMTuneFreqArray[3] = (RM_U8)(AMFreqVal & 0xff);
		AMTuneFreqArray[4] = (RM_U8)((ANTCAP >> 8) & 0xff);
		AMTuneFreqArray[5] = (RM_U8)(ANTCAP & 0xff);
		
		Status = OpRadioModule(WriteOp,AMTuneFreqArray,6);
		if(Status != OK)
			return Status;
		
		Status = Wait_CTS_High(AM_Ture_Freq);
		
		return Status;
	}
	
	//CMD15 0x41
	RM_U8 RadioModule_AM_Seek_Start(RM_U8 SeekMode)
	{
		RM_U8 Status;							//SeekUp_Wrap
		RM_U8 AMSeekStartArray[2];				//SeekUp_Halt
												//SeekDn_Wrap
		AMSeekStartArray[0] = 0x41;				//SeekDn_Halt
		AMSeekStartArray[1] = SeekMode;
		
		Status = OpRadioModule(WriteOp,AMSeekStartArray,2);
		if(Status != OK)
			return Status;
		
		Status = Wait_CTS_High(AM_Seek_Start);
		
		return Status;
	}
	
	//CMD16 0x42
	RM_U8 RadioModule_AM_Tune_Status(RM_U8 SetTuneStatus)
	{		
		RM_U8 Status;							//Cancel_Seek
		RM_U8 AMTuneStatusArray[2];				//Clr_Seek_Tune_Int
		
		AMTuneStatusArray[0] = 0x42;
		AMTuneStatusArray[1] = SetTuneStatus;
		
		Status = OpRadioModule(WriteOp,AMTuneStatusArray,2);
		if(Status != OK)
			return Status;
		
		Status = Wait_CTS_High(AM_Tune_Status);
		if(Status != OK)
			return Status;
		
		Status = OpRadioModule(ReadOp,(RM_U8 *)(&AmTuneStatusInfo),8);
		if(Status != OK)
			return Status;
		
		return OK;
	}
	
	//CMD17 0x43
	RM_U8 RadioModule_AM_RSQ_Status(RM_U8 ClrRSQInt)
	{
		RM_U8 Status;
		RM_U8 AMRDSStatusArray[2];
		
		AMRDSStatusArray[0] = 0x43;
		AMRDSStatusArray[1] = ClrRSQInt & 0x01;
		
		Status = OpRadioModule(WriteOp,AMRDSStatusArray,2);
		if(Status != OK)
			return Status;
		
		Status = Wait_CTS_High(AM_RSQ_Status);
		if(Status != OK)
			return Status;
		
		Status = OpRadioModule(ReadOp,(RM_U8 *)(&AmRSQStatusInfo),6);
		if(Status != OK)
			return Status;
		
		return OK;	
	}
	
	//CMD18 0x80
	RM_U8 RadioModule_GPO_CTL(RM_U8 Mode)
	{
		RM_U8 Status;
		RM_U8 GPOCTLArray[2];
		
		GPOCTLArray[0] = 0x80;
		GPOCTLArray[1] = Mode & 0x0e;
		
		Status = OpRadioModule(WriteOp,GPOCTLArray,2);
		if(Status != OK)
			return Status;
		
		Status = Wait_CTS_High(AM_Seek_Start);
		
		return Status;
	}
	
	//CMD19 0x81
	RM_U8 RadioModule_GPO_SET(RM_U8 Level)
	{
		RM_U8 Status;
		RM_U8 GPOLevelArray[2];
		
		GPOLevelArray[0] = 0x81;
		GPOLevelArray[1] = Level & 0x0e;
		
		Status = OpRadioModule(WriteOp,GPOLevelArray,2);
		if(Status != OK)
			return Status;
		
		Status = Wait_CTS_High(AM_Seek_Start);
		
		return Status;	
	}
	
	RM_U8 Wait_CTS_High(RM_U8 CMD)
	{
		RM_U16 Loop;
		RM_U8 Status;
		RM_U8 CTS_Status;
		
		Loop = 0;
		do
		{
			Status = OpRadioModule(ReadOp,(RM_U8 *)(&CTS_Status),1);
			if(Status != OK)
				return Status;
			Loop++;	
		}
		while(((CTS_Status & 0x80) != 0x80) && (Loop<0xfff));
		//printf("Status = 0x%.2x  , CTS_Status = 0x%.2x\n",Status,CTS_Status);
		if(Loop>=0xfff)
		{
			#ifdef Radio_Module_Console_Debug
				switch(CMD)
				{
					case Power_Up:			puts("CMD Power_Up wait CTS to high EXP loop times limit!\n");break;
					case Get_Rev:			puts("CMD Get_Rev wait CTS to high EXP loop times limit!\n");break;
					case Power_Down:		puts("CMD Power_Down wait CTS to high EXP loop times limit!\n");break;
					case Set_Prop:			puts("CMD Set_Prop wait CTS to high EXP loop times limit!\n");break;
					case Get_Prop:			puts("CMD Get_Prop wait CTS to high EXP loop times limit!\n");break;
					case Get_Int_Status:	puts("CMD Get_Int_Status wait CTS to high EXP loop times limit!\n");break;
					case FM_Tune_Freq:		puts("CMD FM_Tune_Freq wait CTS to high EXP loop times limit!\n");break;
					case FM_Seek_Start:		puts("CMD FM_Seek_Start wait CTS to high EXP loop times limit!\n");break;
					case FM_Tune_Status:	puts("CMD FM_Tune_Status wait CTS to high EXP loop times limit!\n");break;
					case FM_RSQ_Status:		puts("CMD FM_RSQ_Status wait CTS to high EXP loop times limit!\n");break;
					case FM_RDS_Status:		puts("CMD FM_RDS_Status wait CTS to high EXP loop times limit!\n");break;
					case FM_AGC_Status:		puts("CMD FM_AGC_Status wait CTS to high EXP loop times limit!\n");break;
					case FM_AGC_Override:	puts("CMD FM_AGC_Override wait CTS to high EXP loop times limit!\n");break;
					case AM_Ture_Freq:		puts("CMD AM_Ture_Freq wait CTS to high EXP loop times limit!\n");break;
					case AM_Seek_Start:		puts("CMD AM_Seek_Start wait CTS to high EXP loop times limit!\n");break;
					case AM_Tune_Status:	puts("CMD AM_Tune_Status wait CTS to high EXP loop times limit!\n");break;
					case AM_RSQ_Status:		puts("CMD AM_RSQ_Status wait CTS to high EXP loop times limit!\n");break;
					case GPO_CTL:			puts("CMD GPO_CTL wait CTS to high EXP loop times limit!\n");break;
					case GPO_SET:			puts("CMD GPO_SET wait CTS to high EXP loop times limit!\n");break;
					default:break;
				}
			#endif
			return LoopEXPLimit;
		}		
		
		return OK;
	}
	
	//only for debug
	#ifdef Radio_Module_Console_Debug
	void WaitContinue(void)
	{
		RM_S8 key;
		
		puts("press c to continue!\n");
		for(;;)
		{
			if(kbhit())
			{
				key = getkey();
				if(key=='c'||key=='C')
					return;
			}
		}
	}
	#endif
	
#endif

⌨️ 快捷键说明

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