175 lines
4.6 KiB
C
175 lines
4.6 KiB
C
|
|
|||
|
#include "app_config.h"
|
|||
|
#include "system/includes.h"
|
|||
|
#include "fm_emitter/fm_emitter_manage.h"
|
|||
|
#include "qn8027.h"
|
|||
|
|
|||
|
|
|||
|
#if(TCFG_FM_EMITTER_QN8027_ENABLE == ENABLE)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
/**@brief QN8027 写寄存器函数
|
|||
|
@param addr:寄存器地址 data:写入数据
|
|||
|
@return 无
|
|||
|
@note void qn8027_write(u8 iic_addr,u8 iic_data)
|
|||
|
*/
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
void qn8027_write(u8 reg_addr, u8 reg_data)
|
|||
|
{
|
|||
|
iic_write(QN8027_ADDR_WRITE, reg_addr, ®_data, 1);
|
|||
|
}
|
|||
|
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
/**@brief QN8027 读寄存器函数
|
|||
|
@param addr:要读寄存器地址
|
|||
|
@return 读取到的寄存器的值
|
|||
|
@note u8 qn8027_read(u8 iic_addr)
|
|||
|
*/
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
u8 qn8027_read(u8 reg_addr)
|
|||
|
{
|
|||
|
u8 Byte_RecivData;
|
|||
|
iic_start(); //I2C启动
|
|||
|
iic_sendbyte(QN8027_ADDR_WRITE); //写命令
|
|||
|
iic_sendbyte(reg_addr); //写地址
|
|||
|
iic_start(); //写转为读命令,需要再次启动I2C
|
|||
|
iic_sendbyte(QN8027_ADDR_READ); //读命令
|
|||
|
Byte_RecivData = iic_revbyte(1);
|
|||
|
iic_stop(); //I2C停止
|
|||
|
return Byte_RecivData;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
void qn8027_write_Bit(u8 reg, u8 start, u8 len, u8 data)
|
|||
|
{
|
|||
|
u8 temp;
|
|||
|
temp = qn8027_read(reg);
|
|||
|
SFR(temp, start, len, data);
|
|||
|
qn8027_write(reg, temp);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
/**@brief QN8027 初始化函数
|
|||
|
@param fre:初始化时设置的频点
|
|||
|
@return 无
|
|||
|
@note void qn8027_init(u16 fre)
|
|||
|
*/
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
|
|||
|
void qn8027_init(u16 fre)
|
|||
|
{
|
|||
|
u8 read_data;
|
|||
|
|
|||
|
puts("qn8027_init\n");
|
|||
|
printf("qn8027_id:%x:%x\n", qn8027_read(QN8027_CID1), qn8027_read(QN8027_CID2));
|
|||
|
|
|||
|
qn8027_write(QN8027_SYSTEM, 0x81); //reset all reg
|
|||
|
delay_n10ms(2);
|
|||
|
|
|||
|
#if (FMTX_CHIP_CLK_SOURCE == CLK_BY_EXTERN_OSC)
|
|||
|
qn8027_write(QN8027_REG_XTL, 0x3f); //外挂晶振
|
|||
|
#else
|
|||
|
qn8027_write(QN8027_REG_XTL, 0xff); //外部时钟输入
|
|||
|
#endif
|
|||
|
|
|||
|
#if (FMTX_CHIP_OSC_SELECT == OSC_24M)
|
|||
|
qn8027_write(QN8027_REG_VGA, 0x91); //24M
|
|||
|
#else
|
|||
|
qn8027_write(QN8027_REG_VGA, 0x21); //12M
|
|||
|
#endif
|
|||
|
qn8027_write(QN8027_SYSTEM, 0x41); //reset FSM
|
|||
|
qn8027_write(QN8027_SYSTEM, 0x01);
|
|||
|
delay_n10ms(2);
|
|||
|
|
|||
|
qn8027_write(0x18, 0xe4); //SNR improve xx1x x1xx
|
|||
|
qn8027_write(0x1b, 0xf0); //最大发射功率
|
|||
|
qn8027_write(QN8027_CH1, 0x7e); //设置发射频率
|
|||
|
|
|||
|
#if PA_OFF_WHEN_NO_AUDIO
|
|||
|
qn8027_write(QN8027_GPLT, 0xA9); //当没有音频信号输入时,一分钟后关闭发射
|
|||
|
#else
|
|||
|
qn8027_write(QN8027_GPLT, 0xB9); //放弃QN8027 PA关闭功能当没有音频信号输入时
|
|||
|
#endif
|
|||
|
qn8027_write(QN8027_FDEV, 64);
|
|||
|
|
|||
|
qn8027_write(QN8027_SYSTEM, 0x22); //发射
|
|||
|
|
|||
|
delay_n10ms(10);
|
|||
|
qn8027_set_freq(fre);
|
|||
|
|
|||
|
}
|
|||
|
/*
|
|||
|
void qn8027_set_freq(u16 fre)
|
|||
|
fre 是频率值
|
|||
|
例子:90MHZ应该传入900
|
|||
|
*/
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
/**@brief QN8027 频点设置函数
|
|||
|
@param fre:设置频点
|
|||
|
@return 无
|
|||
|
@note void qn8027_set_freq(u16 fre)
|
|||
|
*/
|
|||
|
/*----------------------------------------------------------------------------*/
|
|||
|
void qn8027_set_freq(u16 fre)
|
|||
|
{
|
|||
|
u8 ch_temp0;
|
|||
|
u16 ch_temp1;
|
|||
|
ch_temp1 = (fre - 760) * 2;
|
|||
|
ch_temp0 = (ch_temp1 >> 8) & 0x3;
|
|||
|
ch_temp0 = (0x20 | ch_temp0);
|
|||
|
qn8027_write(QN8027_CH1, ch_temp1 & 0xff);
|
|||
|
qn8027_write(QN8027_SYSTEM, ch_temp0);
|
|||
|
}
|
|||
|
|
|||
|
void qn8027_set_power(u8 power, u16 freq)
|
|||
|
{
|
|||
|
if (power > QN8027_TX_POWER_MAX || power < QN8027_TX_POWER_MIN) {
|
|||
|
power = QN8027_TX_POWER_MAX;
|
|||
|
}
|
|||
|
qn8027_write(QN8027_PAC, power | BIT(7));
|
|||
|
delay_n10ms(1);
|
|||
|
qn8027_write(QN8027_SYSTEM, 0x01); //enter IDLE mode
|
|||
|
delay_n10ms(1);
|
|||
|
qn8027_write(QN8027_SYSTEM, 0x22); //enter TX mode
|
|||
|
delay_n10ms(1);
|
|||
|
qn8027_set_freq(freq);
|
|||
|
}
|
|||
|
|
|||
|
void qn8027_transmit_start(void)
|
|||
|
{
|
|||
|
qn8027_write_Bit(QN8027_SYSTEM, 5, 1, 1);
|
|||
|
}
|
|||
|
|
|||
|
void qn8027_transmit_stop(void)
|
|||
|
{
|
|||
|
qn8027_write_Bit(QN8027_SYSTEM, 5, 1, 0);
|
|||
|
}
|
|||
|
|
|||
|
void qn8027_mute(u8 mute)
|
|||
|
{
|
|||
|
if (mute) {
|
|||
|
qn8027_write_Bit(QN8027_SYSTEM, 3, 1, 1);
|
|||
|
|
|||
|
} else {
|
|||
|
qn8027_write_Bit(QN8027_SYSTEM, 3, 1, 0);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
REGISTER_FM_EMITTER(qn8027) = {
|
|||
|
.name = "qn8027",
|
|||
|
.init = qn8027_init,
|
|||
|
.start = qn8027_transmit_start,
|
|||
|
.stop = qn8027_transmit_stop,
|
|||
|
.set_fre = qn8027_set_freq,
|
|||
|
.set_power = qn8027_set_power,
|
|||
|
};
|
|||
|
#endif //QN8027
|
|||
|
|