?? si47xx_rx_fm.c
字號:
/**************************************
Si47XX FM RX part
***************************************/
#include "Si47xx_common.h"
/**************************************
Si47XX_Set_Property_FM_DEEMPHASIS()
***************************************/
T_ERROR_OP Si47XX_Set_Property_FM_DEEMPHASIS(void)
{
unsigned short loop_counter = 0;
unsigned char Si47XX_reg_data[32];
unsigned char error_ind = 0;
unsigned char Si47XX_set_property[] = {0x12,0x00,0x11,0x00,0x00,0x01}; //FM deemphasis is 50us
//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_FM_Seek_Band_Top()
Default: 107.9MHz
***************************************/
T_ERROR_OP Si47XX_Set_Property_FM_Seek_Band_Top(void)
{
unsigned short loop_counter = 0;
unsigned char Si47XX_reg_data[32];
unsigned char error_ind = 0;
unsigned char Si47XX_set_property[] = {0x12,0x00,0x14,0x01,0x2A,0x30}; //0x2A30 = 10800
//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_FM_Seek_Space()
***************************************/
T_ERROR_OP Si47XX_Set_Property_FM_Seek_Space(void)
{
unsigned short loop_counter = 0;
unsigned char Si47XX_reg_data[32];
unsigned char error_ind = 0;
unsigned char Si47XX_set_property[] = {0x12,0x00,0x14,0x02,0x00,0x0A}; //seek space = 0x0A = 10 = 100KHz
//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_FM_SNR_Threshold()
Default is 3dB
***************************************/
T_ERROR_OP Si47XX_Set_Property_FM_SNR_Threshold(void)
{
unsigned short loop_counter = 0;
unsigned char Si47XX_reg_data[32];
unsigned char error_ind = 0;
unsigned char Si47XX_set_property[] = {0x12,0x00,0x14,0x03,0x00,0x02}; //SNR threshold = 0x0002 = 2dB
//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_FM_RSSI_Threshold()
Default is 20dBuV
***************************************/
T_ERROR_OP Si47XX_Set_Property_FM_RSSI_Threshold(void)
{
unsigned short loop_counter = 0;
unsigned char Si47XX_reg_data[32];
unsigned char error_ind = 0;
unsigned char Si47XX_set_property[] = {0x12,0x00,0x14,0x04,0x00,0x0c}; //RSSI threshold = 0x000c = 12dBuV
//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_FM_Antenna_Input()
Only used for short antenna supported chip
EXTERNAL_ANTENNA = Use FMI pin for headphone (long) antenna
INTERNAL_ANTENNA = Use TXO/LPI pin for embedded (short) antenna
Default is 0.
************************************************/
T_ERROR_OP Si47XX_Set_Property_FM_Antenna_Input(T_RX_ANTENNA_SELECT Rx_Antenna_Select)
{
unsigned short loop_counter = 0;
unsigned char Si47XX_reg_data[32];
unsigned char error_ind = 0;
unsigned char Si47XX_set_property[] = {0x12,0x00,0x11,0x07,0x00,0x00}; //00: headphone antenna (FMI)
if(Rx_Antenna_Select == INTERNAL_ANTENNA)
Si47XX_set_property[5] = 0x01;
//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;
}
/**************************************
static Si47XX_FM_Tune_Freq()
***************************************/
static T_ERROR_OP Si47XX_FM_Tune_Freq(unsigned short channel_freq)
{
unsigned short loop_counter = 0;
unsigned char Si47XX_reg_data[32];
unsigned char error_ind = 0;
unsigned char Si47XX_tune_freq[] = {0x20,0x00,0x27,0xF6,0x00}; //0x27F6=10230KHz
Si47XX_tune_freq[2] = (channel_freq&0xff00) >> 8;
Si47XX_tune_freq[3] = (channel_freq&0x00ff);
//send CMD
error_ind = OperationSi47XX_2w(WRITE, &(Si47XX_tune_freq[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_FM_Seek_Start()
***************************************/
static T_ERROR_OP Si47XX_FM_Seek_Start(T_SEEK_MODE seek_mode)
{
unsigned short loop_counter = 0;
unsigned char Si47XX_reg_data[32];
unsigned char error_ind = 0;
unsigned char Si47XX_seek_start[] = {0x21,0x0C};
switch(seek_mode)
{
case SEEKDOWN_HALT:
{
Si47XX_seek_start[1] = 0x00;
break;
}
case SEEKDOWN_WRAP:
{
Si47XX_seek_start[1] = 0x04;
break;
}
case SEEKUP_HALT:
{
Si47XX_seek_start[1] = 0x08;
break;
}
case SEEKUP_WRAP:
{
Si47XX_seek_start[1] = 0x0C;
break;
}
}
//send CMD
error_ind = OperationSi47XX_2w(WRITE, &(Si47XX_seek_start[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;
return OK;
}
/**************************************
static Si47XX_FM_Tune_Status()
***************************************/
static T_ERROR_OP Si47XX_FM_Tune_Status(unsigned short *pChannel_Freq, unsigned char *SeekFail, unsigned char *valid_channel)
{
unsigned short loop_counter = 0;
unsigned char Si47XX_reg_data[32];
unsigned char error_ind = 0;
unsigned char Si47XX_fm_tune_status[] = {0x22,0x01};
//send CMD
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -