?? si47xx_tx.c
字號:
/**************************************
Si47XX TX part
***************************************/
#include "Si47xx_common.h"
/**************************************
Si47XX_Power_Up()
***************************************/
T_ERROR_OP Si47XX_Power_Up(T_POWER_UP_TYPE power_up_type)
{
unsigned short loop_counter = 0;
unsigned char Si47XX_reg_data[32];
unsigned char error_ind = 0;
unsigned char Si47XX_power_up[] = {0x01,0x41,0x05};
switch(power_up_type)
{
case FM_RECEIVER:
{
Si47XX_power_up[1] = 0x40;
Si47XX_power_up[2] = 0x05; //note! for Si4730(AN385rev0.2/0.3), it's 0x05(from 0.C to 1.0)
//note! for Si4704/5(AN326rev0.2):
//0x05:analog audio
//0xb0:digital audio(Si4705 only with xoscen=0)
//0xb5:both (Si4705 only with xoscen=0)
break;
}
case FM_TRNSMITTER:
{
Si47XX_power_up[1] = 0x42;
Si47XX_power_up[2] = 0x50; //0x0f for digital audio input
break;
}
case AM_RECEIVER:
{
Si47XX_power_up[1] = 0x41;
Si47XX_power_up[2] = 0x05;
break;
}
case WB_RECEIVER:
{
Si47XX_power_up[1] = 0x43;
Si47XX_power_up[2] = 0x05;
break;
}
}
ResetSi47XX_2w();
//send CMD
error_ind = OperationSi47XX_2w(WRITE, &(Si47XX_power_up[0]), 3);
if(error_ind)
return I2C_ERROR;
DELAY(POWER_SETTLING); //if use internal crystal, need wait 500ms, Si47XX_power_up[1] = 0x(5x)
//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_Get_Rev(): read rev info: you should read out:
{0x80,0x14,0x31,0x42,0x00,0x00,0x31,0x42,0x41} for Si4720/1B firmware, Chip rev = A(0x41).
note! only can read it correctly after power up!
***************************************/
T_ERROR_OP Si47XX_Get_Rev(unsigned char *pREV_data, unsigned char numBytes)
{
unsigned short loop_counter = 0;
unsigned char Si47XX_reg_data[32];
unsigned char error_ind = 0;
unsigned char Si47XX_get_rev[] = {0x10,0x00};
//send CMD
error_ind = OperationSi47XX_2w(WRITE, &(Si47XX_get_rev[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;
//read rev info: you should read out: {0x80,0x14,0x31,0x42,0x00,0x00,0x31,0x42,0x41} for 1B firmware
if(numBytes > 9)
numBytes = 9;
error_ind = OperationSi47XX_2w(READ, pREV_data, numBytes);
if(error_ind)
return I2C_ERROR;
return OK;
}
/**************************************
Si47XX_Set_Property_RCLK_PRESCALE()
Range:1~1023
***************************************/
T_ERROR_OP Si47XX_Set_Property_RCLK_PRESCALE(void)
{
unsigned short loop_counter = 0;
unsigned char Si47XX_reg_data[32];
unsigned char error_ind = 0;
unsigned char Si47XX_set_property[] = {0x12,0x00,0x02,0x02,0x01,0x90}; //0x190=400(1~1023), 13MHz(RCLK)/400=32500Hz
//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_REFCLK_FREQ()
Range:(31130~34406)!
***************************************/
T_ERROR_OP Si47XX_Set_Property_REFCLK_FREQ(void)
{
unsigned short loop_counter = 0;
unsigned char Si47XX_reg_data[32];
unsigned char error_ind = 0;
unsigned char Si47XX_set_property[] = {0x12,0x00,0x02,0x01,0x7E,0xF4}; //0x7EF4=32500Hz(31130~34406)
//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_INPUT_LEVEL()
***************************************/
T_ERROR_OP Si47XX_Set_Property_INPUT_LEVEL(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,0x04,0x32,0x7C}; //max:0x27C = 636mVpk, 0x3:max=636mVpk,60kR
//even for 1Vpk line level, still should set line level to 0x27C(636mVpk)!
//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_PREEMPHASIS()
***************************************/
T_ERROR_OP Si47XX_Set_Property_TX_PREEMPHASIS(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,0x06,0x00,0x01}; //tx preemphasis 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_TX_ACOMP_ENABLE()
Gain: default=15, max=20dB
***************************************/
T_ERROR_OP Si47XX_Set_Property_TX_ACOMP_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,0x22,0x00,0x00,0x03}; //enable audio limiter and ACEN(Audio dynamic control enable)
//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_Deviation()
default: TX_Audio_Deviation: 68.25KHz
TX_Pilot_Deviation: 6.75KHz
TX_RDS_Deviation: 2KHz
Total: 75KHz
***************************************/
/**************************************
Si47XX_Tune_Power()
88~115 dBuV
***************************************/
static T_ERROR_OP Si47XX_Tune_Power(unsigned short tune_power)
{
unsigned short loop_counter = 0;
unsigned char Si47XX_reg_data[32];
unsigned char error_ind = 0;
unsigned char Si47XX_tune_power[] = {0x31,0x00,0x00,0x73,0x00}; //0x73=115=115dBuV for new firmwre
//unsigned char Si47XX_tune_power[] = {0x31,0x00,0x01,0xCC,0x00}; //0x1CC/4=115=115dBuV for alpha1 firmware
Si47XX_tune_power[2] = (tune_power&0xff00) >> 8;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -