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

📄 si47xx_rx_wb.c

📁 si47xx FM 收音机的程序,通过单片机来控制搜台灯功能
💻 C
字号:
/**************************************

Si47XX WB RX part

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

#include "Si47xx_common.h"

extern void	Customer_Action_For_Alert(void);	
extern void	Customer_Decode_SAME_Message(unsigned char Msg_Len, unsigned char *pHeader_Array_All);	//max length = 255 bytes

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

Si47XX_Set_Property_WB_ASQ_INT_SOURCE()

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

T_ERROR_OP Si47XX_Set_Property_WB_ASQ_INT_SOURCE(void)
{
	unsigned short loop_counter = 0;
	unsigned char Si47XX_reg_data[32];	
	unsigned char error_ind = 0;
	unsigned char Si47XX_set_property[] = {0x12,0x00,0x56,0x00,0x00,0x01};	//ALERT_ON_IEN

	//send CMD
 	error_ind = OperationSi47XX_2w(WRITE, &(Si47XX_set_property[0]), 6);
	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_Property_WB_SAME_INT_SOURCE()

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

T_ERROR_OP Si47XX_Set_Property_WB_SAME_INT_SOURCE(void)
{
	unsigned short loop_counter = 0;
	unsigned char Si47XX_reg_data[32];	
	unsigned char error_ind = 0;
	unsigned char Si47XX_set_property[] = {0x12,0x00,0x55,0x00,0x00,0x01};	//HEADER BUFFER READY INT

	//send CMD
 	error_ind = OperationSi47XX_2w(WRITE, &(Si47XX_set_property[0]), 6);
	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_WB_Tune_Freq()

162400KHz,162425KHz...162550KHz(7 frequency)
64960~65020

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

static T_ERROR_OP Si47XX_WB_Tune_Freq(unsigned int channel_freq)
{
	unsigned short loop_counter = 0;
	unsigned char Si47XX_reg_data[32];	
	unsigned char error_ind = 0;
	unsigned char Si47XX_tune_freq[] = {0x50,0x00,0xFD,0xC0};	//0xFDC0=64960=162.4MHz
	
	Si47XX_tune_freq[2] = ((channel_freq*4/10)&0xff00) >> 8;
	Si47XX_tune_freq[3] = ((channel_freq*4/10)&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;

}

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

static Si47XX_WB_ASQ_Status()

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

static T_ERROR_OP Si47XX_WB_ASQ_Status(unsigned char *pAlert_On)
{
	unsigned short loop_counter = 0;
	unsigned char Si47XX_reg_data[32];	
	unsigned char error_ind = 0;
	unsigned char Si47XX_wb_asq_status[] = {0x55,0x00};
	/*
	unsigned char Si47XX_wb_asq_status[] = {0x55,0x01};		//can't clear ASQ int bit here	
	*/	

	//send CMD
 	error_ind = OperationSi47XX_2w(WRITE, &(Si47XX_wb_asq_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], 3);	
	if(error_ind)
		return I2C_ERROR;
		
	*pAlert_On = Si47XX_reg_data[1]&0x01;
	
	return OK;

}

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

static Si47XX_WB_ASQ_Status_Int_Clear()

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

static T_ERROR_OP Si47XX_WB_ASQ_Status_Int_Clear(void)
{
	unsigned short loop_counter = 0;
	unsigned char Si47XX_reg_data[32];	
	unsigned char error_ind = 0;
	unsigned char Si47XX_wb_asq_status[] = {0x55,0x01};

	//send CMD
 	error_ind = OperationSi47XX_2w(WRITE, &(Si47XX_wb_asq_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;	
			
	return OK;

}

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

static Si47XX_WB_SAME_Status_Int_Clear()


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

static T_ERROR_OP Si47XX_WB_SAME_Status_Int_Clear(void)
{
	unsigned short loop_counter = 0;
	unsigned char Si47XX_reg_data[32];	
	unsigned char error_ind = 0;
	unsigned char Si47XX_wb_same_status[] = {0x54,0x01,0x00};	

	//send CMD
 	error_ind = OperationSi47XX_2w(WRITE, &(Si47XX_wb_same_status[0]), 3);
	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_WB_SAME_Status_HeaderReady()


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

static T_ERROR_OP Si47XX_WB_SAME_Status_HeaderReady(unsigned char *pHeader_Ready)
{
	unsigned short loop_counter = 0;
	unsigned char Si47XX_reg_data[32];	
	unsigned char error_ind = 0;
	unsigned char Si47XX_wb_same_status[] = {0x54,0x00,0x00};	
	/*	
	unsigned char Si47XX_wb_same_status[] = {0x54,0x01,0x00};		//can't clear SAME int bit here
	*/

	//send CMD
 	error_ind = OperationSi47XX_2w(WRITE, &(Si47XX_wb_same_status[0]), 3);
	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], 2);	
	if(error_ind)
		return I2C_ERROR;
		
	*pHeader_Ready = Si47XX_reg_data[1]&0x01;
	
	
	return OK;

}

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

static Si47XX_WB_SAME_Status_HeaderBuffer()

SAME_header_idx: 0,8,16...

The first byte is NOT "ZCZC" but "-"!

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

static T_ERROR_OP Si47XX_WB_SAME_Status_HeaderBuffer(unsigned char SAME_header_idx, unsigned char *pMsg_Len, unsigned char *pHeader_Array_Short)
{
	unsigned short loop_counter = 0;
	unsigned char Si47XX_reg_data[32];	
	unsigned char i, error_ind = 0;
	unsigned char Si47XX_wb_same_status[] = {0x54,0x00,0x00};		
	/*
	unsigned char Si47XX_wb_same_status[] = {0x54,0x01,0x00};		//can't clear SAME int bit here
	*/

  Si47XX_wb_same_status[2] = SAME_header_idx;
	//send CMD
 	error_ind = OperationSi47XX_2w(WRITE, &(Si47XX_wb_same_status[0]), 3);
	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], 14);	
	if(error_ind)
		return I2C_ERROR;
	
	*pMsg_Len = Si47XX_reg_data[3];
	
	for(i=6;i<=13;i++)
	  *(pHeader_Array_Short++) = Si47XX_reg_data[i];
		
	return OK;

}

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

static Read_All_Header_Buffer()

pMsg_Len: 0~255
pHeader_Array_All: 255 bytes array

The first byte is NOT "ZCZC" but "-"

***************************************/
static T_ERROR_OP Read_All_Header_Buffer(unsigned char *pMsg_Len, unsigned char *pHeader_Array_All)
{
	unsigned char i;
	
	Si47XX_WB_SAME_Status_HeaderBuffer(0, pMsg_Len, pHeader_Array_All);
	
	for(i=8; i<(*pMsg_Len); i+ = 8)
  {
  	pHeader_Array_All+ = 8;
  	Si47XX_WB_SAME_Status_HeaderBuffer(i, pMsg_Len, pHeader_Array_All);
  }
	return OK;
}


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

Si47XX_Set_WB_Frequency()

channel_freq: 162400KHz,162425KHz...162550KHz(totall 7 frequency)

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

T_ERROR_OP Si47XX_Set_WB_Frequency(unsigned int channel_freq)
{
	if(Si47XX_WB_Tune_Freq(channel_freq) != OK) return ERROR;
	if(Si47XX_Wait_STC() != OK) return ERROR;	
	return OK;
}



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

Si47XX_SAME_ISR(): ASQ/SAME ISR: Non-reentry routine

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

T_ERROR_OP Si47XX_SAME_ISR(void)
{
	unsigned short loop_counter = 0;
	unsigned char Si47XX_reg_data[32];	
	unsigned char Header_Array_All[255];
	unsigned char Msg_Len, error_ind = 0, Alert_On = 0, Header_Ready = 0;
	unsigned char Si47XX_get_int_status[] = {0x14};	

	//send CMD
 	error_ind = OperationSi47XX_2w(WRITE, &(Si47XX_get_int_status[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) == 0) && (loop_counter < 0x3f));  //loop_counter limit should guarantee at least 300us
	
	  if(loop_counter >= 0x3f)
		  return LOOP_EXP_ERROR;
		  
		loop_counter = 0;
	  /* wait CTS end */

	error_ind = OperationSi47XX_2w(READ, &(Si47XX_reg_data[0]), 1);
	if(error_ind)
		return I2C_ERROR;	
		
  //check whether it's ASQ interrupt		
	if((Si47XX_reg_data[0]&0x02) != 0)
	{  
	  //whether it's ALERT_ON:
	  Si47XX_WB_ASQ_Status(&Alert_On);
	  if(Alert_On)
	  	Customer_Action_For_Alert();
	  	
	  Si47XX_WB_ASQ_Status_Int_Clear();
	}
	
	//check whether it's SAME interrupt		
	if((Si47XX_reg_data[0]&0x04) != 0)
	{  
	  //whether it's HEADER_READY:
	  Si47XX_WB_SAME_Status_HeaderReady(&Header_Ready);
	  if(Header_Ready)
	  {
	  	Read_All_Header_Buffer(&Msg_Len, &(Header_Array_All[0]));
	  	Customer_Decode_SAME_Message(Msg_Len, &(Header_Array_All[0]));
	  }
	  
	  Si47XX_WB_SAME_Status_Int_Clear();
	}

	return OK;

}











⌨️ 快捷键说明

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