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

📄 radio.c

📁 LV24000的单片机DEMO程序
💻 C
📖 第 1 页 / 共 2 页
字号:
	// FM regions
	g_wFreqGrid = 10;	// Default: 100 kHz FM frequency grid for Japan/USA (in 10 kHz unit)
	switch (byRegion)
	{
	case REGION_NONE:	// No region - use hardware limit
		g_wDisplayBandLow = RfToDisplayFreq(g_wHwRfLow);
		g_wDisplayBandHigh = RfToDisplayFreq(g_wHwRfHigh);
		break;

	case REGION_JAPAN:	// Japan FM band
	case REGION_JAPAN_WIDE:	// Japan FM band
		SetDeemphasis(DEEMP_50);
		g_wDisplayBandLow  = 7600;		// Japan lower limit: 76 MHz
		g_wDisplayBandHigh = 9000;		// Japan upper limit: 90 MHz
		if (byRegion == REGION_JAPAN_WIDE)
			g_wDisplayBandHigh = 10775;	// Japan wide upper limit: 107.75 MHz
		break;

	case REGION_US:		// US FM band
		SetDeemphasis(DEEMP_75);
		g_wDisplayBandLow  = 8750;		// Europe lower limit: 87.5 MHz
		g_wDisplayBandHigh = 10800;		// Europe upper limit: 108 MHz
		break;

	//case REGION_EUROPE:	// Use Europe FM band as default
	default:
		byRegion = REGION_EUROPE;		// Make sure byRegion is valid
		SetDeemphasis(DEEMP_50);
		g_wDisplayBandLow  = 8750;		// Europe lower limit: 87.5 MHz
		g_wDisplayBandHigh = 10800;		// Europe upper limit: 108 MHz
		g_wFreqGrid = 5;			// Europe FM grid is 50 kHz (in 10 kHz unit)
		break;
	}
	// Update current region
	 g_byRegion = byRegion;
	return(LVLS_NO_ERROR);
} // End SetRegion

/* ************************************************************************************************
 *
 *  Function:   ScanStation
 *
 *  Authors:    Hung van Le
 *  Purpose:    Search for FM station
 *  Input:      byFlag: flag to control the scan:
 *			SCANSTN_DIR: scan direction
 *				      1 => scan up (increase frequency).
 *				      0 => scan down (decrease frequency)
 *			SCANSTN_AUTO: 1=> Auto scan: scan whole band in specified direction with fieldstrength in g_byScanLevel
 *						     Return found station via callback with reason CBRN_ASCAN_FOUND
 *			              0=> Search for next/previous station with fieldstrength in g_byScanLevel
 *  Output:     Status as defined in LvErr.h
 *  Global:	g_byStnFlag:
 *			STN_VALID (W): clear when the scan starts, after the scan it reflects the valid station
 *		g_wDisplayBandLow (RO): start frequency for the scan when wBeginFreq is 0
 *		g_wDisplayBandHigh (RO): end frequency for the scan when wEndFreq is 0
 *		g_byScanLevel: field strength level to accept/reject a station (must be set before enter this function)
 *			
 *  Comments:   The scan will be aborted when the callback function reports any error. So host can abort the scan by returning 
 *		error with the call back (out of storage for auto scan, user abort...)
 *
 * ************************************************************************************************
 * Copyright (c) 2004. Semiconductor Ideas to the Market (ItoM) B.V. All rights reserved.
 * ************************************************************************************************ */
