📄 si47xx_rds_tx.c
字号:
/**************************************
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 + -