找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: feeling1791
打印 上一主题 下一主题
收起左侧

Bluetooth+Si4730+PT2313+TPA3116+Oled 128*64 30W*2多功能功放

  [复制链接]
41#
ID:827391 发表于 2022-12-5 13:05 | 只看该作者

楼主帮忙发一份给我学习学习,万分感谢   479361682@qq.com
回复

使用道具 举报

42#
ID:959743 发表于 2022-12-6 13:48 | 只看该作者
楼主厉害!,超喜欢这个频谱显示,麻烦给份资料学习!!谢谢。892734852@qq.com
回复

使用道具 举报

43#
ID:651494 发表于 2022-12-6 14:58 | 只看该作者
GUOJF2020 发表于 2022-12-5 12:45
主控板和按键板都有,就是蓝牙版本有点低。建荣的蓝牙主控。

是不是广场舞音箱的量产品?带外接输入,蓝牙输入,带USB/CARD读取,功放不错,显示弱了点
回复

使用道具 举报

44#
ID:1051585 发表于 2022-12-10 23:55 | 只看该作者
烦请楼主发一份资料学习学习,谢谢。
回复

使用道具 举报

45#
ID:933601 发表于 2023-2-28 20:31 | 只看该作者
楼主厉害!,超喜欢这个频谱显示,麻烦给份资料学习!!谢谢!
回复

使用道具 举报

46#
ID:742085 发表于 2023-3-21 11:17 | 只看该作者
谢谢分亨。。。麻烦发3293889013@qq.com
回复

使用道具 举报

47#
ID:627633 发表于 2023-3-24 10:19 | 只看该作者
有没软件?能发一份给我学习一下吗?674373430@qq.com
回复

使用道具 举报

48#
ID:627633 发表于 2023-3-24 11:49 | 只看该作者

谢谢分亨。。。麻烦发674373430@qq.com
回复

使用道具 举报

49#
ID:627633 发表于 2023-3-24 13:58 | 只看该作者
有没有软件?能发一份给我学一下吗?
回复

使用道具 举报

50#
ID:293079 发表于 2023-3-29 11:27 | 只看该作者

楼主帮忙发一份给我学习学习,万分感谢 417341723@qq.com
回复

使用道具 举报

51#
ID:102189 发表于 2023-4-20 11:52 | 只看该作者

楼主帮忙发一份给我学习学习,万分感谢8964569652@qq.com

回复

使用道具 举报

52#
ID:828114 发表于 2023-4-28 16:08 来自手机 | 只看该作者
麻烦楼主发一份资料学习学习,万分感谢,2416611411@qq.com
回复

使用道具 举报

53#
ID:1065409 发表于 2023-6-2 22:55 来自手机 | 只看该作者
请楼主发一份给我,整一套来听听。1184327224@qq.com
回复

使用道具 举报

54#
ID:1065409 发表于 2023-6-3 20:51 来自手机 | 只看该作者
请楼主发一份给我听听,谢谢。1184327224@qq.com
回复

使用道具 举报

55#
ID:907827 发表于 2023-6-4 14:40 | 只看该作者
楼主帮忙发一份给我学习学习,万分感谢   865037326@qq.com
回复

使用道具 举报

56#
ID:127035 发表于 2023-7-8 21:58 | 只看该作者
GUOJF2020 发表于 2022-12-5 12:45
主控板和按键板都有,就是蓝牙版本有点低。建荣的蓝牙主控。


楼主你好!发一份给我,谢谢。1942157728@qq.com.
回复

使用道具 举报

57#
ID:111463 发表于 2023-7-10 16:24 | 只看该作者
花了不少功夫,不知相关程序设计思路?
回复

使用道具 举报

58#
ID:1063423 发表于 2023-7-27 00:26 来自手机 | 只看该作者
佩服楼主技术,能否发一份资料。正在学习单片机万分感谢123866032@qq.com
回复

使用道具 举报

59#
ID:313468 发表于 2023-8-1 10:34 | 只看该作者
楼主可以发一份文件给我嘛,学习学习 3317386064@qq.com
回复

使用道具 举报

60#
ID:91689 发表于 2023-9-5 01:25 | 只看该作者
楼主帮忙发一份给我学习学习,万分感谢328572368@qq.com
回复

使用道具 举报

61#
ID:846237 发表于 2023-9-8 11:01 来自手机 | 只看该作者
太复杂了!不适合我这种初级DIY  玩玩蓝牙+3116就够了
回复

使用道具 举报

62#
ID:1034178 发表于 2023-9-8 13:10 来自手机 | 只看该作者
sunping360 发表于 2022-10-18 07:04

你好,楼主好久都不来51黑了,你能把文件发一份给我?123866032@qq.com 谢谢
回复

使用道具 举报

63#
ID:1069806 发表于 2023-9-13 14:21 | 只看该作者
烦请楼主也发一份给我学习学习。123754086@qq.com。谢谢!
回复

使用道具 举报

64#
ID:813932 发表于 2023-9-18 07:16 | 只看该作者
这个功放方案很好用,学习下。
回复

使用道具 举报

65#
ID:933601 发表于 2023-10-3 08:13 | 只看该作者
烦请楼主也发一份给我学习学习,l.htlht@163.com 谢谢
回复

使用道具 举报

66#
ID:311400 发表于 2023-10-12 16:23 | 只看该作者
烦请楼主也发一份给我学习学习。459299729@qq.com。谢谢!
回复

使用道具 举报

67#
ID:1094544 发表于 2023-10-17 16:27 | 只看该作者
feeling1791 发表于 2022-11-11 16:03
邮件已发,请及时收取,163有期限

可以也给我发一份吗?谢谢!
38793307@qq.com
回复

使用道具 举报

68#
ID:997432 发表于 2023-11-9 22:54 | 只看该作者

请楼主发一份给我,整一套来听听。254370820@qq.com.
回复

使用道具 举报

69#
ID:635039 发表于 2024-1-16 23:16 | 只看该作者
楼主帮忙发一份给我学习学习,万分感谢
回复

使用道具 举报

70#
ID:1101380 发表于 2024-2-22 00:59 来自手机 | 只看该作者
楼主能否共享下si4730驱动程序,谢谢
回复

使用道具 举报

71#
ID:651494 发表于 2024-2-22 10:54 | 只看该作者
南山车主 发表于 2024-2-22 00:59
楼主能否共享下si4730驱动程序

//Copright (c) 2021,FFT_Combo
//All rights reserved.

//名称: radio.h
//说明: si4730 gpio定义,函数声明
//作者: 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                        //电台识别率高,但是搜台少
//中灵敏度 FM_SNR 3   FM_RSSI 15                        //电台识别率中,但是搜台一般
//高灵敏度 FM_SNR 2   FM_RSSI 8                         //电台识别率地,但是搜台多

#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                                         //去加重设置 50us
#define FM_BLEND_STEREO                0x001e                                        //FM_BLEND_STEREO_THRESHOLD 20 dBuV RSSI高于设定阈值时开启立体声模式
#define FM_BLEND_MONO                        0x001e                                        //FM_BLEND_MONO_THRESHOLD 20 dBuV        RSSI低于于设定阈值时开启混音模式
//#define FM_BLEND_STEREO                0x0000                                        //FM_BLEND_STEREO_THRESHOLD 强制开启立体声模式
//#define FM_BLEND_MONO                        0x0000                                        //FM_BLEND_MONO_THRESHOLD 强制开启混音模式
#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步进100K
#define FM_ManualScan_Step_VALUE        0x000a                                        //手动搜台步进10
//------------------------------------------------------------------------
#define AM_Deemphasis                 0x0001                                         //去加重设置 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 导航和定位信号        1800KHz-2000KHz 160米业务无线电        2000KHz-2300KHz 海事通讯
#define SW_AutoScan_Step_VALUE        0x0005                                        //亚洲SW步进5K
#define SW_ManualScan_Step_VALUE        0x0005                                        //手动搜台步进10
*/

