?? si47xx_tx_fcc.c
字號:
/**************************************
Si47XX TX part, for FCC requirements
***************************************/
#include "Si47xx_drv.h"
/**************************************
Si47XX_Set_Property_TX_ASQ_Level_Low()
range:-70~0dB
***************************************/
T_ERROR_OP Si47XX_Set_Property_TX_ASQ_Level_Low(void)
{
unsigned short loop_counter = 0;
unsigned char Si47XX_reg_data[32];
unsigned char error_ind = 0;
unsigned char Si47XX_set_property[] = {0x12,0x00,0x23,0x01,0x00,0xce}; //0x00ce=-50dB
//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_ASQ_Level_High()
range:-70~0dB
***************************************/
T_ERROR_OP Si47XX_Set_Property_TX_ASQ_Level_High(void)
{
unsigned short loop_counter = 0;
unsigned char Si47XX_reg_data[32];
unsigned char error_ind = 0;
unsigned char Si47XX_set_property[] = {0x12,0x00,0x23,0x03,0x00,0xec}; //0x00ec=-20dB
//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_ASQ_Duration_Low()
if detect level low 60s, disable TX
***************************************/
T_ERROR_OP Si47XX_Set_Property_TX_ASQ_Duration_Low(void)
{
unsigned short loop_counter = 0;
unsigned char Si47XX_reg_data[32];
unsigned char error_ind = 0;
unsigned char Si47XX_set_property[] = {0x12,0x00,0x23,0x02,0xea,0x60}; //0xea60=60000ms=1minute
//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_ASQ_Duration_High()
if detect level high 5s, enable TX
***************************************/
T_ERROR_OP Si47XX_Set_Property_TX_ASQ_Duration_High(void)
{
unsigned short loop_counter = 0;
unsigned char Si47XX_reg_data[32];
unsigned char error_ind = 0;
unsigned char Si47XX_set_property[] = {0x12,0x00,0x23,0x04,0x13,0x88}; //0x1388=5000ms=5s
//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_ASQ_Int_Select(): level low detection enable in the beginning
************************************************************************************/
T_ERROR_OP Si47XX_Set_Property_TX_ASQ_Int_Select(void)
{
unsigned short loop_counter = 0;
unsigned char Si47XX_reg_data[32];
unsigned char error_ind = 0;
unsigned char Si47XX_set_property[] = {0x12,0x00,0x23,0x00,0x00,0x01}; //IALL detect enabled
//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_ASQ_Int_Enable()
GPO_IEN
************************************************************************************/
T_ERROR_OP Si47XX_Set_Property_TX_ASQ_Int_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,0x00,0x01,0x00,0x02}; //ASQ int enabled
//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_Audio_Level_Detect_ISR() interrupt ISR
************************************************/
T_ERROR_OP Si47XX_TX_Audio_Level_Detect_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 Si47XX_asq_status[] = {0x34,0x00};
unsigned char Si47XX_asq_status_clear[] = {0x34,0x01};
unsigned char Si47XX_asq_int_select_high[] = {0x12,0x00,0x23,0x00,0x00,0x02};
unsigned char Si47XX_asq_int_select_low[] = {0x12,0x00,0x23,0x00,0x00,0x01};
//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 ASQ interrupt
error_ind = OperationSi47XX_2w(READ, &(Si47XX_reg_data[0]), 1);
if(error_ind)
return I2C_ERROR;
if((Si47XX_reg_data[0]&0x02) != 0)
{
//send CMD
error_ind = OperationSi47XX_2w(WRITE, &(Si47XX_asq_status[0]), 2); //can't clear int bit here, or can't get IALH/IALL
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 */
error_ind = OperationSi47XX_2w(READ, &(Si47XX_reg_data[0]), 5);
if(error_ind)
return I2C_ERROR;
//whether it's IALH:
if((Si47XX_reg_data[1]&0x02) != 0)
{
//1.enable TX_Power
if(Si47XX_Set_TX_Power(115) != OK) return ERROR;
//2.enable IALL int:
//send CMD
error_ind = OperationSi47XX_2w(WRITE, &(Si47XX_asq_int_select_low[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) == 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 */
}//end if IALH, then IALL:
else if((Si47XX_reg_data[1]&0x01) != 0)
{
//1.disable TX Power
if(Si47XX_Set_TX_Power(0) != OK) return ERROR;
//2.enable IALH int
//send CMD
error_ind = OperationSi47XX_2w(WRITE, &(Si47XX_asq_int_select_high[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) == 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 */
}//end "if IALL"
//clear INT bit:
error_ind = OperationSi47XX_2w(WRITE, &(Si47XX_asq_status_clear[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) == 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 */
}//end if ASQ int
return OK;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -