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

📄 si47xx_tx.c

📁 si47xx FM 收音机的程序,通过单片机来控制搜台灯功能
💻 C
📖 第 1 页 / 共 2 页
字号:
        Si47XX_tune_power[3] = (tune_power&0x00ff);
        
	//send CMD
 	error_ind = OperationSi47XX_2w(WRITE, &(Si47XX_tune_power[0]), 5);
	if(error_ind)
		return I2C_ERROR;

	//wait CTS = 1
	do
	{	
		error_ind = OperationSi47XX_2w(READ, &(Si47XX_reg_data[0]), 1);
		if(error_ind)
			return I2C_ERROR;	
		loop_counter++;
	}
	while(((Si47XX_reg_data[0]) != 0x80) && (loop_counter < 0xff));  //loop_counter limit should guarantee at least 300us	
	
	if(loop_counter >= 0xff)
		return LOOP_EXP_ERROR;	

	return OK;

}

/**************************************

Si47XX_Tune_Freq()

***************************************/

static T_ERROR_OP Si47XX_Tune_Freq(unsigned short tune_freq)
{
	unsigned short loop_counter = 0;
	unsigned char Si47XX_reg_data[32];	
	unsigned char error_ind = 0;
	unsigned char Si47XX_tune_freq[] = {0x30,0x00,0x27,0x10};	//0x2710=10000=100.00MHz	
	
	Si47XX_tune_freq[2] = (tune_freq&0xff00) >> 8; 
  Si47XX_tune_freq[3] = (tune_freq&0x00ff);

	//send CMD
 	error_ind = OperationSi47XX_2w(WRITE, &(Si47XX_tune_freq[0]), 4);
	if(error_ind)
		return I2C_ERROR;

	//wait CTS = 1
	do
	{	
		error_ind = OperationSi47XX_2w(READ, &(Si47XX_reg_data[0]), 1);
		if(error_ind)
			return I2C_ERROR;	
		loop_counter++;
	}
	while(((Si47XX_reg_data[0]) != 0x80) && (loop_counter < 0xff));  //loop_counter limit should guarantee at least 300us
	
	if(loop_counter >= 0xff)
		return LOOP_EXP_ERROR;	

	return OK;

}

/**************************************

Si47XX_Wait_STC(): wait STC = 1 (then clear it-removed)

***************************************/

T_ERROR_OP Si47XX_Wait_STC(void)
{
	unsigned short loop_counter = 0, loop_counter_1 = 0;
	unsigned char Si47XX_reg_data[32];	
	unsigned char error_ind = 0;
	unsigned char Si47XX_get_int_status[] = {0x14};	

	do
	{	
		//send CMD
 	  error_ind = OperationSi47XX_2w(WRITE, &(Si47XX_get_int_status[0]), 1);
	  if(error_ind)
		  return I2C_ERROR;

	  /* wait CTS = 1 and then wait STCINT = 1 */
	  do
	  {	
		  error_ind = OperationSi47XX_2w(READ, &(Si47XX_reg_data[0]), 1);
		  if(error_ind)
			  return I2C_ERROR;	
		  loop_counter_1++;
	  }
	  while(((Si47XX_reg_data[0]&0x80) == 0) && (loop_counter_1 < 0xff));  //loop_counter limit should guarantee at least 300us
	
	  if(loop_counter_1 >= 0xff)
		  return LOOP_EXP_ERROR;
		  
		loop_counter_1 = 0;
	  /* wait CTS end */
	  
	  error_ind = OperationSi47XX_2w(READ, &(Si47XX_reg_data[0]), 1);
	  if(error_ind)
		  return I2C_ERROR;	
	  loop_counter++;
	}
	while(((Si47XX_reg_data[0]&0x01) == 0) && (loop_counter < 0xffff));  //loop_counter(0xffff) limit should guarantee at least: for FM,worst case = 60ms*((108-87.5)/0.1+1)= 12s to wait STC = 1
																																			 //																										   for AM,worst case = 80ms*((1710-520)/9+1)= 11s to wait STC = 1
	if(loop_counter == 0xffff)
		return LOOP_EXP_ERROR;	

	return OK;

}

/**************************************

Si47XX_Power_Down()

***************************************/

T_ERROR_OP Si47XX_Power_Down(void)
{
	unsigned short loop_counter = 0;
	unsigned char Si47XX_reg_data[32];	
	unsigned char error_ind = 0;
	unsigned char Si47XX_power_down[] = {0x11};	

	//send CMD
 	error_ind = OperationSi47XX_2w(WRITE, &(Si47XX_power_down[0]), 1);
	if(error_ind)
		return I2C_ERROR;

	//wait CTS = 1
	do
	{	
		error_ind = OperationSi47XX_2w(READ, &(Si47XX_reg_data[0]), 1);
		if(error_ind)
			return I2C_ERROR;	
		loop_counter++;
	}
	while(((Si47XX_reg_data[0]) != 0x80) && (loop_counter < 0xff));  //loop_counter limit should guarantee at least 300us
	
	if(loop_counter >= 0xff)
		return LOOP_EXP_ERROR;	

	return OK;

}


/**************************************

Si47XX_Set_TX_Power()

***************************************/

T_ERROR_OP Si47XX_Set_TX_Power(unsigned short tune_power)
{
	if(Si47XX_Tune_Power(tune_power) != OK) return ERROR;
	if(Si47XX_Wait_STC() != OK) return ERROR;
	return OK;
}

/**************************************

Si47XX_Set_TX_Frequency()

7600~10800

***************************************/

