📄 si47xx_tx.c
字号:
Si47XX_tune_power[3] = (tune_power&0x00ff);
//send CMD
error_ind = OperationSi47XX_2w(WRITE, &(Si47XX_tune_power[0]), 5);
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_Tune_Freq()
***************************************/
static T_ERROR_OP Si47XX_Tune_Freq(unsigned short tune_freq)
{
unsigned short loop_counter = 0;
unsigned char Si47XX_reg_data[32];
unsigned char error_ind = 0;
unsigned char Si47XX_tune_freq[] = {0x30,0x00,0x27,0x10}; //0x2710=10000=100.00MHz
Si47XX_tune_freq[2] = (tune_freq&0xff00) >> 8;
Si47XX_tune_freq[3] = (tune_freq&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;
}
/**************************************
Si47XX_Wait_STC(): wait STC = 1 (then clear it-removed)
***************************************/
T_ERROR_OP Si47XX_Wait_STC(void)
{
unsigned short loop_counter = 0, loop_counter_1 = 0;
unsigned char Si47XX_reg_data[32];
unsigned char error_ind = 0;
unsigned char Si47XX_get_int_status[] = {0x14};
do
{
//send CMD
error_ind = OperationSi47XX_2w(WRITE, &(Si47XX_get_int_status[0]), 1);
if(error_ind)
return I2C_ERROR;
/* wait CTS = 1 and then wait STCINT = 1 */
do
{
error_ind = OperationSi47XX_2w(READ, &(Si47XX_reg_data[0]), 1);
if(error_ind)
return I2C_ERROR;
loop_counter_1++;
}
while(((Si47XX_reg_data[0]&0x80) == 0) && (loop_counter_1 < 0xff)); //loop_counter limit should guarantee at least 300us
if(loop_counter_1 >= 0xff)
return LOOP_EXP_ERROR;
loop_counter_1 = 0;
/* wait CTS end */
error_ind = OperationSi47XX_2w(READ, &(Si47XX_reg_data[0]), 1);
if(error_ind)
return I2C_ERROR;
loop_counter++;
}
while(((Si47XX_reg_data[0]&0x01) == 0) && (loop_counter < 0xffff)); //loop_counter(0xffff) limit should guarantee at least: for FM,worst case = 60ms*((108-87.5)/0.1+1)= 12s to wait STC = 1
// for AM,worst case = 80ms*((1710-520)/9+1)= 11s to wait STC = 1
if(loop_counter == 0xffff)
return LOOP_EXP_ERROR;
return OK;
}
/**************************************
Si47XX_Power_Down()
***************************************/
T_ERROR_OP Si47XX_Power_Down(void)
{
unsigned short loop_counter = 0;
unsigned char Si47XX_reg_data[32];
unsigned char error_ind = 0;
unsigned char Si47XX_power_down[] = {0x11};
//send CMD
error_ind = OperationSi47XX_2w(WRITE, &(Si47XX_power_down[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) && (loop_counter < 0xff)); //loop_counter limit should guarantee at least 300us
if(loop_counter >= 0xff)
return LOOP_EXP_ERROR;
return OK;
}
/**************************************
Si47XX_Set_TX_Power()
***************************************/
T_ERROR_OP Si47XX_Set_TX_Power(unsigned short tune_power)
{
if(Si47XX_Tune_Power(tune_power) != OK) return ERROR;
if(Si47XX_Wait_STC() != OK) return ERROR;
return OK;
}
/**************************************
Si47XX_Set_TX_Frequency()
7600~10800
***************************************/
T_ERROR_OP Si47XX_Set_TX_Frequency(unsigned short tune_freq)
{
if(Si47XX_Tune_Freq(tune_freq) != OK) return ERROR;
if(Si47XX_Wait_STC() != OK) return ERROR;
return OK;
}
/***************************************
static Si47XX_Tune_Measure_Start(), only for Si4712/3
****************************************/
static T_ERROR_OP Si47XX_Tune_Measure_Start(unsigned short tune_freq)
{
unsigned short loop_counter = 0;
unsigned char Si47XX_reg_data[32];
unsigned char error_ind = 0;
unsigned char Si47XX_tune_measure[] = {0x32,0x00,0x27,0x10,0x00}; //0x2710=10000=100.00MHz
Si47XX_tune_measure[2] = (tune_freq&0xff00) >> 8;
Si47XX_tune_measure[3] = (tune_freq&0x00ff);
//send CMD
error_ind = OperationSi47XX_2w(WRITE, &(Si47XX_tune_measure[0]), 5);
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_TX_Tune_Status_RPS(), only for Si4712/3
***************************************/
static T_ERROR_OP Si47XX_TX_Tune_Status_RPS(unsigned char *noise_level)
{
unsigned short loop_counter = 0;
unsigned char Si47XX_reg_data[32];
unsigned char error_ind = 0;
unsigned char Si47XX_fm_tune_status[] = {0x33,0x01};
//send CMD
error_ind = OperationSi47XX_2w(WRITE, &(Si47XX_fm_tune_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], 8);
if(error_ind)
return I2C_ERROR;
*noise_level = Si47XX_reg_data[7];
return OK;
}
/***************************************
Si47XX_Tune_Measure_RPS(), only for Si4712/3
tune_freq: 7600~10800
****************************************/
T_ERROR_OP Si47XX_Tune_Measure_RPS(unsigned short tune_freq, unsigned char *noise_level)
{
if(Si47XX_Tune_Measure_Start(tune_freq) != OK) return ERROR;
if(Si47XX_Wait_STC() != OK) return ERROR;
//read rps result:
if(Si47XX_TX_Tune_Status_RPS(noise_level) != OK) return ERROR;
return OK;
}
/***************************************
Si47XX_Min_RNL_Channel_RPS(), only for Si4712/13/20/21
tune_freq: 8750~10800
By AN307, Space: 100KHz
Suppose 108.1MHz&108.2MHz no any station
need measure 87.3&87.4MHz
****************************************/
T_ERROR_OP Si47XX_Min_RNL_Channel_RPS(unsigned short start_channel, unsigned short stop_channel, unsigned short *Min_RNL_Channel)
{
unsigned char weight_coeff[] = {1,2,6,2,1};
unsigned char Last_Five_RNL[] = {0,0,0,0,0};
unsigned char j, noise_level;
unsigned short i, current_channel_RNL, last_channel_RNL = 65535;
for(i=(start_channel-10*2),j=0; i<=(stop_channel+10*2); i=i+10,j++)
{
if((i>=8730)&&(i<=10800))
{
Si47XX_Tune_Measure_RPS(i, &noise_level);
Last_Five_RNL[j%5] = noise_level;
}
else
Last_Five_RNL[j%5] = 0;
if(j>=4)
{ //RNL_index coeff_index
current_channel_RNL = Last_Five_RNL[j%5]*weight_coeff[4] + //4->0->1 4->4->4
Last_Five_RNL[(j-1)%5]*weight_coeff[3] + //3->4->0 3->3->3
Last_Five_RNL[(j-2)%5]*weight_coeff[2] + //2->3->4 2->2->2
Last_Five_RNL[(j-3)%5]*weight_coeff[1] + //1->2->3 1->1->1
Last_Five_RNL[(j-4)%5]*weight_coeff[0]; //0->1->2 0->0->0
if(current_channel_RNL <= last_channel_RNL)
{
*Min_RNL_Channel = i - 10*2;
last_channel_RNL = current_channel_RNL;
}
}
}
return OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -