📄 si47xx_rx_wb.c
字号:
/**************************************
Si47XX WB RX part
***************************************/
#include "Si47xx_common.h"
extern void Customer_Action_For_Alert(void);
extern void Customer_Decode_SAME_Message(unsigned char Msg_Len, unsigned char *pHeader_Array_All); //max length = 255 bytes
/**************************************
Si47XX_Set_Property_WB_ASQ_INT_SOURCE()
***************************************/
T_ERROR_OP Si47XX_Set_Property_WB_ASQ_INT_SOURCE(void)
{
unsigned short loop_counter = 0;
unsigned char Si47XX_reg_data[32];
unsigned char error_ind = 0;
unsigned char Si47XX_set_property[] = {0x12,0x00,0x56,0x00,0x00,0x01}; //ALERT_ON_IEN
//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_WB_SAME_INT_SOURCE()
***************************************/
T_ERROR_OP Si47XX_Set_Property_WB_SAME_INT_SOURCE(void)
{
unsigned short loop_counter = 0;
unsigned char Si47XX_reg_data[32];
unsigned char error_ind = 0;
unsigned char Si47XX_set_property[] = {0x12,0x00,0x55,0x00,0x00,0x01}; //HEADER BUFFER READY INT
//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_WB_Tune_Freq()
162400KHz,162425KHz...162550KHz(7 frequency)
64960~65020
********************************************/
static T_ERROR_OP Si47XX_WB_Tune_Freq(unsigned int channel_freq)
{
unsigned short loop_counter = 0;
unsigned char Si47XX_reg_data[32];
unsigned char error_ind = 0;
unsigned char Si47XX_tune_freq[] = {0x50,0x00,0xFD,0xC0}; //0xFDC0=64960=162.4MHz
Si47XX_tune_freq[2] = ((channel_freq*4/10)&0xff00) >> 8;
Si47XX_tune_freq[3] = ((channel_freq*4/10)&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;
}
/**************************************
static Si47XX_WB_ASQ_Status()
***************************************/
static T_ERROR_OP Si47XX_WB_ASQ_Status(unsigned char *pAlert_On)
{
unsigned short loop_counter = 0;
unsigned char Si47XX_reg_data[32];
unsigned char error_ind = 0;
unsigned char Si47XX_wb_asq_status[] = {0x55,0x00};
/*
unsigned char Si47XX_wb_asq_status[] = {0x55,0x01}; //can't clear ASQ int bit here
*/
//send CMD
error_ind = OperationSi47XX_2w(WRITE, &(Si47XX_wb_asq_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], 3);
if(error_ind)
return I2C_ERROR;
*pAlert_On = Si47XX_reg_data[1]&0x01;
return OK;
}
/**************************************
static Si47XX_WB_ASQ_Status_Int_Clear()
***************************************/
static T_ERROR_OP Si47XX_WB_ASQ_Status_Int_Clear(void)
{
unsigned short loop_counter = 0;
unsigned char Si47XX_reg_data[32];
unsigned char error_ind = 0;
unsigned char Si47XX_wb_asq_status[] = {0x55,0x01};
//send CMD
error_ind = OperationSi47XX_2w(WRITE, &(Si47XX_wb_asq_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;
return OK;
}
/*****************************************
static Si47XX_WB_SAME_Status_Int_Clear()
*****************************************/
static T_ERROR_OP Si47XX_WB_SAME_Status_Int_Clear(void)
{
unsigned short loop_counter = 0;
unsigned char Si47XX_reg_data[32];
unsigned char error_ind = 0;
unsigned char Si47XX_wb_same_status[] = {0x54,0x01,0x00};
//send CMD
error_ind = OperationSi47XX_2w(WRITE, &(Si47XX_wb_same_status[0]), 3);
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_WB_SAME_Status_HeaderReady()
*****************************************/
static T_ERROR_OP Si47XX_WB_SAME_Status_HeaderReady(unsigned char *pHeader_Ready)
{
unsigned short loop_counter = 0;
unsigned char Si47XX_reg_data[32];
unsigned char error_ind = 0;
unsigned char Si47XX_wb_same_status[] = {0x54,0x00,0x00};
/*
unsigned char Si47XX_wb_same_status[] = {0x54,0x01,0x00}; //can't clear SAME int bit here
*/
//send CMD
error_ind = OperationSi47XX_2w(WRITE, &(Si47XX_wb_same_status[0]), 3);
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], 2);
if(error_ind)
return I2C_ERROR;
*pHeader_Ready = Si47XX_reg_data[1]&0x01;
return OK;
}
/******************************************
static Si47XX_WB_SAME_Status_HeaderBuffer()
SAME_header_idx: 0,8,16...
The first byte is NOT "ZCZC" but "-"!
******************************************/
static T_ERROR_OP Si47XX_WB_SAME_Status_HeaderBuffer(unsigned char SAME_header_idx, unsigned char *pMsg_Len, unsigned char *pHeader_Array_Short)
{
unsigned short loop_counter = 0;
unsigned char Si47XX_reg_data[32];
unsigned char i, error_ind = 0;
unsigned char Si47XX_wb_same_status[] = {0x54,0x00,0x00};
/*
unsigned char Si47XX_wb_same_status[] = {0x54,0x01,0x00}; //can't clear SAME int bit here
*/
Si47XX_wb_same_status[2] = SAME_header_idx;
//send CMD
error_ind = OperationSi47XX_2w(WRITE, &(Si47XX_wb_same_status[0]), 3);
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], 14);
if(error_ind)
return I2C_ERROR;
*pMsg_Len = Si47XX_reg_data[3];
for(i=6;i<=13;i++)
*(pHeader_Array_Short++) = Si47XX_reg_data[i];
return OK;
}
/**************************************
static Read_All_Header_Buffer()
pMsg_Len: 0~255
pHeader_Array_All: 255 bytes array
The first byte is NOT "ZCZC" but "-"
***************************************/
static T_ERROR_OP Read_All_Header_Buffer(unsigned char *pMsg_Len, unsigned char *pHeader_Array_All)
{
unsigned char i;
Si47XX_WB_SAME_Status_HeaderBuffer(0, pMsg_Len, pHeader_Array_All);
for(i=8; i<(*pMsg_Len); i+ = 8)
{
pHeader_Array_All+ = 8;
Si47XX_WB_SAME_Status_HeaderBuffer(i, pMsg_Len, pHeader_Array_All);
}
return OK;
}
/****************************************************************
Si47XX_Set_WB_Frequency()
channel_freq: 162400KHz,162425KHz...162550KHz(totall 7 frequency)
****************************************************************/
T_ERROR_OP Si47XX_Set_WB_Frequency(unsigned int channel_freq)
{
if(Si47XX_WB_Tune_Freq(channel_freq) != OK) return ERROR;
if(Si47XX_Wait_STC() != OK) return ERROR;
return OK;
}
/*********************************************************************
Si47XX_SAME_ISR(): ASQ/SAME ISR: Non-reentry routine
*********************************************************************/
T_ERROR_OP Si47XX_SAME_ISR(void)
{
unsigned short loop_counter = 0;
unsigned char Si47XX_reg_data[32];
unsigned char Header_Array_All[255];
unsigned char Msg_Len, error_ind = 0, Alert_On = 0, Header_Ready = 0;
unsigned char Si47XX_get_int_status[] = {0x14};
//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 */
error_ind = OperationSi47XX_2w(READ, &(Si47XX_reg_data[0]), 1);
if(error_ind)
return I2C_ERROR;
//check whether it's ASQ interrupt
if((Si47XX_reg_data[0]&0x02) != 0)
{
//whether it's ALERT_ON:
Si47XX_WB_ASQ_Status(&Alert_On);
if(Alert_On)
Customer_Action_For_Alert();
Si47XX_WB_ASQ_Status_Int_Clear();
}
//check whether it's SAME interrupt
if((Si47XX_reg_data[0]&0x04) != 0)
{
//whether it's HEADER_READY:
Si47XX_WB_SAME_Status_HeaderReady(&Header_Ready);
if(Header_Ready)
{
Read_All_Header_Buffer(&Msg_Len, &(Header_Array_All[0]));
Customer_Decode_SAME_Message(Msg_Len, &(Header_Array_All[0]));
}
Si47XX_WB_SAME_Status_Int_Clear();
}
return OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -