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

📄 si47xx_rds_tx.c

📁 si47xx FM 收音机的程序,通过单片机来控制搜台灯功能
💻 C
📖 第 1 页 / 共 2 页
字号:
size. The number of blocks allocated will reduce the size of the Circular RDS Group Buffer by the same amount.
***************************************/

T_ERROR_OP Si47XX_Set_Property_TX_RDS_FIFO_Size(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,0x07,0x00,0x04};	//size = 4 - 1 = 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_TX_RDS_PS()
psid: 0~23
*PS_string: 4 character

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

T_ERROR_OP Si47XX_TX_RDS_PS(unsigned char psid, unsigned char *PS_string)
{
	unsigned short loop_counter = 0;
	unsigned char Si47XX_reg_data[32];	
	unsigned char error_ind = 0;
	unsigned char Si47XX_TX_RDS_PS[] = {0x36,0x00,0x53,0x49,0x4c,0x41};	//4 character: SILA

  Si47XX_TX_RDS_PS[1] = psid&0x1f;
  Si47XX_TX_RDS_PS[2] = *(PS_string++);
  Si47XX_TX_RDS_PS[3] = *(PS_string++);
  Si47XX_TX_RDS_PS[4] = *(PS_string++);
  Si47XX_TX_RDS_PS[5] = * PS_string;
  
	//send CMD
 	error_ind = OperationSi47XX_2w(WRITE, &(Si47XX_TX_RDS_PS[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_TX_RDS_Circular()

*RDS_group_string: 6 bytes

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

T_ERROR_OP Si47XX_TX_RDS_Circular(unsigned char empty_circular_flag, unsigned char *RDS_group_string)
{
	unsigned short loop_counter = 0;
	unsigned char Si47XX_reg_data[32];	
	unsigned char error_ind = 0;
	unsigned char Si47XX_TX_RDS_GROUP[] = {0x35,0x04,0x20,0x00,0x53,0x49,0x4c,0x49};	//3 blocks

  if(empty_circular_flag)
  	Si47XX_TX_RDS_GROUP[1]|= 0x02;
  else
  	Si47XX_TX_RDS_GROUP[1]&= ~0x02;
  Si47XX_TX_RDS_GROUP[2] = *(RDS_group_string++);
  Si47XX_TX_RDS_GROUP[3] = *(RDS_group_string++);
  Si47XX_TX_RDS_GROUP[4] = *(RDS_group_string++);
  Si47XX_TX_RDS_GROUP[5] = *(RDS_group_string++);
  Si47XX_TX_RDS_GROUP[6] = *(RDS_group_string++);
  Si47XX_TX_RDS_GROUP[7] = * RDS_group_string;
  
	//send CMD
 	error_ind = OperationSi47XX_2w(WRITE, &(Si47XX_TX_RDS_GROUP[0]), 8);
	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_TX_RDS_FIFO()

*RDS_group_string: 6 bytes

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

T_ERROR_OP Si47XX_TX_RDS_FIFO(unsigned char empty_fifo_flag, unsigned char clear_int_flag, unsigned char *RDS_group_string)
{
	unsigned short loop_counter = 0;
	unsigned char Si47XX_reg_data[32];	
	unsigned char error_ind = 0;
	unsigned char Si47XX_TX_RDS_GROUP[] = {0x35,0x84,0x40,0x01,0xa7,0x0b,0x2d,0x6c};	//3 blocks

  if(empty_fifo_flag)
  	Si47XX_TX_RDS_GROUP[1]|= 0x02;
  else
  	Si47XX_TX_RDS_GROUP[1]&= ~0x02;
  	
  if(clear_int_flag)
  	Si47XX_TX_RDS_GROUP[1]|= 0x01;
  else
  	Si47XX_TX_RDS_GROUP[1]&= ~0x01;
  	
  Si47XX_TX_RDS_GROUP[2] = *(RDS_group_string++);
  Si47XX_TX_RDS_GROUP[3] = *(RDS_group_string++);
  Si47XX_TX_RDS_GROUP[4] = *(RDS_group_string++);
  Si47XX_TX_RDS_GROUP[5] = *(RDS_group_string++);
  Si47XX_TX_RDS_GROUP[6] = *(RDS_group_string++);
  Si47XX_TX_RDS_GROUP[7] = * RDS_group_string;
  
	//send CMD
 	error_ind = OperationSi47XX_2w(WRITE, &(Si47XX_TX_RDS_GROUP[0]), 8);
	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_TX_RDS_Clear_Circular()


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

T_ERROR_OP Si47XX_TX_RDS_Clear_Circular(void)
{
	unsigned short loop_counter = 0;
	unsigned char Si47XX_reg_data[32];	
	unsigned char error_ind = 0;
	unsigned char Si47XX_TX_RDS_GROUP[] = {0x35,0x02,0x00,0x00,0x00,0x00,0x00,0x00};	

	//send CMD
 	error_ind = OperationSi47XX_2w(WRITE, &(Si47XX_TX_RDS_GROUP[0]), 8);
	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_TX_RDS_FIFO_Status_Check()

fifo_available_number: unit - block

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

T_ERROR_OP Si47XX_TX_RDS_FIFO_Status_Check(unsigned char clear_int_flag, unsigned char *fifo_available_number, unsigned char *int_status)
{
	unsigned short loop_counter = 0;
	unsigned char Si47XX_reg_data[32];	
	unsigned char error_ind = 0;
	unsigned char Si47XX_TX_RDS_GROUP[] = {0x35,0x80,0x00,0x00,0x00,0x00,0x00,0x00};	

  if(clear_int_flag)
  	Si47XX_TX_RDS_GROUP[1]|= 0x01;
  else
  	Si47XX_TX_RDS_GROUP[1]&= ~0x01;
  
	//send CMD
 	error_ind = OperationSi47XX_2w(WRITE, &(Si47XX_TX_RDS_GROUP[0]), 8);
	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], 6);	
	if(error_ind)
		return I2C_ERROR;
		
	*fifo_available_number = Si47XX_reg_data[4];
	*int_status = Si47XX_reg_data[1];

	return OK;

}

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

Si47XX_RDS_TX_ISR(): RDS data TX interrupt ISR

Just for FIFO mode, when FIFO empty interrupt

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

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

	//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 */

  //check whether it's RDS interrupt
	error_ind = OperationSi47XX_2w(READ, &(Si47XX_reg_data[0]), 1);
	if(error_ind)
		return I2C_ERROR;	
		
	if((Si47XX_reg_data[0]&0x04) != 0)
	{
		//check whether it's FIFO empty
		Si47XX_TX_RDS_FIFO_Status_Check(1, &fifo_available_number, &int_status);
		if((int_status&0x01) != 0)
		{
			unsigned char i, *RDS_group_string;

			for(i=0;i<(fifo_available_number/3);i++)
			{
				RDS_group_string = CUSTOMER_ROUTINE();
				if(RDS_group_string != NULL)
					Si47XX_TX_RDS_FIFO(0, 1, RDS_group_string);
				else
					break;
			}
		}
	}
	

	return OK;

}

⌨️ 快捷键说明

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