T_ERROR_OP Si47XX_Set_TX_Frequency(unsigned short tune_freq)
{
	if(Si47XX_Tune_Freq(tune_freq) != OK) return ERROR;
	if(Si47XX_Wait_STC() != OK) return ERROR;	
	return OK;
}

/***************************************

static Si47XX_Tune_Measure_Start(), only for Si4712/3

****************************************/

static T_ERROR_OP Si47XX_Tune_Measure_Start(unsigned short tune_freq)
{
	unsigned short loop_counter = 0;
	unsigned char Si47XX_reg_data[32];	
	unsigned char error_ind = 0;
	unsigned char Si47XX_tune_measure[] = {0x32,0x00,0x27,0x10,0x00};	//0x2710=10000=100.00MHz	
	
	Si47XX_tune_measure[2] = (tune_freq&0xff00) >> 8; 
  Si47XX_tune_measure[3] = (tune_freq&0x00ff);

	//send CMD
 	error_ind = OperationSi47XX_2w(WRITE, &(Si47XX_tune_measure[0]), 5);
	if(error_ind)
		return I2C_ERROR;

	//wait CTS = 1
	do
	{	
		error_ind = OperationSi47XX_2w(READ, &(Si47XX_reg_data[0]), 1);
		if(error_ind)
			return I2C_ERROR;	
		loop_counter++;
	}
	while(((Si47XX_reg_data[0]) != 0x80) && (loop_counter < 0xff));  //loop_counter limit should guarantee at least 300us
	
	if(loop_counter >= 0xff)
		return LOOP_EXP_ERROR;	

	return OK;

}

/**************************************

static Si47XX_TX_Tune_Status_RPS(), only for Si4712/3

***************************************/

static T_ERROR_OP Si47XX_TX_Tune_Status_RPS(unsigned char *noise_level)
{
	unsigned short loop_counter = 0;
	unsigned char Si47XX_reg_data[32];	
	unsigned char error_ind = 0;
	unsigned char Si47XX_fm_tune_status[] = {0x33,0x01};		

	//send CMD
 	error_ind = OperationSi47XX_2w(WRITE, &(Si47XX_fm_tune_status[0]), 2);
	if(error_ind)
		return I2C_ERROR;

	//wait CTS = 1
	do
	{	
		error_ind = OperationSi47XX_2w(READ, &(Si47XX_reg_data[0]), 1);
		if(error_ind)
			return I2C_ERROR;	
		loop_counter++;
	}
	while(((Si47XX_reg_data[0]) != 0x80) && (loop_counter < 0xff));  //loop_counter limit should guarantee at least 300us
	
	if(loop_counter >= 0xff)
		return LOOP_EXP_ERROR;	
		
	error_ind = OperationSi47XX_2w(READ, &Si47XX_reg_data[0], 8);	
	if(error_ind)
		return I2C_ERROR;
		
	*noise_level = Si47XX_reg_data[7];

	return OK;

}
/***************************************

Si47XX_Tune_Measure_RPS(), only for Si4712/3

tune_freq: 7600~10800

****************************************/

T_ERROR_OP Si47XX_Tune_Measure_RPS(unsigned short tune_freq, unsigned char *noise_level)
{
	if(Si47XX_Tune_Measure_Start(tune_freq) != OK) return ERROR;
	if(Si47XX_Wait_STC() != OK) return ERROR;
	//read rps result:
	if(Si47XX_TX_Tune_Status_RPS(noise_level) != OK) return ERROR;	
		
	return OK;
}

/***************************************

Si47XX_Min_RNL_Channel_RPS(), only for Si4712/13/20/21

tune_freq: 8750~10800

By AN307, Space: 100KHz

Suppose 108.1MHz&108.2MHz no any station

need measure 87.3&87.4MHz

****************************************/

T_ERROR_OP Si47XX_Min_RNL_Channel_RPS(unsigned short start_channel, unsigned short stop_channel, unsigned short *Min_RNL_Channel)
{
	unsigned char weight_coeff[] = {1,2,6,2,1};
	unsigned char Last_Five_RNL[] = {0,0,0,0,0};
	unsigned char j, noise_level;
	unsigned short i, current_channel_RNL, last_channel_RNL = 65535;
	
	for(i=(start_channel-10*2),j=0; i<=(stop_channel+10*2); i=i+10,j++)
	{
		if((i>=8730)&&(i<=10800))
		{
			Si47XX_Tune_Measure_RPS(i, &noise_level);
			Last_Five_RNL[j%5] = noise_level;
		}
		else
			Last_Five_RNL[j%5] = 0;
		
		if(j>=4)
		{																															//RNL_index	coeff_index
			current_channel_RNL = Last_Five_RNL[j%5]*weight_coeff[4] + 	//4->0->1		4->4->4
												Last_Five_RNL[(j-1)%5]*weight_coeff[3] + 	//3->4->0		3->3->3
												Last_Five_RNL[(j-2)%5]*weight_coeff[2] + 	//2->3->4		2->2->2
												Last_Five_RNL[(j-3)%5]*weight_coeff[1] + 	//1->2->3		1->1->1
												Last_Five_RNL[(j-4)%5]*weight_coeff[0];		//0->1->2		0->0->0
		  if(current_channel_RNL <= last_channel_RNL)
		  {
		  	*Min_RNL_Channel = i - 10*2;
		  	last_channel_RNL = current_channel_RNL;
		  }
		}
	}
	
	return OK;
}












⌨️ 快捷键说明

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