BYTE ScanStation(BYTE byFlag)
{
	BYTE byResult;
	BOOL bOrgAudioMute, bOrgAudioMode; //, bOrgAgcSpeed;
	BOOL bDone;
	BYTE byStationFound;
	int  iDir;
	WORD wCfg;
	WORD wBeginFreq, wEndFreq, wOrgFreq;
	WORD wRfLimitLo, wRfLimitHi;

	// Scan direction
	if (byFlag & SCANSTN_DIR)
		iDir = 1;		// Scan up
	else
		iDir = -1;		// Scan down

	// Convert band limit to RF limt
	wRfLimitLo = DisplayFreqToRf(g_wDisplayBandLow) - g_wFreqGrid;	// Convert display to RF frequency (1 grid extra)
	wRfLimitHi = DisplayFreqToRf(g_wDisplayBandHigh) + g_wFreqGrid; // Convert display to RF frequency (1 grid extra)

	// Initialize the scan limits according to scan mode
	wOrgFreq = 0;	// To avoid compiler warning W303 (uninitialized var.)
	if (byFlag & SCANSTN_AUTO)	// Auto search 
	{
		wBeginFreq = wRfLimitLo;
		wEndFreq = wRfLimitHi;
		// Determine start frequency
		if (iDir>0)
			g_wLastSetRF = wBeginFreq; 	// Scan up - start from lower limit
		else
			g_wLastSetRF = wEndFreq;	// Scan down - start from upper limit
		g_byStnFlag &= (~STN_VALID);	 	// No valid station
	}
	else // Search next mode
	{
		// Make sure we have a valid current frequency
		CheckRfLimit(&g_wLastSetRF, wRfLimitLo, wRfLimitHi, iDir);
		wOrgFreq = g_wLastSetRF; // This is our start frequency
		
		// Determine scan boundary
		if (iDir>0)	// Scan up
		{
			// Scan up from current frequency to upper limit
			wBeginFreq = g_wLastSetRF; // start at current frequency
			wEndFreq = wRfLimitHi;

			// Adjust the start frequency in special case
			if (wOrgFreq == wRfLimitHi) 	// Scanning up starting at high limit
				wOrgFreq++;
		}
		else		// Scan down
		{
			// Scan down from current frequency to lower limit
			wBeginFreq = wRfLimitLo;
			wEndFreq = g_wLastSetRF;

			// Adjust the start frequency in special case
			if (wOrgFreq == wRfLimitLo) 	// Scanning up starting at high limit
				wOrgFreq--;
		}
	}
		
	// Select correct oscillator output and enable measuring mode
	wCfg = SetUpChipMode(CO_RF_OSC|CHIP_MEASURE_MODE|CHIP_AFC_OFF);

	// Prepare the chip for scanning
	bOrgAudioMute = SetChipAudioMute(TRUE, MUTESRC_OPERATION);		// Mute audio
	// @@@ Speed up AGC for faster field strength measurement: already enabled by default
	// bOrgAgcSpeed = DriveBit(IR01_RADIO_CTRL2_REG, IR1_RCTL2_AGC_SPD, TRUE);
		
	// Force mono mode before scanning
	bOrgAudioMode = SetChipStereo(FALSE);

	// Perform scan
	byStationFound = 0;
	bDone = FALSE;
	while (!bDone)
	{
	#ifdef SUPPORT_AMFM
		if ( (g_byStnFlag & STN_AM_MODE) == STN_AM_MODE )
			byResult = ScanAmRoutine(iDir, wBeginFreq, wEndFreq);
		else
			byResult = ScanFmRoutine(iDir, wBeginFreq, wEndFreq);
	#endif // SUPPORT_AMFM
	#ifdef FM_ONLY
		byResult = ScanFmRoutine(iDir, wBeginFreq, wEndFreq);
	#endif //FM_ONLY
		if (byResult==LVLS_NO_ERROR)
		{
			// Save the found station if auto scan mode
			if (byFlag & SCANSTN_AUTO)	// Auto search 
			{
				byStationFound++;
				byResult = CallBack(CRSN_ASCAN_FOUND);
				if (byResult != LVLS_NO_ERROR)
					bDone = TRUE;
			}
			else	// Normal scan mode
			{
				bDone = TRUE;	// Just scan once
					
				//if (m_bValidStation)
				//	FineTuneFmToIF(&m_bValidStation);
			}
		}
		else if (byResult == LVLS_RFFREQ_ENDOFBAND_ERR)	// End of band reached
		{
			if (byFlag & SCANSTN_AUTO)	// Auto scan mode 
			{
				bDone = TRUE;		// Done when end of band reached
			}
			else // Search mode
			{
				switch (g_byStnFlag & STN_WRAP_MODE)
				{
				case STNWRAP_NONE:	// No wrapping - terminate with end of band error
					bDone = TRUE;
					break;
					
				case STNWRAP_CONT:	// Continue wrapping - repeat the search at boundary
					wBeginFreq = wRfLimitLo;
					wEndFreq = wRfLimitHi;
					if (iDir>0)	// Scan up
						g_wLastSetRF = wBeginFreq;
					else		// Scan down
						g_wLastSetRF = wEndFreq;
					break;

				case STNWRAP_ONCE:	// Repeat the search until the start frequency reached again
					if (iDir>0)	// Scan up
					{
						if (g_wLastSetRF <= wOrgFreq)
						{
							byResult = LVLS_NO_STATION_FOUND_ERR;
							bDone = TRUE;
						}
						else
						{
							wBeginFreq = wRfLimitLo;
							wEndFreq = wOrgFreq;
							g_wLastSetRF = wBeginFreq;
						}
					}
					else		// Scan down
					{
						if (g_wLastSetRF >= wOrgFreq)
						{
							byResult = LVLS_NO_STATION_FOUND_ERR;
							bDone = TRUE;
						}
						else
						{
							wBeginFreq = wOrgFreq;
							wEndFreq = wRfLimitHi;
							g_wLastSetRF = wEndFreq;
						}
					}
					break;
				} // EndSwitch
			} // EndElse byFlag & SCANSTN_AUTO
		} // EndElseIf (byResult == LVLS_RFFREQ_ENDOFBAND_ERR
		else	// Other error - terminate
		{
			bDone = TRUE;
		}
	} // EndWhile
		
#ifdef USE_PRESET
	// Set last found station (only in auto scan mode)
	if (byStationFound > 0)
	{
		SetFrequency(RecallPreset(byStationFound-1));
	}
#endif //USE_PRESET

	// Restore chip config
	SetChipStereo(bOrgAudioMode);
	//@@@ DriveBit(IR01_RADIO_CTRL2_REG, IR1_RCTL2_AGC_SPD, bOrgAgcSpeed); //@@@ Restore AGC speed state
	SetChipAudioMute(bOrgAudioMute, MUTESRC_OPERATION);
	SetUpChipMode(wCfg);

	// Report the final status via callback
	CallBack(CRSN_STN_CHNG);
	return(byResult);
} // End ScanStation

⌨️ 快捷键说明

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