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

📄 si47xx_rds_tx.c

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

Si47XX RDS TX part

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

#include "Si47xx_common.h"

extern unsigned char *CUSTOMER_ROUTINE(void);  //need completed by customer, return 6 bytes once call or NULL if no block remains


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

T_ERROR_OP Si47XX_Set_Property_TX_Component_Enable(void)

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

T_ERROR_OP Si47XX_Set_Property_TX_Component_Enable(void)
{
	unsigned short loop_counter = 0;
	unsigned char Si47XX_reg_data[32];	
	unsigned char error_ind = 0;
	unsigned char Si47XX_set_property[] = {0x12,0x00,0x21,0x00,0x00,0x07};	//enable LMR(L-R), pilot and RDS

	//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_TX_RDS_int_source()

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

T_ERROR_OP Si47XX_Set_Property_TX_RDS_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,0x2c,0x00,0x00,0x01};	//RDS FIFO empty 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;

}

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

Si47XX_Set_Property_TX_RDS_PI()

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

T_ERROR_OP Si47XX_Set_Property_TX_RDS_PI(unsigned short pi_code)
{
	unsigned short loop_counter = 0;
	unsigned char Si47XX_reg_data[32];	
	unsigned char error_ind = 0;
	unsigned char Si47XX_set_property[] = {0x12,0x00,0x2c,0x01,0x40,0xa7};	//PI = 0x40a7

	Si47XX_set_property[4] = (pi_code&0xff00) >> 8; 
  Si47XX_set_property[5] = (pi_code&0x00ff);

	//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_TX_RDS_PS_MIX()

MIX: 0~6
0% no PS if anything in buffer
50% half/half
100% no buffer message, all are PS
***************************************/

T_ERROR_OP Si47XX_Set_Property_TX_RDS_PS_MIX(void)
{
	unsigned short loop_counter = 0;
	unsigned char Si47XX_reg_data[32];	
	unsigned char error_ind = 0;
	unsigned char Si47XX_set_property[] = {0x12,0x00,0x2c,0x02,0x00,0x03};	//0x03:50% PS mix

	//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_TX_RDS_PS_MISC()

Force_B: 0/1: force PTY and TP(traffic Program) set in all block B data
TP_code: 0/1
PTY: 5 bits
***************************************/

T_ERROR_OP Si47XX_Set_Property_TX_RDS_PS_MISC(unsigned char Force_B, 
																							unsigned char TP_code,
																							unsigned char PTY)
{
	unsigned short temp, loop_counter = 0;
	unsigned char Si47XX_reg_data[32];	
	unsigned char error_ind = 0;
	unsigned char Si47XX_set_property[] = {0x12,0x00,0x2c,0x03,0x10,0x08};	//stereo, music

 	Si47XX_set_property[4]&= ~0x08;
 	Si47XX_set_property[4]|= Force_B << 3;
 	
 	Si47XX_set_property[4]&= ~0x04;
 	Si47XX_set_property[4]|= TP_code << 2;
 	
 	temp = (Si47XX_set_property[4] << 8) | Si47XX_set_property[5]; 
 	temp &= ~0x03e0;
 	temp |= PTY << 5;
 	Si47XX_set_property[4] = (temp&0xff00) >> 8; 
  Si47XX_set_property[5] = (temp&0x00ff);
  	
	//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_TX_RDS_PS_Repeat_Count()
:1~255

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

T_ERROR_OP Si47XX_Set_Property_TX_RDS_PS_Repeat_Count(void)
{
	unsigned short loop_counter = 0;
	unsigned char Si47XX_reg_data[32];	
	unsigned char error_ind = 0;
	unsigned char Si47XX_set_property[] = {0x12,0x00,0x2c,0x04,0x00,0x03};	//PS repeat count(1~255) = 3

	//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_TX_RDS_PS_Message_Count()

:1~12*(8 charaters)

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

T_ERROR_OP Si47XX_Set_Property_TX_RDS_PS_Message_Count(void)
{
	unsigned short loop_counter = 0;
	unsigned char Si47XX_reg_data[32];	
	unsigned char error_ind = 0;
	unsigned char Si47XX_set_property[] = {0x12,0x00,0x2c,0x05,0x00,0x03};	//PS message count(1~12) = 3

	//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_TX_RDS_PS_AF()


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

T_ERROR_OP Si47XX_Set_Property_TX_RDS_PS_AF(void)
{
	unsigned short loop_counter = 0;
	unsigned char Si47XX_reg_data[32];	
	unsigned char error_ind = 0;
	unsigned char Si47XX_set_property[] = {0x12,0x00,0x2c,0x06,0xe1,0x02};	//0xe102 = 87.7MHz

	//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_TX_RDS_FIFO_Size()

unit:block
:0,4,7,10...54

Note that the value written must be one larger than the desired FIFO

⌨️ 快捷键说明

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