#define MW_BAND_TOP_VALUE                                 0x06b9                                  //1721KHz
#define MW_BAND_BOTTOM_VALUE                 0x020a                                         //522KHz
#define MW_AutoScan_Step_VALUE        0x0009                                        //亚洲MW步进9K
#define MW_ManualScan_Step_VALUE        0x0009                                        //手动搜台步进9
//------------------------------------------------------------------------
#define DefaultVOL 55                                //开机默认音量
#define MidVOL 50                                                //中等音量
#define MaxVOL 63                                                //最大音量
#define FMDefaultFREQ 10080        //开机默认频率
#define MWDefaultFREQ 792                //开机默认频率
//#define SWDefaultFREQ 6110        //开机默认频率
//==================================================================
// 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.

//名称: radio.c
//说明: si4730驱动
//作者: 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        
}


/**************************************
// 设备上电,IC软开机
***************************************/
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;   //使用时钟晶振,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;

}


//-----------------------------------------------------------------------------------------------
// 设置属性值(属性格式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);
}


//-----------------------------------------------------------------------------------------------
// 设备参数初始化(设置属性)
//-----------------------------------------------------------------------------------------------
void Si47XX_SetDSPPropertys(unsigned char IN_RxSensitivity)
{        
                   //设定中断   STCIEN
                   si47xx_set_property(GPO_IEN,0x00c9);        
                   delay_ms(10);        

                   //设定参考时钟 32768K
                   si47xx_set_property(REFCLK_FREQ,0x8000);        
                   delay_ms(10);        

                   //设定参考时钟分频 1分频
                   si47xx_set_property(REFCLK_PRESCALE,0x0001);                        
                   delay_ms(10);

                   //设定音量0~63
                   si47xx_set_property(RX_VOLUME,63);
                   delay_ms(10);        

                   //设定左右声道静音
                   si47xx_set_property(RX_HARD_MUTE,0x0000);               
                   delay_ms(10);        

//FM调频属性设置

     //设定去加重50us 0x0001
     si47xx_set_property(FM_DEEMPHASIS,FM_Deemphasis);        
     delay_ms(10);        

     //设定FM_BLEND_STEREO_THRESHOLD 30 dBuV RSSI高于设定阈值时开启立体声模式
     si47xx_set_property(FM_BLEND_STEREO_THRESHOLD,FM_BLEND_STEREO);        
     //设定FM_BLEND_STEREO_THRESHOLD 强制立体声 设置为0
     //si47xx_set_property(FM_BLEND_STEREO_THRESHOLD,0x0000);
     delay_ms(10);

     //设定FM_BLEND_MONO_THRESHOLD 30 dBuV        RSSI低于于设定阈值时开启混音模式
     si47xx_set_property(FM_BLEND_MONO_THRESHOLD,FM_BLEND_MONO);

     //设定FM_BLEND_MONO_THRESHOLD  强制立体声 设置为0
     //si47xx_set_property(FM_BLEND_MONO_THRESHOLD,0x0000);
     delay_ms(10);        

     //设定FM_MAX_TUNE_ERROR        40 kHz
     si47xx_set_property(FM_MAX_TUNE_ERROR,0x0028);        
     delay_ms(10);        

     //设定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);

     //设定FM_RSQ_SNR_HI_THRESHOLD        30dB
     si47xx_set_property(FM_RSQ_SNR_HI_THRESHOLD,0x001e);        
     delay_ms(10);

     //设定FM_RSQ_SNR_LO_THRESHOLD        6dB
     si47xx_set_property(FM_RSQ_SNR_LO_THRESHOLD,0x0006);        
     delay_ms(10);

     //设定FM_RSQ_RSSI_HI_THRESHOLD        50dBuV
     si47xx_set_property(FM_RSQ_RSSI_HI_THRESHOLD,0x0032);        
     delay_ms(10);

     //设定FM_RSQ_RSSI_LO_THRESHOLD        24dBuV
     si47xx_set_property(FM_RSQ_RSSI_LO_THRESHOLD,0x0018);        
     delay_ms(10);        

     //设定FM_RSQ_BLEND_THRESHOLD        50%
     si47xx_set_property(FM_RSQ_BLEND_THRESHOLD,0x0032);        
     delay_ms(10);        

     //设定FM_SOFT_MUTE_MAX_ATTENUATION        10dB
     si47xx_set_property(FM_SOFT_MUTE_MAX_ATTENUATION,0x000a);        
     delay_ms(10);        

     //设定FM_SOFT_MUTE_SNR_THRESHOLD        6dB
     si47xx_set_property(FM_SOFT_MUTE_SNR_THRESHOLD,0x0006);        
     delay_ms(10);        

     //设定FM_SEEK_BAND_BOTTOM        8750(87.5M) 0x21fc        
     si47xx_set_property(FM_SEEK_BAND_BOTTOM,FM_BAND_BOTTOM_VALUE);
     delay_ms(10);        
        
     //设定FM_SEEK_BAND_TOP        10790 (107.9) 0x2a26
     si47xx_set_property(FM_SEEK_BAND_TOP,FM_BAND_TOP_VALUE);
     delay_ms(10);        

     //设定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)
                   {
         //设定FM_SEEK_TUNE_SNR_THRESHOLD 2dBuV 0x0002
               si47xx_set_property(FM_SEEK_TUNE_SNR_THRESHOLD,FM_SNR_LOCAL);        
               delay_ms(10);

               //设定FM_SEEK_TUNE_RSSI_THRESHOLD 8dBuV 0x0008
               si47xx_set_property(FM_SEEK_TUNE_RSSI_THRESHOLD,FM_RSSI_LOCAL);        
               delay_ms(10);        
     }
                   else
                   {
               //设定FM_SEEK_TUNE_SNR_THRESHOLD 2dBuV 0x0002
               si47xx_set_property(FM_SEEK_TUNE_SNR_THRESHOLD,FM_SNR_REMOTE);        
               delay_ms(10);

               //设定FM_SEEK_TUNE_RSSI_THRESHOLD 8dBuV 0x0008
               si47xx_set_property(FM_SEEK_TUNE_RSSI_THRESHOLD,FM_RSSI_REMOTE);        
               delay_ms(10);        
     }

//AM调频属性设置
     //设定AM_CHANNEL_FILTER (4kHz 0x0001)(6kHz 0x0000)(3kHz 0x0002)(2kHz 0x0003)
     si47xx_set_property(AM_CHANNEL_FILTER,0x0001);
     delay_ms(10);        

     //设定AM_DEEMPHASIS 50us 0x0001
     si47xx_set_property(AM_DEEMPHASIS,AM_Deemphasis);
     delay_ms(10);

     //设定AM_RSQ_INTERRUPTS All interrupts are disabled by default 0x0000
     si47xx_set_property(AM_RSQ_INTERRUPTS,0x0000);
     delay_ms(10);

     //设定AM_RSQ_SNR_LO_THRESHOLD    10 dB 0x000a
     si47xx_set_property(AM_RSQ_SNR_LO_THRESHOLD,0x000a);
     delay_ms(10);

     //设定AM_RSQ_SNR_HI_THRESHOLD   10 dB 0x000a
     si47xx_set_property(AM_RSQ_SNR_HI_THRESHOLD,0x000a);
     delay_ms(10);

     //设定AM_RSQ_RSSI_HI_THRESHOLD   30 dB 0x001e
     si47xx_set_property(AM_RSQ_RSSI_HI_THRESHOLD,0x001e);
     delay_ms(10);

     //设定AM_RSQ_RSSI_LO_THRESHOLD   10 dB 0x000a
     si47xx_set_property(AM_RSQ_RSSI_LO_THRESHOLD,0x000a);
     delay_ms(10);

     //设定AM_SOFT_MUTE_RATE   278dB/s 0x0040
     si47xx_set_property(AM_SOFT_MUTE_RATE,0x0040);
     delay_ms(10);

     //设定AM_SOFT_MUTE_MAX_ATTENUATION   10dB 0x000a
     si47xx_set_property(AM_SOFT_MUTE_MAX_ATTENUATION,0x000a);
     delay_ms(10);

     //设定AM_SOFT_MUTE_SNR_THRESHOLD   9dB 0x0009
     si47xx_set_property(AM_SOFT_MUTE_SNR_THRESHOLD,0x0009);
     delay_ms(10);

     //设定AM_SOFT_MUTE_SNR_THRESHOLD   9dB 0x0009
     si47xx_set_property(AM_SOFT_MUTE_SNR_THRESHOLD,0x0009);
     delay_ms(10);

     //设定AM_SEEK_BAND_BOTTOM   0x020a 522KHz
     si47xx_set_property(AM_SEEK_BAND_BOTTOM,MW_BAND_BOTTOM_VALUE);
     delay_ms(10);


     //设定AM_SEEK_BAND_TOP   0x06ae 1710KHz
     si47xx_set_property(AM_SEEK_BAND_TOP,MW_BAND_TOP_VALUE);
     delay_ms(10);


     //设定AM_SEEK_FREQ_SPACING   0x000a 10kHz
     si47xx_set_property(AM_SEEK_FREQ_SPACING,0x0009);
     delay_ms(10);

     if(IN_RxSensitivity==0)
                   {        
               //设定AM_SEEK_SNR_THRESHOLD   0x0002 2dB
               si47xx_set_property(AM_SEEK_SNR_THRESHOLD,MW_SNR_LOCAL);
               delay_ms(10);

               //设定AM_SEEK_RSSI_THRESHOLD   0x000f 15dBuV
               si47xx_set_property(AM_SEEK_RSSI_THRESHOLD,MW_RSSI_LOCAL);
               delay_ms(10);        
     }
                   else
                   {
        
               //设定AM_SEEK_SNR_THRESHOLD   0x0002 2dB
               si47xx_set_property(AM_SEEK_SNR_THRESHOLD,MW_SNR_REMOTE);
               delay_ms(10);

               //设定AM_SEEK_RSSI_THRESHOLD   0x000f 15dBuV
               si47xx_set_property(AM_SEEK_RSSI_THRESHOLD,MW_RSSI_REMOTE);
               delay_ms(10);
     }

}        

//-----------------------------------------------------------------------------------------------
// 设备关机
//-----------------------------------------------------------------------------------------------
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;
}
//-----------------------------------------------------------------------------------------------
//设定音量值
//-----------------------------------------------------------------------------------------------
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;
}


//-----------------------------------------------------------------------------------------------
// 设备复位
//-----------------------------------------------------------------------------------------------
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 读写函数 例如 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器件写地址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,最后一个bit 的ACK必须发送
                                         
                                             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;
            }
}
//-----------------------------------------------------------------------------------------------
//自动首台-向上 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 不然搜台错误。
            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 不然搜台错误。
            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;
}

/********************************************************************************************************************************/
回复

使用道具 举报

72#
ID:870445 发表于 2024-2-29 09:34 | 只看该作者
feeling1791 发表于 2022-9-19 14:40
有,告知邮箱发送给你

请发给我一份 谢谢,  xlxhtz2468@sina.com
回复

使用道具 举报

73#
ID:1109705 发表于 2024-3-18 13:44 | 只看该作者
高手啊,学习下,都是手工焊接的吗?
回复

使用道具 举报

74#
ID:813010 发表于 2024-3-19 09:01 | 只看该作者

烦请楼主也发一份给我学习学习。1927511197@QQ.COM。谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表