KT24-1110_65E-HA-651B/apps/common/device/fm_emitter/qn8027/qn8027.c
2024-11-10 18:44:17 +08:00

175 lines
4.6 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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, &reg_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