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