|
//Copright (c) 2021,FFT_Combo
//All rights reserved.
//名稱(chēng): radio.h
//說(shuō)明: si4730 gpio定義,函數(shù)聲明
//作者: feeling1791
//日期: 2020-12-20
//版本: ver3.1
#ifndef __RADIO_H
#define __RADIO_H
#include "stm32f10x.h"
#include "sys.h"
//-----------------radio端口定義----------------
#define TU_SDA_OUT() GPIOA->CRL&=0XFF0FFFFF;GPIOA->CRL|=3<<20; //輸出PA5
#define TU_SDA_IN() GPIOA->CRL&=0XFF0FFFFF;GPIOA->CRL|=8<<20; //輸入PA5
#define TU_SCL_OUT() GPIOA->CRL&=0XF0FFFFFF;GPIOA->CRL|=3<<24; //輸出PA6
#define TU_SCL_IN() GPIOA->CRL&=0XF0FFFFFF;GPIOA->CRL|=8<<24; //輸入PA6
#define TU_SDA_H PAout(5) = 1
#define TU_SDA_L PAout(5) = 0
#define TU_SCL_H PAout(6) = 1
#define TU_SCL_L PAout(6) = 0
#define TU_SDA_read PAin(5)
#define TU_SCL_read PAin(6)
#define TU_RST_H GPIOA->BSRR = GPIO_Pin_7
#define TU_RST_L GPIOA->BRR = GPIO_Pin_7
#define TU_EN_H GPIOA->BSRR = GPIO_Pin_1
#define TU_EN_L GPIOA->BRR = GPIO_Pin_1
#define TU_POWER_OFF() GPIOA->BSRR = GPIO_Pin_1 //HIGH RX_HARD_MUTE
#define TU_POWER_ON() GPIOA->BRR = GPIO_Pin_1 //LOW
/********************************************************
typedef and function claim
********************************************************/
typedef enum OPERA_MODE {
READ = 1,
WRITE = 2
} T_OPERA_MODE;
typedef enum ERROR_OP {
OK = 1,
I2C_ERROR = 2,
LOOP_EXP_ERROR = 3,
G_ERROR = 4
} T_ERROR_OP;
typedef enum POWER_UP_TYPE {
FM_RECEIVER = 1,
AM_RECEIVER = 2
} T_POWER_UP_TYPE;
typedef enum SEEK_MODE {
SEEKDOWN_HALT = 1,
SEEKDOWN_WRAP = 2,
SEEKUP_HALT = 3,
SEEKUP_WRAP = 4
} T_SEEK_MODE;
typedef enum RX_ANTENNA_SELECT {
EXTERNAL_ANTENNA = 1,
INTERNAL_ANTENNA = 2
} T_RX_ANTENNA_SELECT;
//------------------------------------------------------------------------
//低靈敏度 FM_SNR 5 FM_RSSI 30 //電臺(tái)識(shí)別率高,但是搜臺(tái)少
//中靈敏度 FM_SNR 3 FM_RSSI 15 //電臺(tái)識(shí)別率中,但是搜臺(tái)一般
//高靈敏度 FM_SNR 2 FM_RSSI 8 //電臺(tái)識(shí)別率地,但是搜臺(tái)多
#define FM_SNR_LOCAL 0x0005 //FM SNR 5dB
#define FM_RSSI_LOCAL 0x0000F //FM RSSI 15dBuV
#define FM_SNR_REMOTE 0x0002 //FM SNR 2dB
#define FM_RSSI_REMOTE 0x0008 //FM RSSI 8dBuV
//#define FM_SNR_LOCAL 0x0005 //FM SNR 5dB
//#define FM_RSSI_LOCAL 0x00019 //FM RSSI 25dBuV
//#define FM_SNR_REMOTE 0x0003 //FM SNR 3dB
//#define FM_RSSI_REMOTE 0x000a //FM RSSI 10dBuV
#define MW_SNR_LOCAL 0x0005 //MW SNR normal=5dB
#define MW_RSSI_LOCAL 0x0019 //MW_RSSI normal=25dBuV
#define MW_SNR_REMOTE 0x0003 //MW SNR normal=3dB
#define MW_RSSI_REMOTE 0x000a //MW_RSSI normal=10dBuV
//#define SW_SNR_LOCAL 0x0005 //SW_SNR normal=5dB
//#define SW_RSSI_LOCAL 0x0014 //SW_RSSI normal=20dBuV
//#define SW_SNR_REMOTE 0x0002 //SW_SNR normal=2dB
//#define SW_RSSI_REMOTE 0x0008 //SW_RSSI normal=8dBuV
//------------------------------------------------------------------------
#define FM_Deemphasis 0x0001 //去加重設(shè)置 50us
#define FM_BLEND_STEREO 0x001e //FM_BLEND_STEREO_THRESHOLD 20 dBuV RSSI高于設(shè)定閾值時(shí)開(kāi)啟立體聲模式
#define FM_BLEND_MONO 0x001e //FM_BLEND_MONO_THRESHOLD 20 dBuV RSSI低于于設(shè)定閾值時(shí)開(kāi)啟混音模式
//#define FM_BLEND_STEREO 0x0000 //FM_BLEND_STEREO_THRESHOLD 強(qiáng)制開(kāi)啟立體聲模式
//#define FM_BLEND_MONO 0x0000 //FM_BLEND_MONO_THRESHOLD 強(qiáng)制開(kāi)啟混音模式
#define FM_bandwidth 0x000a //bandwidth 100KHz
#define FM_BAND_TOP_VALUE 0x2a26 //107.9MHz
#define FM_BAND_BOTTOM_VALUE 0x222E //87.5MHz
//#define FM_BAND_BOTTOM_VALUE 0x1db0 //76MHz
#define FM_BAND_BOTTOM_XY_VALUE 0x1900 //64MHz
#define FM_AutoScan_Step_VALUE 0x000a //亞洲FM步進(jìn)100K
#define FM_ManualScan_Step_VALUE 0x000a //手動(dòng)搜臺(tái)步進(jìn)10
//------------------------------------------------------------------------
#define AM_Deemphasis 0x0001 //去加重設(shè)置 50us
#define AM_bandwidth 0x0003 //bandwidth 2KHz
/*
#define SW_BAND_TOP_VALUE 0x59d8 //23000KHz
//#define SW_BAND_BOTTOM 0x08fc //2300KHz
#define SW_BAND_BOTTOM_VALUE 0x06af //1711KHz 1711KHz -1800KHz 導(dǎo)航和定位信號(hào) 1800KHz-2000KHz 160米業(yè)務(wù)無(wú)線(xiàn)電 2000KHz-2300KHz 海事通訊
#define SW_AutoScan_Step_VALUE 0x0005 //亞洲SW步進(jìn)5K
#define SW_ManualScan_Step_VALUE 0x0005 //手動(dòng)搜臺(tái)步進(jìn)10
*/
#define MW_BAND_TOP_VALUE 0x06b9 //1721KHz
#define MW_BAND_BOTTOM_VALUE 0x020a //522KHz
#define MW_AutoScan_Step_VALUE 0x0009 //亞洲MW步進(jìn)9K
#define MW_ManualScan_Step_VALUE 0x0009 //手動(dòng)搜臺(tái)步進(jìn)9
//------------------------------------------------------------------------
#define DefaultVOL 55 //開(kāi)機(jī)默認(rèn)音量
#define MidVOL 50 //中等音量
#define MaxVOL 63 //最大音量
#define FMDefaultFREQ 10080 //開(kāi)機(jī)默認(rèn)頻率
#define MWDefaultFREQ 792 //開(kāi)機(jī)默認(rèn)頻率
//#define SWDefaultFREQ 6110 //開(kāi)機(jī)默認(rèn)頻率
//==================================================================
// General Commands
//==================================================================
#define STCINT 0x01
#define ASQINT 0x02
#define RDSINT 0x04
#define RSQINT 0x08
#define ERR 0x40
#define CTS 0x80
// POWER_UP
#define POWER_UP 0x01
#define POWER_UP_IN_FUNC_FMRX 0xd0
#define POWER_UP_IN_FUNC_AMRX 0x01
#define POWER_UP_IN_FUNC_FMTX 0x02
#define POWER_UP_IN_FUNC_WBRX 0x03
#define POWER_UP_IN_FUNC_QUERY 0x0F
#define POWER_UP_IN_PATCH 0x20
#define POWER_UP_IN_GPO2OEN 0x40
#define POWER_UP_IN_CTSIEN 0x80
#define POWER_UP_IN_OPMODE_RX_ANALOG 0x05
#define POWER_UP_IN_OPMODE_TX_ANALOG 0x50
// GET_REV
#define GET_REV 0x10
// POWER_DOWN
#define POWER_DOWN 0x11
// SET_PROPERTY
#define SET_PROPERTY 0x12
// GET_PROPERTY
#define GET_PROPERTY 0x13
// GET_INT_STATUS
#define GET_INT_STATUS 0x14
//==================================================================
// FM Receive Commands
//==================================================================
// FM_TUNE_FREQ
#define FM_TUNE_FREQ 0x20
// FM_SEEK_START
#define FM_SEEK_START 0x21
#define FM_SEEK_START_IN_WRAP 0x04
#define FM_SEEK_START_IN_SEEKUP 0x08
// FM_TUNE_STATUS
#define FM_TUNE_STATUS 0x22
#define FM_TUNE_STATUS_IN_INTACK 0x01
#define FM_TUNE_STATUS_IN_CANCEL 0x02
#define FM_TUNE_STATUS_OUT_VALID 0x01
#define FM_TUNE_STATUS_OUT_AFCRL 0x02
#define FM_TUNE_STATUS_OUT_BTLF 0x80
// FM_RSQ_STATUS
#define FM_RSQ_STATUS 0x23
#define FM_RSQ_STATUS_IN_INTACK 0x01
#define FM_RSQ_STATUS_OUT_RSSILINT 0x01
#define FM_RSQ_STATUS_OUT_RSSIHINT 0x02
#define FM_RSQ_STATUS_OUT_ASNRLINT 0x04
#define FM_RSQ_STATUS_OUT_ASNRHINT 0x08
#define FM_RSQ_STATUS_OUT_BLENDINT 0x80
#define FM_RSQ_STATUS_OUT_VALID 0x01
#define FM_RSQ_STATUS_OUT_AFCRL 0x02
#define FM_RSQ_STATUS_OUT_SMUTE 0x08
#define FM_RSQ_STATUS_OUT_PILOT 0x80
#define FM_RSQ_STATUS_OUT_STBLEND 0x7F
// FM_RDS_STATUS
#define FM_RDS_STATUS 0x24
#define FM_RDS_STATUS_IN_INTACK 0x01
#define FM_RDS_STATUS_IN_MTFIFO 0x02
#define FM_RDS_STATUS_OUT_RECV 0x01
#define FM_RDS_STATUS_OUT_SYNCLOST 0x02
#define FM_RDS_STATUS_OUT_SYNCFOUND 0x04
#define FM_RDS_STATUS_OUT_SYNC 0x01
#define FM_RDS_STATUS_OUT_GRPLOST 0x04
#define FM_RDS_STATUS_OUT_BLED 0x03
#define FM_RDS_STATUS_OUT_BLEC 0x0C
#define FM_RDS_STATUS_OUT_BLEB 0x30
#define FM_RDS_STATUS_OUT_BLEA 0xC0
#define FM_RDS_STATUS_OUT_BLED_SHFT 0
#define FM_RDS_STATUS_OUT_BLEC_SHFT 2
#define FM_RDS_STATUS_OUT_BLEB_SHFT 4
#define FM_RDS_STATUS_OUT_BLEA_SHFT 6
//==================================================================
// AM Receive Commands
//==================================================================
// AM_TUNE_FREQ
#define AM_TUNE_FREQ 0x40
// AM_SEEK_START
#define AM_SEEK_START 0x41
#define AM_SEEK_START_IN_WRAP 0x04
#define AM_SEEK_START_IN_SEEKUP 0x08
// AM_TUNE_STATUS
#define AM_TUNE_STATUS 0x42
#define AM_TUNE_STATUS_IN_INTACK 0x01
#define AM_TUNE_STATUS_IN_CANCEL 0x02
#define AM_TUNE_STATUS_OUT_VALID 0x01
#define AM_TUNE_STATUS_OUT_AFCRL 0x02
#define AM_TUNE_STATUS_OUT_BTLF 0x80
// AM_RSQ_STATUS
#define AM_RSQ_STATUS 0x23
#define AM_RSQ_STATUS_IN_INTACK 0x01
#define AM_RSQ_STATUS_OUT_RSSILINT 0x01
#define AM_RSQ_STATUS_OUT_RSSIHINT 0x02
#define AM_RSQ_STATUS_OUT_ASNRLINT 0x04
#define AM_RSQ_STATUS_OUT_ASNRHINT 0x08
#define AM_RSQ_STATUS_OUT_VALID 0x01
#define AM_RSQ_STATUS_OUT_AFCRL 0x02
#define AM_RSQ_STATUS_OUT_SMUTE 0x08
//==================================================================
// FM Transmit Commands
//==================================================================
// TX_TUNE_FREQ
#define TX_TUNE_FREQ 0x30
// TX_TUNE_POWER
#define TX_TUNE_POWER 0x31
// TX_TUNE_MEASURE
#define TX_TUNE_MEASURE 0x32
// TX_TUNE_STATUS
#define TX_TUNE_STATUS 0x33
#define TX_TUNE_STATUS_IN_INTACK 0x01
// TX_ASQ_STATUS
#define TX_ASQ_STATUS 0x34
#define TX_ASQ_STATUS_IN_INTACK 0x01
#define TX_ASQ_STATUS_OUT_IALL 0x01
#define TX_ASQ_STATUS_OUT_IALH 0x02
#define TX_ASQ_STATUS_OUT_OVERMOD 0x04
// TX_RDS_BUFF
#define TX_RDS_BUFF 0x35
#define TX_RDS_BUFF_IN_INTACK 0x01
#define TX_RDS_BUFF_IN_MTBUFF 0x02
#define TX_RDS_BUFF_IN_LDBUFF 0x04
#define TX_RDS_BUFF_IN_FIFO 0x80
// TX_RDS_PS
#define TX_RDS_PS 0x36
//==================================================================
// WB Receive Commands
//==================================================================
// WB_TUNE_FREQ
#define WB_TUNE_FREQ 0x50
// WB_TUNE_STATUS
#define WB_TUNE_STATUS 0x52
#define WB_TUNE_STATUS_IN_INTACK 0x01
#define WB_TUNE_STATUS_OUT_VALID 0x01
#define WB_TUNE_STATUS_OUT_AFCRL 0x02
// WB_RSQ_STATUS
#define WB_RSQ_STATUS 0x53
#define WB_RSQ_STATUS_IN_INTACK 0x01
#define WB_RSQ_STATUS_OUT_RSSILINT 0x01
#define WB_RSQ_STATUS_OUT_RSSIHINT 0x02
#define WB_RSQ_STATUS_OUT_ASNRLINT 0x04
#define WB_RSQ_STATUS_OUT_ASNRHINT 0x08
#define WB_RSQ_STATUS_OUT_VALID 0x01
#define WB_RSQ_STATUS_OUT_AFCRL 0x02
// WB_ASQ_STATUS
#define WB_ASQ_STATUS 0x55
#define WB_ASQ_STATUS_IN_INTACK 0x01
#define WB_ASQ_STATUS_OUT_ALERTONINT 0x01
#define WB_ASQ_STATUS_OUT_ALERTOFFINT 0x02
#define WB_ASQ_STATUS_OUT_ALERT 0x01
//****************************Properties******************************/
//==================================================================
// General Properties
//==================================================================
// GPO_IEN
#define GPO_IEN 0x0001
#define GPO_IEN_STCIEN_MASK 0x0001
#define GPO_IEN_ASQIEN_MASK 0x0002
#define GPO_IEN_RDSIEN_MASK 0x0004
#define GPO_IEN_RSQIEN_MASK 0x0008
#define GPO_IEN_ERRIEN_MASK 0x0040
#define GPO_IEN_CTSIEN_MASK 0x0080
#define GPO_IEN_STCREP_MASK 0x0100
#define GPO_IEN_ASQREP_MASK 0x0200
#define GPO_IEN_RDSREP_MASK 0x0400
#define GPO_IEN_RSQREP_MASK 0x0800
#define GPO_IEN_STCIEN_SHFT 0
#define GPO_IEN_ASQIEN_SHFT 1
#define GPO_IEN_RDSIEN_SHFT 2
#define GPO_IEN_RSQIEN_SHFT 3
#define GPO_IEN_ERRIEN_SHFT 6
#define GPO_IEN_CTSIEN_SHFT 7
#define GPO_IEN_STCREP_SHFT 8
#define GPO_IEN_ASQREP_SHFT 9
#define GPO_IEN_RDSREP_SHFT 10
#define GPO_IEN_RSQREP_SHFT 11
// DIGITAL_INPUT_FORMAT
#define DIGITAL_INPUT_FORMAT 0x0101
#define DIGITAL_INPUT_FORMAT_ISIZE_MASK 0x0003
#define DIGITAL_INPUT_FORMAT_IMONO_MASK 0x0004
#define DIGITAL_INPUT_FORMAT_IMODE_MASK 0x0078
#define DIGITAL_INPUT_FORMAT_IFALL_MASK 0x0080
#define DIGITAL_INPUT_FORMAT_ISIZE_SHFT 0
#define DIGITAL_INPUT_FORMAT_IMONO_SHFT 2
#define DIGITAL_INPUT_FORMAT_IMODE_SHFT 3
#define DIGITAL_INPUT_FORMAT_IFALL_SHFT 7
// DIGITAL_INPUT_SAMPLE_RATE
#define DIGITAL_INPUT_SAMPLE_RATE 0x0103
// DIGITAL_OUTPUT_FORMAT
#define DIGITAL_OUTPUT_FORMAT 0x0102
#define DIGITAL_OUTPUT_FORMAT_OSIZE_MASK 0x0003
#define DIGITAL_OUTPUT_FORMAT_OMONO_MASK 0x0004
#define DIGITAL_OUTPUT_FORMAT_OMODE_MASK 0x0078
#define DIGITAL_OUTPUT_FORMAT_OFALL_MASK 0x0080
#define DIGITAL_OUTPUT_FORMAT_OSIZE_SHFT 0
#define DIGITAL_OUTPUT_FORMAT_OMONO_SHFT 2
#define DIGITAL_OUTPUT_FORMAT_OMODE_SHFT 3
#define DIGITAL_OUTPUT_FORMAT_OFALL_SHFT 7
// DIGITAL_OUTPUT_SAMPLE_RATE
#define DIGITAL_OUTPUT_SAMPLE_RATE 0x0104
// REFCLK_FREQ
#define REFCLK_FREQ 0x0201
// REFCLK_PRESCALE
#define REFCLK_PRESCALE 0x0202
#define REFCLK_PRESCALE_MASK 0x0FFF
#define REFCLK_PRESCALE_SHFT 0
//==================================================================
// FM Receive Properties
//==================================================================
// FM_DEEMPHASIS
#define FM_DEEMPHASIS 0x1100
#define FM_DEEMPHASIS_MASK 0x0003
#define FM_DEEMPHASIS_SHFT 0
// FM_BLEND_STEREO_THRESHOLD
#define FM_BLEND_STEREO_THRESHOLD 0x1105
#define FM_BLEND_STEREO_THRESHOLD_MASK 0x007F
#define FM_BLEND_STEREO_THRESHOLD_SHFT 0
// FM_BLEND_MONO_THRESHOLD
#define FM_BLEND_MONO_THRESHOLD 0x1106
#define FM_BLEND_MONO_THRESHOLD_MASK 0x007F
#define FM_BLEND_MONO_THRESHOLD_SHFT 0
// FM_MAX_TUNE_ERROR
#define FM_MAX_TUNE_ERROR 0x1108
#define FM_MAX_TUNE_ERROR_MASK 0x007F
#define FM_MAX_TUNE_ERROR_SHFT 0
// FM_RSQ_INT_SOURCE
#define FM_RSQ_INT_SOURCE 0x1200
#define FM_RSQ_INT_SOURCE_RSSILIEN_MASK 0x0001
#define FM_RSQ_INT_SOURCE_RSSIHIEN_MASK 0x0002
#define FM_RSQ_INT_SOURCE_ASNRLIEN_MASK 0x0004
#define FM_RSQ_INT_SOURCE_ASNRHIEN_MASK 0x0008
#define FM_RSQ_INT_SOURCE_BLENDIEN_MASK 0x0080
#define FM_RSQ_INT_SOURCE_RSSILIEN_SHFT 0
#define FM_RSQ_INT_SOURCE_RSSIHIEN_SHFT 1
#define FM_RSQ_INT_SOURCE_ASNRLIEN_SHFT 2
#define FM_RSQ_INT_SOURCE_ASNRHIEN_SHFT 3
#define FM_RSQ_INT_SOURCE_BLENDIEN_SHFT 7
// FM_RSQ_SNR_HI_THRESHOLD
#define FM_RSQ_SNR_HI_THRESHOLD 0x1201
#define FM_RSQ_SNR_HI_THRESHOLD_MASK 0x007F
#define FM_RSQ_SNR_HI_THRESHOLD_SHFT 0
// FM_RSQ_SNR_LO_THRESHOLD
#define FM_RSQ_SNR_LO_THRESHOLD 0x1202
#define FM_RSQ_SNR_LO_THRESHOLD_MASK 0x007F
#define FM_RSQ_SNR_LO_THRESHOLD_SHFT 0
// FM_RSQ_RSSI_HI_THRESHOLD
#define FM_RSQ_RSSI_HI_THRESHOLD 0x1203
#define FM_RSQ_RSSI_HI_THRESHOLD_MASK 0x007F
#define FM_RSQ_RSSI_HI_THRESHOLD_SHFT 0
// FM_RSQ_RSSI_LO_THRESHOLD
#define FM_RSQ_RSSI_LO_THRESHOLD 0x1204
#define FM_RSQ_RSSI_LO_THRESHOLD_MASK 0x007F
#define FM_RSQ_RSSI_LO_THRESHOLD_SHFT 0
// FM_RSQ_BLEND_THRESHOLD
#define FM_RSQ_BLEND_THRESHOLD 0x1207
#define FM_RSQ_BLEND_THRESHOLD_BLEND_MASK 0x007F
#define FM_RSQ_BLEND_THRESHOLD_PILOT_MASK 0x0080
#define FM_RSQ_BLEND_THRESHOLD_BLEND_SHFT 0
#define FM_RSQ_BLEND_THRESHOLD_PILOT_SHFT 7
// FM_SOFT_MUTE_RATE
#define FM_SOFT_MUTE_RATE 0x1300
#define FM_SOFT_MUTE_RATE_MASK 0x00FF
#define FM_SOFT_MUTE_RATE_SHFT 0
// FM_SOFT_MUTE_MAX_ATTENUATION
#define FM_SOFT_MUTE_MAX_ATTENUATION 0x1302
#define FM_SOFT_MUTE_MAX_ATTENUATION_MASK 0x001F
#define FM_SOFT_MUTE_MAX_ATTENUATION_SHFT 0
// FM_SOFT_MUTE_SNR_THRESHOLD
#define FM_SOFT_MUTE_SNR_THRESHOLD 0x1303
#define FM_SOFT_MUTE_SNR_THRESHOLD_MASK 0x000F
#define FM_SOFT_MUTE_SNR_THRESHOLD_SHFT 0
// FM_SEEK_BAND_BOTTOM
#define FM_SEEK_BAND_BOTTOM 0x1400
// FM_SEEK_BAND_TOP
#define FM_SEEK_BAND_TOP 0x1401
// FM_SEEK_FREQ_SPACING
#define FM_SEEK_FREQ_SPACING 0x1402
#define FM_SEEK_FREQ_SPACING_MASK 0x001F
#define FM_SEEK_FREQ_SPACING_SHFT 0
// FM_SEEK_TUNE_SNR_THRESHOLD
#define FM_SEEK_TUNE_SNR_THRESHOLD 0x1403
#define FM_SEEK_TUNE_SNR_THRESHOLD_MASK 0x007F
#define FM_SEEK_TUNE_SNR_THRESHOLD_SHFT 0
// FM_SEEK_TUNE_RSSI_THRESHOLD
#define FM_SEEK_TUNE_RSSI_THRESHOLD 0x1404
#define FM_SEEK_TUNE_RSSI_THRESHOLD_MASK 0x007F
#define FM_SEEK_TUNE_RSSI_THRESHOLD_SHFT 0
// FM_RDS_INTERRUPT_SOURCE
#define FM_RDS_INTERRUPT_SOURCE 0x1500
#define FM_RDS_INTERRUPT_SOURCE_RECV_MASK 0x0001
#define FM_RDS_INTERRUPT_SOURCE_SYNCLOST_MASK 0x0002
#define FM_RDS_INTERRUPT_SOURCE_SYNCFOUND_MASK 0x0004
#define FM_RDS_INTERRUPT_SOURCE_RECV_SHFT 0
#define FM_RDS_INTERRUPT_SOURCE_SYNCLOST_SHFT 1
#define FM_RDS_INTERRUPT_SOURCE_SYNCFOUND_SHFT 2
// FM_RDS_INTERRUPT_FIFO_COUNT
#define FM_RDS_INTERRUPT_FIFO_COUNT 0x1501
#define FM_RDS_INTERRUPT_FIFO_COUNT_MASK 0x00FF
#define FM_RDS_INTERRUPT_FIFO_COUNT_SHFT 0
// FM_RDS_CONFIG
#define FM_RDS_CONFIG 0x1502
#define FM_RDS_CONFIG_RDSEN_MASK 0x0001
#define FM_RDS_CONFIG_BLETHD_MASK 0x0300
#define FM_RDS_CONFIG_BLETHC_MASK 0x0C00
#define FM_RDS_CONFIG_BLETHB_MASK 0x3000
#define FM_RDS_CONFIG_BLETHA_MASK 0xC000
#define FM_RDS_CONFIG_RDSEN_SHFT 0
#define FM_RDS_CONFIG_BLETHD_SHFT 8
#define FM_RDS_CONFIG_BLETHC_SHFT 10
#define FM_RDS_CONFIG_BLETHB_SHFT 12
#define FM_RDS_CONFIG_BLETHA_SHFT 14
//==================================================================
// FM Transmit Properties
//==================================================================
// TX_COMPONENT_ENABLE
#define TX_COMPONENT_ENABLE 0x2100
#define TX_COMPONENT_ENABLE_PILOT_MASK 0x0001
#define TX_COMPONENT_ENABLE_LMR_MASK 0x0002
#define TX_COMPONENT_ENABLE_RDS_MASK 0x0004
#define TX_COMPONENT_ENABLE_PILOT_SHFT 0
#define TX_COMPONENT_ENABLE_LMR_SHFT 1
#define TX_COMPONENT_ENABLE_RDS_SHFT 2
// TX_AUDIO_DEVIATION
#define TX_AUDIO_DEVIATION 0x2101
// TX_PILOT_DEVIATION
#define TX_PILOT_DEVIATION 0x2102
// TX_RDS_DEVIATION
#define TX_RDS_DEVIATION 0x2103
// TX_LINE_INPUT_LEVEL
#define TX_LINE_INPUT_LEVEL 0x2104
#define TX_LINE_INPUT_LEVEL_LILEVEL_MASK 0x03FF
#define TX_LINE_INPUT_LEVEL_LIATTEN_MASK 0x3000
#define TX_LINE_INPUT_LEVEL_LILEVEL_SHFT 0
#define TX_LINE_INPUT_LEVEL_LIATTEN_SHFT 12
// TX_LINE_INPUT_MUTE
#define TX_LINE_INPUT_MUTE 0x2105
#define TX_LINE_INPUT_MUTE_RIMUTE_MASK 0x0001
#define TX_LINE_INPUT_MUTE_LIMUTE_MASK 0x0002
#define TX_LINE_INPUT_MUTE_RIMUTE_SHFT 0
#define TX_LINE_INPUT_MUTE_LIMUTE_SHFT 1
// TX_PREEMPHASIS
#define TX_PREEMPHASIS 0x2106
#define TX_PREMPHASIS_MASK 0x0003
#define TX_PREMPHASIS_SHFT 0
// TX_PILOT_FREQUENCY
#define TX_PILOT_FREQUENCY 0x2107
// TX_ACOMP_ENABLE
#define TX_ACOMP_ENABLE 0x2200
#define TX_ACOMP_ENABLE_ACEN_MASK 0x0001
#define TX_ACOMP_ENABLE_LIMITEN_MASK 0x0002
#define TX_ACOMP_ENABLE_ACEN_SHFT 0
#define TX_ACOMP_ENABLE_LIMITEN_SHFT 1
// TX_ACOMP_THRESHOLD
#define TX_ACOMP_THRESHOLD 0x2201
// TX_ACOMP_ATTACK_TIME
#define TX_ACOMP_ATTACK_TIME 0x2202
#define TX_ACOMP_ATTACK_TIME_MASK 0x000F
#define TX_ACOMP_ATTACK_TIME_SHFT 0
// TX_ACOMP_RELEASE_TIME
#define TX_ACOMP_RELEASE_TIME 0x2203
#define TX_ACOMP_RELEASE_TIME_MASK 0x0007
#define TX_ACOMP_RELEASE_TIME_SHFT 0
// TX_ACOMP_GAIN
#define TX_ACOMP_GAIN 0x2204
#define TX_ACOMP_GAIN_MASK 0x003F
#define TX_ACOMP_GAIN_SHFT 0
// TX_LIMITER_RELEASE_TIME
#define TX_LIMITER_RELEASE_TIME 0x2205
// TX_ASQ_INT_SELECT
#define TX_ASQ_INT_SELECT 0x2300
#define TX_ASQ_INT_SELECT_IALLIEN_MASK 0x0001
#define TX_ASQ_INT_SELECT_IALHIEN_MASK 0x0002
#define TX_ASQ_INT_SELECT_OVERMODIEN_MASK 0x0004
#define TX_ASQ_INT_SELECT_IALLIEN_SHFT 0
#define TX_ASQ_INT_SELECT_IALHIEN_SHFT 1
#define TX_ASQ_INT_SELECT_OVERMODIEN_SHFT 2
// TX_ASQ_LEVEL_LOW
#define TX_ASQ_LEVEL_LOW 0x2301
#define TX_ASQ_LEVEL_LOW_MASK 0x00FF
#define TX_ASQ_LEVEL_LOW_SHFT 0
// TX_ASQ_DURATION_LOW
#define TX_ASQ_DURATION_LOW 0x2302
// TX_ASQ_LEVEL_HIGH
#define TX_ASQ_LEVEL_HIGH 0x2303
#define TX_ASQ_LEVEL_HIGH_MASK 0x00FF
#define TX_ASQ_LEVEL_HIGH_SHFT 0
// TX_ASQ_DURATION_LOW
#define TX_ASQ_DURATION_HIGH 0x2304
// TX_RDS_INT_SOURCE
#define TX_RDS_INT_SOURCE 0x2C00
#define TX_RDS_INT_SOURCE_FIFOMT_MASK 0x0001
#define TX_RDS_INT_SOURCE_CBUFWRAP_MASK 0x0002
#define TX_RDS_INT_SOURCE_FIFOXMIT_MASK 0x0004
#define TX_RDS_INT_SOURCE_CBUFXMIT_MASK 0x0008
#define TX_RDS_INT_SOURCE_PSXMIT_MASK 0x0010
#define TX_RDS_INT_SOURCE_FIFOMT_SHFT 0
#define TX_RDS_INT_SOURCE_CBUFWRAP_SHFT 1
#define TX_RDS_INT_SOURCE_FIFOXMIT_SHFT 2
#define TX_RDS_INT_SOURCE_CBUFXMIT_SHFT 3
#define TX_RDS_INT_SOURCE_PSXMIT_SHFT 4
// TX_RDS_PI
#define TX_RDS_PI 0x2C01
// TX_RDS_PS_MIX
#define TX_RDS_PS_MIX 0x2C02
#define TX_RDS_PS_MIX_MASK 0x0007
#define TX_RDS_PS_MIX_SHFT 0
// TX_RDS_PS_MISC
#define TX_RDS_PS_MISC 0x2C03
#define TX_RDS_PS_MISC_RDSMS_MASK 0x0008
#define TX_RDS_PS_MISC_RDSTA_MASK 0x0010
#define TX_RDS_PS_MISC_RDSPTY_MASK 0x03E0
#define TX_RDS_PS_MISC_RDSTP_MASK 0x0400
#define TX_RDS_PS_MISC_FORCEB_MASK 0x0800
#define TX_RDS_PS_MISC_RDSD0_MASK 0x1000
#define TX_RDS_PS_MISC_RDSD1_MASK 0x2000
#define TX_RDS_PS_MISC_RDSD2_MASK 0x4000
#define TX_RDS_PS_MISC_RDSD3_MASK 0x8000
#define TX_RDS_PS_MISC_RDSMS_SHFT 3
#define TX_RDS_PS_MISC_RDSTA_SHFT 4
#define TX_RDS_PS_MISC_RDSPTY_SHFT 5
#define TX_RDS_PS_MISC_RDSTP_SHFT 10
#define TX_RDS_PS_MISC_FORCEB_SHFT 11
#define TX_RDS_PS_MISC_RDSD0_SHFT 12
#define TX_RDS_PS_MISC_RDSD1_SHFT 13
#define TX_RDS_PS_MISC_RDSD2_SHFT 14
#define TX_RDS_PS_MISC_RDSD3_SHFT 15
// TX_RDS_PS_REPEAT_COUNT
#define TX_RDS_PS_REPEAT_COUNT 0x2C04
#define TX_RDS_PS_REPEAT_COUNT_MASK 0x00FF
#define TX_RDS_PS_REPEAT_COUNT_SHFT 0
// TX_RDS_PS_MESSAGE_COUNT
#define TX_RDS_PS_MESSAGE_COUNT 0x2C05
#define TX_RDS_PS_MESSAGE_COUNT_MASK 0x000F
#define TX_RDS_PS_MESSAGE_COUNT_SHFT 0
// TX_RDS_PS_AF
#define TX_RDS_PS_AF 0x2C06
// TX_RDS_FIFO_SIZE
#define TX_RDS_FIFO_SIZE 0x2C07
#define TX_RDS_FIFO_SIZE_MASK 0x00FF
#define TX_RDS_FIFO_SIZE_SHFT 0
//==================================================================
// AM Receive Properties
//==================================================================
// AM_DEEMPHASIS
#define AM_DEEMPHASIS 0x3100
#define AM_DEEMPHASIS_MASK 0x0001
#define AM_DEEMPHASIS_SHFT 0
// AM_CHANNEL_FILTER
#define AM_CHANNEL_FILTER 0x3102
#define AM_CHANNEL_FILTER_MASK 0x0007
#define AM_CHANNEL_FILTER_SHFT 0
// AM_RSQ_INT_SOURCE
#define AM_RSQ_INTERRUPTS 0x3200 //Si473x
//#define AM_RSQ_INT_SOURCE 0x3200
#define AM_RSQ_INT_SOURCE_RSSILIEN_MASK 0x0001
#define AM_RSQ_INT_SOURCE_RSSIHIEN_MASK 0x0002
#define AM_RSQ_INT_SOURCE_ASNRLIEN_MASK 0x0004
#define AM_RSQ_INT_SOURCE_ASNRHIEN_MASK 0x0008
#define AM_RSQ_INT_SOURCE_RSSILIEN_SHFT 0
#define AM_RSQ_INT_SOURCE_RSSIHIEN_SHFT 1
#define AM_RSQ_INT_SOURCE_ASNRLIEN_SHFT 2
#define AM_RSQ_INT_SOURCE_ASNRHIEN_SHFT 3
// AM_RSQ_SNR_HI_THRESHOLD
#define AM_RSQ_SNR_HI_THRESHOLD 0x3201
#define AM_RSQ_SNR_HI_THRESHOLD_MASK 0x007F
#define AM_RSQ_SNR_HI_THRESHOLD_SHFT 0
// AM_RSQ_SNR_LO_THRESHOLD
#define AM_RSQ_SNR_LO_THRESHOLD 0x3202
#define AM_RSQ_SNR_LO_THRESHOLD_MASK 0x007F
#define AM_RSQ_SNR_LO_THRESHOLD_SHFT 0
// AM_RSQ_RSSI_HI_THRESHOLD
#define AM_RSQ_RSSI_HI_THRESHOLD 0x3203
#define AM_RSQ_RSSI_HI_THRESHOLD_MASK 0x007F
#define AM_RSQ_RSSI_HI_THRESHOLD_SHFT 0
// AM_RSQ_RSSI_LO_THRESHOLD
#define AM_RSQ_RSSI_LO_THRESHOLD 0x3204
#define AM_RSQ_RSSI_LO_THRESHOLD_MASK 0x007F
#define AM_RSQ_RSSI_LO_THRESHOLD_SHFT 0
// AM_SOFT_MUTE_RATE
#define AM_SOFT_MUTE_RATE 0x3300
// AM_SOFT_MUTE_SLOPE
#define AM_SOFT_MUTE_SLOPE 0x3301
#define AM_SOFT_MUTE_SLOPE_MASK 0x000F
#define AM_SOFT_MUTE_SLOPE_SHFT 0
// AM_SOFT_MUTE_MAX_ATTENUATION
#define AM_SOFT_MUTE_MAX_ATTENUATION 0x3302
#define AM_SOFT_MUTE_MAX_ATTENUATION_MASK 0x003F
#define AM_SOFT_MUTE_MAX_ATTENUATION_SHFT 0
// AM_SOFT_MUTE_SNR_THRESHOLD
#define AM_SOFT_MUTE_SNR_THRESHOLD 0x3303
#define AM_SOFT_MUTE_SNR_THRESHOLD_MASK 0x003F
#define AM_SOFT_MUTE_SNR_THRESHOLD_SHFT 0
// AM_SEEK_BAND_BOTTOM
#define AM_SEEK_BAND_BOTTOM 0x3400
// AM_SEEK_BAND_TOP
#define AM_SEEK_BAND_TOP 0x3401
// AM_SEEK_FREQ_SPACING
#define AM_SEEK_FREQ_SPACING 0x3402
#define AM_SEEK_FREQ_SPACING_MASK 0x000F
#define AM_SEEK_FREQ_SPACING_SHFT 0
// AM_SEEK_TUNE_SNR_THRESHOLD
//#define AM_SEEK_TUNE_SNR_THRESHOLD 0x3403 //Si474x
#define AM_SEEK_SNR_THRESHOLD 0x3403 //Si473x
#define AM_SEEK_TUNE_SNR_THRESHOLD_MASK 0x003F
#define AM_SEEK_TUNE_SNR_THRESHOLD_SHFT 0
// AM_SEEK_TUNE_RSSI_THRESHOLD
//#define AM_SEEK_TUNE_RSSI_THRESHOLD 0x3404 //Si474x
#define AM_SEEK_RSSI_THRESHOLD 0x3404 //Si473x
#define AM_SEEK_TUNE_RSSI_THRESHOLD_MASK 0x003F
#define AM_SEEK_TUNE_RSSI_THRESHOLD_SHFT 0
//==================================================================
// General Receive Properties
//==================================================================
// RX_VOLUME
#define RX_VOLUME 0x4000
#define RX_VOLUME_MASK 0x003F
#define RX_VOLUME_SHFT 0
// RX_HARD_MUTE
#define RX_HARD_MUTE 0x4001
#define RX_HARD_MUTE_RMUTE_MASK 0x0001
#define RX_HARD_MUTE_LMUTE_MASK 0x0002
#define RX_HARD_MUTE_RMUTE_SHFT 0
#define RX_HARD_MUTE_LMUTE_SHFT 1
//==================================================================
// Bit Definitions for Properties
//==================================================================
// DIGITAL_MODE - used for input or output
#define DIGITAL_MODE_I2S 0x0
#define DIGITAL_MODE_LEFT 0x6
#define DIGITAL_MODE_MSB1ST 0xC
#define DIGITAL_MODE_MSB2ND 0x8
// DIGITAL_SIZE - used for input or output
#define DIGITAL_SIZE_16 0x0
#define DIGITAL_SIZE_20 0x1
#define DIGITAL_SIZE_24 0x2
#define DIGITAL_SIZE_8 0x3
// FM_DEEMPH
#define FM_DEEMPH_75US 0x2
#define FM_DEEMPH_50US 0x1
// FM_RDS_BLETH - used for all block error thresholds
#define FM_RDS_BLETH_NO_ERRORS 0x0
#define FM_RDS_BLETH_1OR2_ERRORS 0x1
#define FM_RDS_BLETH_3TO5_ERRORS 0x2
#define FM_RDS_BLETH_UNCORRECTABLE 0x3
// TX_LINE_INPUT_LEVEL_LIATTEN
#define TX_LINE_INPUT_LEVEL_LIATTEN_396kOhm 0x0000
#define TX_LINE_INPUT_LEVEL_LIATTEN_100kOhm 0x1000
#define TX_LINE_INPUT_LEVEL_LIATTEN_74kOhm 0x2000
#define TX_LINE_INPUT_LEVEL_LIATTEN_60kOhm 0x3000
// TX_DEEMPHASIS
#define TX_PREEMPHASIS_75US 0x0
#define TX_PREEMPHASIS_50US 0x1
#define TX_PREEMPHASIS_DISABLED 0x2
// TX_ACOMP_ATTACK_TIME
#define TX_ACOMP_ATTACK_TIME_0_5MS 0x0
#define TX_ACOMP_ATTACK_TIME_1_0MS 0x1
#define TX_ACOMP_ATTACK_TIME_1_5MS 0x2
#define TX_ACOMP_ATTACK_TIME_2_0MS 0x3
#define TX_ACOMP_ATTACK_TIME_2_5MS 0x4
#define TX_ACOMP_ATTACK_TIME_3_0MS 0x5
#define TX_ACOMP_ATTACK_TIME_3_5MS 0x6
#define TX_ACOMP_ATTACK_TIME_4_0MS 0x7
#define TX_ACOMP_ATTACK_TIME_4_5MS 0x8
#define TX_ACOMP_ATTACK_TIME_5_0MS 0x9
// TX_ACOMP_RELEASE_TIME
#define TX_ACOMP_RELEASE_TIME_100MS 0x0
#define TX_ACOMP_RELEASE_TIME_200MS 0x1
#define TX_ACOMP_RELEASE_TIME_350MS 0x2
#define TX_ACOMP_RELEASE_TIME_525MS 0x3
#define TX_ACOMP_RELEASE_TIME_1000MS 0x4
// TX_RDS_PS_MIX
#define TX_RDS_PS_MIX_FIFO_EMPTY 0x0
#define TX_RDS_PS_MIX_12_5_PCT 0x1
#define TX_RDS_PS_MIX_25_PCT 0x2
#define TX_RDS_PS_MIX_50_PCT 0x3
#define TX_RDS_PS_MIX_75_PCT 0x4
#define TX_RDS_PS_MIX_87_5_PCT 0x5
#define TX_RDS_PS_MIX_100_PCT 0x6
// TX_RDS_PS_MISC_PTY
#define TX_RDS_PS_MISC_PTY_NONE 0
#define TX_RDS_PS_MISC_PTY_NEWS 1
#define TX_RDS_PS_MISC_PTY_INFO 2
#define TX_RDS_PS_MISC_PTY_SPORTS 3
#define TX_RDS_PS_MISC_PTY_TALK 4
#define TX_RDS_PS_MISC_PTY_ROCK 5
#define TX_RDS_PS_MISC_PTY_CLROCK 6
#define TX_RDS_PS_MISC_PTY_ADHITS 7
#define TX_RDS_PS_MISC_PTY_SOFTROCK 8
#define TX_RDS_PS_MISC_PTY_TOP40 9
#define TX_RDS_PS_MISC_PTY_COUNTRY 10
#define TX_RDS_PS_MISC_PTY_OLDIES 11
#define TX_RDS_PS_MISC_PTY_SOFT 12
#define TX_RDS_PS_MISC_PTY_NOST 13
#define TX_RDS_PS_MISC_PTY_JAZZ 14
#define TX_RDS_PS_MISC_PTY_CLASS 15
#define TX_RDS_PS_MISC_PTY_RHYBLUES 16
#define TX_RDS_PS_MISC_PTY_SOFTRB 17
#define TX_RDS_PS_MISC_PTY_FGNLANG 18
#define TX_RDS_PS_MISC_PTY_RMUSIC 19
#define TX_RDS_PS_MISC_PTY_RTALK 20
#define TX_RDS_PS_MISC_PTY_PERS 21
#define TX_RDS_PS_MISC_PTY_PUBLIC 22
#define TX_RDS_PS_MISC_PTY_COLLEGE 23
#define TX_RDS_PS_MISC_PTY_UN24 24
#define TX_RDS_PS_MISC_PTY_UN25 25
#define TX_RDS_PS_MISC_PTY_UN26 26
#define TX_RDS_PS_MISC_PTY_UN27 27
#define TX_RDS_PS_MISC_PTY_UN28 28
#define TX_RDS_PS_MISC_PTY_WTHR 29
#define TX_RDS_PS_MISC_PTY_EMERTEST 30
#define TX_RDS_PS_MISC_PTY_ALERT 31
// AM_CHANNEL_FILTER_BW
#define AM_CHANNEL_FILTER_BW_6KHZ 0
#define AM_CHANNEL_FILTER_BW_4KHZ 1
#define AM_CHANNEL_FILTER_BW_3KHZ 2
#define AM_CHANNEL_FILTER_BW_2KHZ 3
//==================================================================
// WB Receive Properties
//==================================================================
// WB_MAX_TUNE_ERROR
#define WB_MAX_TUNE_ERROR 0x5108
// WB_VALID_SNR_THRESHOLD
#define WB_VALID_SNR_THRESHOLD 0x5403
#define WB_VALID_SNR_THRESHOLD_MASK 0x007F
#define WB_VALID_SNR_THRESHOLD_SHFT 0
// WB_VALID_RSSI_THRESHOLD
#define WB_VALID_RSSI_THRESHOLD 0x5404
#define WB_VALID_RSSI_THRESHOLD_MASK 0x007F
#define WB_VALID_RSSI_THRESHOLD_SHFT 0
#define FM_BAND 1
#define AM_BAND 2
#define IO2W_SENB0_ADDRESS 0x22
#define IO2W_SENB1_ADDRESS 0xC6
#define SENB 0
#define DEMO_DELAY 5000
#define RDS_DELAY 30000
//-----------------------------------------------------------------------------
// Defines
//-----------------------------------------------------------------------------
#define IO3W 0
#define IO2W 1
#define MIN_FM_FREQ 8750
#define MAX_FM_FREQ 10800
#define FM_STEP 10
#define MIN_AM_FREQ 522
#define MAX_AM_FREQ 1620
#define AM_STEP 9
extern void TU_Init(void);
extern T_ERROR_OP Si47XX_Power_Up(T_POWER_UP_TYPE power_up_type);
extern T_ERROR_OP Si47XX_Wait_STC(void);
extern void si47xx_set_property(unsigned int propNumber, unsigned int propValue);
extern void Si47XX_SetDSPPropertys(unsigned char IN_RxSensitivity);
extern void Si47XX_Power_OFF(void);
extern void ResetSi47XX_2w(void);
extern unsigned char OperationSi47XX_2w(T_OPERA_MODE operation, unsigned char *data1, unsigned char numBytes);
extern unsigned char si47xx_get_vol(void);
extern void si47xx_set_vol(unsigned char vol);
extern void si47xx_mute(unsigned char muteStaus);
extern T_ERROR_OP Si47XX_Set_FM_Frequency(unsigned short channel_freq);
extern unsigned int si47xx_command_TUNE_STATUS_Freq(unsigned char band);
extern unsigned char si47xx_command_FM_SEEK_START_DOWN(void);
extern unsigned char si47xx_command_FM_SEEK_START_UP(void);
#endif
//Copright (c) 2021,FFT_Combo
//All rights reserved.
//名稱(chēng): radio.c
//說(shuō)明: si4730驅(qū)動(dòng)
//作者: feeling1791 (Wechat)
//日期: 2020-12-20
//版本: ver3.1
#include "radio.h"
#include "delay.h"
#include "display.h"
void TU_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5| GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//GPIO_SetBits(GPIOA,GPIO_Pin_5); //sda
//GPIO_SetBits(GPIOA,GPIO_Pin_6); //scl
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_1 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//GPIO_SetBits(GPIOA,GPIO_Pin_7); //rst
TU_POWER_OFF();//Tuner power control,Hight--->OFF,Low---> ON
}
/**************************************
// 設(shè)備上電,IC軟開(kāi)機(jī)
***************************************/
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,0xd0,0x05};
ResetSi47XX_2w();
delay_ms(250); //if use internal crystal, need wait 500ms, Si47XX_power_up[1] = 0x(5x)
switch(power_up_type)
{
case FM_RECEIVER:
{
Si47XX_power_up[1] = 0xd0; //使用時(shí)鐘晶振,32.768khz ,FM模式
Si47XX_power_up[2] = 0x05; ////模擬L/R輸出
break;
}
case AM_RECEIVER:
{
Si47XX_power_up[1] = 0xd1;
Si47XX_power_up[2] = 0x05;
break;
}
}
//send CMD
error_ind = OperationSi47XX_2w(WRITE, &(Si47XX_power_up[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;
}
/**************************************
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;
}
//-----------------------------------------------------------------------------------------------
// 設(shè)置屬性值(屬性格式0x0000)
//-----------------------------------------------------------------------------------------------
void si47xx_set_property(unsigned int propNumber, unsigned int propValue)
{
unsigned char cmd[8]={0x00,0xd0,0x00,0x00,0x00,0x00,0x00,0x00};
cmd[0] = SET_PROPERTY;
// Initialize the reserved section to 0
cmd[1] = 0;
// Put the property number in the third and fourth bytes.
cmd[2] = (unsigned char)(propNumber >> 8);
cmd[3] = (unsigned char)(propNumber & 0x00FF);
// Put the property value in the fifth and sixth bytes.
cmd[4] = (unsigned char)(propValue >> 8);
cmd[5] = (unsigned char)(propValue & 0x00FF);
// Invoke the command
OperationSi47XX_2w(WRITE,&cmd[0],6);
}
//-----------------------------------------------------------------------------------------------
// 設(shè)備參數(shù)初始化(設(shè)置屬性)
//-----------------------------------------------------------------------------------------------
void Si47XX_SetDSPPropertys(unsigned char IN_RxSensitivity)
{
//設(shè)定中斷 STCIEN
si47xx_set_property(GPO_IEN,0x00c9);
delay_ms(10);
//設(shè)定參考時(shí)鐘 32768K
si47xx_set_property(REFCLK_FREQ,0x8000);
delay_ms(10);
//設(shè)定參考時(shí)鐘分頻 1分頻
si47xx_set_property(REFCLK_PRESCALE,0x0001);
delay_ms(10);
//設(shè)定音量0~63
si47xx_set_property(RX_VOLUME,63);
delay_ms(10);
//設(shè)定左右聲道靜音
si47xx_set_property(RX_HARD_MUTE,0x0000);
delay_ms(10);
//FM調(diào)頻屬性設(shè)置
//設(shè)定去加重50us 0x0001
si47xx_set_property(FM_DEEMPHASIS,FM_Deemphasis);
delay_ms(10);
//設(shè)定FM_BLEND_STEREO_THRESHOLD 30 dBuV RSSI高于設(shè)定閾值時(shí)開(kāi)啟立體聲模式
si47xx_set_property(FM_BLEND_STEREO_THRESHOLD,FM_BLEND_STEREO);
//設(shè)定FM_BLEND_STEREO_THRESHOLD 強(qiáng)制立體聲 設(shè)置為0
//si47xx_set_property(FM_BLEND_STEREO_THRESHOLD,0x0000);
delay_ms(10);
//設(shè)定FM_BLEND_MONO_THRESHOLD 30 dBuV RSSI低于于設(shè)定閾值時(shí)開(kāi)啟混音模式
si47xx_set_property(FM_BLEND_MONO_THRESHOLD,FM_BLEND_MONO);
//設(shè)定FM_BLEND_MONO_THRESHOLD 強(qiáng)制立體聲 設(shè)置為0
//si47xx_set_property(FM_BLEND_MONO_THRESHOLD,0x0000);
delay_ms(10);
//設(shè)定FM_MAX_TUNE_ERROR 40 kHz
si47xx_set_property(FM_MAX_TUNE_ERROR,0x0028);
delay_ms(10);
//設(shè)定FM_RSQ_INT_SOURCE Enable blend,Audio SNR high,Audio SNR low,RSSI high and RSSI low interrupts.
si47xx_set_property(FM_RSQ_INT_SOURCE,0x008f);
delay_ms(10);
//設(shè)定FM_RSQ_SNR_HI_THRESHOLD 30dB
si47xx_set_property(FM_RSQ_SNR_HI_THRESHOLD,0x001e);
delay_ms(10);
//設(shè)定FM_RSQ_SNR_LO_THRESHOLD 6dB
si47xx_set_property(FM_RSQ_SNR_LO_THRESHOLD,0x0006);
delay_ms(10);
//設(shè)定FM_RSQ_RSSI_HI_THRESHOLD 50dBuV
si47xx_set_property(FM_RSQ_RSSI_HI_THRESHOLD,0x0032);
delay_ms(10);
//設(shè)定FM_RSQ_RSSI_LO_THRESHOLD 24dBuV
si47xx_set_property(FM_RSQ_RSSI_LO_THRESHOLD,0x0018);
delay_ms(10);
//設(shè)定FM_RSQ_BLEND_THRESHOLD 50%
si47xx_set_property(FM_RSQ_BLEND_THRESHOLD,0x0032);
delay_ms(10);
//設(shè)定FM_SOFT_MUTE_MAX_ATTENUATION 10dB
si47xx_set_property(FM_SOFT_MUTE_MAX_ATTENUATION,0x000a);
delay_ms(10);
//設(shè)定FM_SOFT_MUTE_SNR_THRESHOLD 6dB
si47xx_set_property(FM_SOFT_MUTE_SNR_THRESHOLD,0x0006);
delay_ms(10);
//設(shè)定FM_SEEK_BAND_BOTTOM 8750(87.5M) 0x21fc
si47xx_set_property(FM_SEEK_BAND_BOTTOM,FM_BAND_BOTTOM_VALUE);
delay_ms(10);
//設(shè)定FM_SEEK_BAND_TOP 10790 (107.9) 0x2a26
si47xx_set_property(FM_SEEK_BAND_TOP,FM_BAND_TOP_VALUE);
delay_ms(10);
//設(shè)定FM_SEEK_FREQ_SPACING 100k 0x000a 100 kHz Spacing
si47xx_set_property(FM_SEEK_FREQ_SPACING,FM_bandwidth);
delay_ms(10);
if(IN_RxSensitivity==0)
{
//設(shè)定FM_SEEK_TUNE_SNR_THRESHOLD 2dBuV 0x0002
si47xx_set_property(FM_SEEK_TUNE_SNR_THRESHOLD,FM_SNR_LOCAL);
delay_ms(10);
//設(shè)定FM_SEEK_TUNE_RSSI_THRESHOLD 8dBuV 0x0008
si47xx_set_property(FM_SEEK_TUNE_RSSI_THRESHOLD,FM_RSSI_LOCAL);
delay_ms(10);
}
else
{
//設(shè)定FM_SEEK_TUNE_SNR_THRESHOLD 2dBuV 0x0002
si47xx_set_property(FM_SEEK_TUNE_SNR_THRESHOLD,FM_SNR_REMOTE);
delay_ms(10);
//設(shè)定FM_SEEK_TUNE_RSSI_THRESHOLD 8dBuV 0x0008
si47xx_set_property(FM_SEEK_TUNE_RSSI_THRESHOLD,FM_RSSI_REMOTE);
delay_ms(10);
}
//AM調(diào)頻屬性設(shè)置
//設(shè)定AM_CHANNEL_FILTER (4kHz 0x0001)(6kHz 0x0000)(3kHz 0x0002)(2kHz 0x0003)
si47xx_set_property(AM_CHANNEL_FILTER,0x0001);
delay_ms(10);
//設(shè)定AM_DEEMPHASIS 50us 0x0001
si47xx_set_property(AM_DEEMPHASIS,AM_Deemphasis);
delay_ms(10);
//設(shè)定AM_RSQ_INTERRUPTS All interrupts are disabled by default 0x0000
si47xx_set_property(AM_RSQ_INTERRUPTS,0x0000);
delay_ms(10);
//設(shè)定AM_RSQ_SNR_LO_THRESHOLD 10 dB 0x000a
si47xx_set_property(AM_RSQ_SNR_LO_THRESHOLD,0x000a);
delay_ms(10);
//設(shè)定AM_RSQ_SNR_HI_THRESHOLD 10 dB 0x000a
si47xx_set_property(AM_RSQ_SNR_HI_THRESHOLD,0x000a);
delay_ms(10);
//設(shè)定AM_RSQ_RSSI_HI_THRESHOLD 30 dB 0x001e
si47xx_set_property(AM_RSQ_RSSI_HI_THRESHOLD,0x001e);
delay_ms(10);
//設(shè)定AM_RSQ_RSSI_LO_THRESHOLD 10 dB 0x000a
si47xx_set_property(AM_RSQ_RSSI_LO_THRESHOLD,0x000a);
delay_ms(10);
//設(shè)定AM_SOFT_MUTE_RATE 278dB/s 0x0040
si47xx_set_property(AM_SOFT_MUTE_RATE,0x0040);
delay_ms(10);
//設(shè)定AM_SOFT_MUTE_MAX_ATTENUATION 10dB 0x000a
si47xx_set_property(AM_SOFT_MUTE_MAX_ATTENUATION,0x000a);
delay_ms(10);
//設(shè)定AM_SOFT_MUTE_SNR_THRESHOLD 9dB 0x0009
si47xx_set_property(AM_SOFT_MUTE_SNR_THRESHOLD,0x0009);
delay_ms(10);
//設(shè)定AM_SOFT_MUTE_SNR_THRESHOLD 9dB 0x0009
si47xx_set_property(AM_SOFT_MUTE_SNR_THRESHOLD,0x0009);
delay_ms(10);
//設(shè)定AM_SEEK_BAND_BOTTOM 0x020a 522KHz
si47xx_set_property(AM_SEEK_BAND_BOTTOM,MW_BAND_BOTTOM_VALUE);
delay_ms(10);
//設(shè)定AM_SEEK_BAND_TOP 0x06ae 1710KHz
si47xx_set_property(AM_SEEK_BAND_TOP,MW_BAND_TOP_VALUE);
delay_ms(10);
//設(shè)定AM_SEEK_FREQ_SPACING 0x000a 10kHz
si47xx_set_property(AM_SEEK_FREQ_SPACING,0x0009);
delay_ms(10);
if(IN_RxSensitivity==0)
{
//設(shè)定AM_SEEK_SNR_THRESHOLD 0x0002 2dB
si47xx_set_property(AM_SEEK_SNR_THRESHOLD,MW_SNR_LOCAL);
delay_ms(10);
//設(shè)定AM_SEEK_RSSI_THRESHOLD 0x000f 15dBuV
si47xx_set_property(AM_SEEK_RSSI_THRESHOLD,MW_RSSI_LOCAL);
delay_ms(10);
}
else
{
//設(shè)定AM_SEEK_SNR_THRESHOLD 0x0002 2dB
si47xx_set_property(AM_SEEK_SNR_THRESHOLD,MW_SNR_REMOTE);
delay_ms(10);
//設(shè)定AM_SEEK_RSSI_THRESHOLD 0x000f 15dBuV
si47xx_set_property(AM_SEEK_RSSI_THRESHOLD,MW_RSSI_REMOTE);
delay_ms(10);
}
}
//-----------------------------------------------------------------------------------------------
// 設(shè)備關(guān)機(jī)
//-----------------------------------------------------------------------------------------------
void Si47XX_Power_OFF(void)
{
unsigned char write_buf[1]={0x00};
write_buf[0]=POWER_DOWN;
OperationSi47XX_2w(WRITE,&write_buf[0],1);
delay_us(300);
}
//-----------------------------------------------------------------------------------------------
//獲取屬性值(高8位,低8位分別獲取)
//-----------------------------------------------------------------------------------------------
void si47xx_get_property(unsigned int propNumber, unsigned char *valueH,unsigned char *valueL)
{
unsigned char cmd[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
cmd[0] = GET_PROPERTY;
//Initialize the reserved section to 0
cmd[1] = 0;
//Put the property number in the third and fourth bytes.
cmd[2] = (unsigned char)(propNumber >> 8);
cmd[3] = (unsigned char)(propNumber & 0x00FF);
//Invoke the command
OperationSi47XX_2w(WRITE,&cmd[0],4);
delay_ms(300);
OperationSi47XX_2w(READ,&cmd[0],4);
*valueH = cmd[2];
*valueL = cmd[3];
//Freq=((u16)rsp[2] << 8) | (u16)rsp[3];
}
//-----------------------------------------------------------------------------------------------
//獲取音量值
//-----------------------------------------------------------------------------------------------
unsigned char si47xx_get_vol(void)
{
unsigned char valueH = 0;
unsigned char valueL = 0;
unsigned char vol;
si47xx_get_property(RX_VOLUME, &valueH, &valueL);
delay_ms(10);
vol=((u16)valueH << 8) | (u16)valueL;
return vol;
}
//-----------------------------------------------------------------------------------------------
//設(shè)定音量值
//-----------------------------------------------------------------------------------------------
void si47xx_set_vol(unsigned char vol)
{
if(vol <= 63)
{
si47xx_set_property(RX_VOLUME,vol);
delay_ms(10);
}
}
//-----------------------------------------------------------------------------------------------
//MUTE AUDIO
//-----------------------------------------------------------------------------------------------
void si47xx_mute(unsigned char muteStaus)
{
if(muteStaus)
{
si47xx_set_property(RX_HARD_MUTE,0x0003); //mute on
delay_ms(10);
}
else
{
si47xx_set_property(RX_HARD_MUTE,0x0000); //unmute
delay_ms(10);
}
}
/**************************************
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,0x08}; //RSSI threshold = 0x0008 = 8dBuV
//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,0x00,0x00,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;
}
/**************************************
Si47XX_Set_FM_Frequency()
***************************************/
T_ERROR_OP Si47XX_Set_FM_Frequency(unsigned short channel_freq)
{
if(Si47XX_FM_Tune_Freq(channel_freq) != OK) return G_ERROR;
if(Si47XX_Wait_STC() != OK) return G_ERROR;
return OK;
}
//-----------------------------------------------------------------------------------------------
// 設(shè)備復(fù)位
//-----------------------------------------------------------------------------------------------
void ResetSi47XX_2w(void)
{
TU_SDA_OUT();
TU_SCL_OUT();
TU_SDA_L;
TU_RST_L;
TU_SCL_H;
delay_ms(500);
TU_RST_H;
delay_ms(10);
TU_SDA_H;
delay_ms(10);
}
//-----------------------------------------------------------------------------------------------
// IIC 讀寫(xiě)函數(shù) 例如 OperationSi47XX_2w(WRITE,&write_buf[0],3); OperationSi47XX_2w(READ,&cmd[0],4);
//-----------------------------------------------------------------------------------------------
unsigned char OperationSi47XX_2w(T_OPERA_MODE operation, unsigned char *data1, unsigned char numBytes)
{
unsigned char controlWord,j;
unsigned char error = 0;
char i;
//Start: make sure here SCK = 1,SDA = 1(output).
TU_SCL_H;
TU_SDA_H;
delay_us(3);
TU_SDA_L;
delay_us(3);
TU_SCL_L;
delay_us(3);
//Write control data: make sure here: SCL = 0; SDA = 0
//controlWord = radio_address | (operation & 0x01);
//sens = 0 device address = 0010001x r/w b
//sens = 1 device address = 1100011x r/w b
if(operation == READ)
{
controlWord = 0xc7; //IIC器件讀地址0xc7
}
else
{
controlWord = 0xc6; //IIC器件寫(xiě)地址0xc6
}
for(i = 8; i > 0; i--) //Write 1 byte
{
if((controlWord >> (i-1)) & 0x01)
TU_SDA_H;
else
TU_SDA_L;
delay_us(3);
TU_SCL_H;
delay_us(3);
TU_SCL_L;
delay_us(3);
}
//Check ACK for control word
/*******************************************/
TU_SDA_IN();
delay_us(3);
TU_SCL_H;
delay_us(3);
if((TU_SDA_read) != 0)
{
error = 1;
goto Stop_2W;
}
/*******************************************/
TU_SCL_L;
delay_us(3);
//WRITE or READ data
for(j = 0; j < numBytes; j++, data1++)
{
if(operation == WRITE)
{
TU_SDA_OUT();
}
else
{
TU_SDA_IN();
}
for(i = 8; i > 0; i--) //write or read 1 byte
{
if(operation == WRITE)
{
if( (*data1 >> (i-1)) & 0x01 )
TU_SDA_H;
else
TU_SDA_L;
}
delay_us(3);
TU_SCL_H;
delay_us(3);
if(operation == READ)
{
*data1 = (*data1 << 1) | (TU_SDA_read); //READ_SDIO;
}
TU_SCL_L;
delay_us(3);
}
//CHECK ACK or SEND ACK=0,最后一個(gè)bit 的ACK必須發(fā)送
if(operation == WRITE)
{
TU_SDA_IN();
}
else
{
TU_SDA_OUT();
if(j == (numBytes - 1))
TU_SDA_H;
else
TU_SDA_L;
}
delay_us(3);
TU_SCL_H;
delay_us(3);
if(operation == WRITE)
{
if((TU_SDA_read) != 0)
{
error = 1;
goto Stop_2W;
}
}
TU_SCL_L;
delay_us(3);
}
//STOP: make sure here: SCL= 0
Stop_2W:
TU_SDA_OUT();
TU_SDA_L;
delay_us(3);
TU_SCL_H;
delay_us(3);
TU_SDA_H;
delay_us(3);
return(error); //no return data
}
unsigned char si47xx_command_FM_SEEK_START_UP(void)
{
unsigned short loop_counter = 0;
unsigned char RES_buf[1]={0x00};
unsigned char cmd[2]={0x00,0x00};
cmd[0]=FM_SEEK_START;
cmd[1]=0x0c;
OperationSi47XX_2w(WRITE,&cmd[0],2);
delay_ms(150);
do{
OperationSi47XX_2w(READ,&RES_buf[0],1);
delay_us(300);
loop_counter++;
}
while((((RES_buf[0])&0x80) == 0) && (loop_counter < 0xff));
if(loop_counter >= 0xff)
{
return ERROR;
}
else
{
return OK;
}
}
//-----------------------------------------------------------------------------------------------
//自動(dòng)首臺(tái)-向上 FM_SEEK_START
//-----------------------------------------------------------------------------------------------
unsigned char si47xx_command_FM_SEEK_START_DOWN(void)
{
unsigned short loop_counter = 0;
unsigned char RES_buf[1]={0x00};
unsigned char cmd[2]={0x00,0x00};
cmd[0]=FM_SEEK_START;
cmd[1]=0x04;
OperationSi47XX_2w(WRITE, &cmd[0],2);
delay_ms(150);
do{
OperationSi47XX_2w(READ,&RES_buf[0],1);
delay_us(300);
loop_counter++;
}
while((((RES_buf[0])&0x80) == 0) && (loop_counter < 0xff));
if(loop_counter >= 0xff)
{
return ERROR;
}
else
{
return OK;
}
}
/********************************************************************************************************************************/
void si47xx_command_FM_TUNE_STATUS(unsigned char *res)
{
unsigned char cmd[2]={0x00,0x00};
cmd[0]=FM_TUNE_STATUS;
cmd[1]=0x03; //aborts a seek currently in progress;clears the seek/tune complete interrupt status indicator 0x01 不然搜臺(tái)錯(cuò)誤。
OperationSi47XX_2w(WRITE,&cmd[0],2);
delay_us(300);
OperationSi47XX_2w(READ,&res[0],8);
}
void si47xx_command_GET_INT_STATUS(unsigned char *res)
{
unsigned char cmd[2]={0x00,0x00};
cmd[0]=GET_INT_STATUS;
//cmd[1]=0x01; //clears the seek/tune complete interrupt status indicator 0x01 不然搜臺(tái)錯(cuò)誤。
OperationSi47XX_2w(WRITE,&cmd[0],1);
delay_us(300);
OperationSi47XX_2w(READ,&res[0],1);
}
unsigned int si47xx_command_TUNE_STATUS_Freq(unsigned char band)
{
unsigned int Freq;
unsigned char rsp[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char Res[1]={0x00};
//Reply Status. Clear-to-send high. STCINT = 1
si47xx_command_GET_INT_STATUS(&Res[0]);
delay_ms(10);
if(band==1)
{
si47xx_command_FM_TUNE_STATUS(&rsp[0]);
if(rsp[0]==0x88)
{
Freq=((u16)rsp[2] << 8) | (u16)rsp[3];
return Freq;
}
else
{
return 0;
}
}
return Freq;
}
/********************************************************************************************************************************/
|
|