KT24-1110_65E-HA-651B/apps/common/device/fm_emitter/ac3433/ac3433.c

303 lines
7.0 KiB
C
Raw Normal View History

2024-11-10 10:44:17 +00:00
#include "app_config.h"
#include "system/includes.h"
#include "fm_emitter/fm_emitter_manage.h"
#include "ac3433.h"
#if(TCFG_FM_EMITTER_AC3433_ENABLE == ENABLE)
#if IIC_SD_MULT_EN
extern bool iic_sd_mult_sd_suspend(void);
extern void iic_sd_mult_sd_resume(void);
#endif
volatile u32 ac3433_iic_delay_cnt = 0;
void ac3433_set_iic_delay(u32 delay_cnt)
{
ac3433_iic_delay_cnt = delay_cnt;
}
void ac3433_iic_delay(void)
{
delay(ac3433_iic_delay_cnt);
}
void ac3433_mult_detect(void)
{
#if ADKEY_IIC_MULT_EN
while (g_adkey_busy) {
clear_wdt();
delay(5);
}
#endif
#if AUX_SD_MULT_EN
while (g_ad_aux_busy) {
clear_wdt();
delay(5);
}
#endif
#if IIC_SD_MULT_EN
while (1) {
if (iic_sd_mult_sd_suspend()) {
JL_PORTB->PU |= (BIT(3) | BIT(4) | BIT(5));
break;
}
clear_wdt();
delay(5);
}
iic_data_h();
iic_data_in();
iic_clk_h();
iic_clk_in();
iic_start();
ac3433_iic_delay();
ac3433_iic_delay();
ac3433_iic_delay();
ac3433_iic_delay();
ac3433_iic_delay();
iic_stop();
#endif
}
void ac3433_mult_release()
{
#if IIC_SD_MULT_EN
iic_sd_mult_sd_resume();
#endif
}
extern void uart_tx_dac_api(void);
extern void uart_tx_dac(void);
void ac3433_uart_isr_callback(u8 uto_buf, void *p, u8 isr_flag)
{
printf("ac3433_uart_isr_callback\n");
if (isr_flag == UART_ISR_TYPE_WRITE_OVER) {
JL_UART0->CON0 &= ~BIT(2); //disable tx isr
uart_tx_dac();
}
}
s32 ac3433_uart_init(u32 baud)
{
puts("--------ac3433_uart_init\n");
JL_IOMAP->CON3 &= ~BIT(3);
JL_IOMAP->CON1 &= ~(BIT(8) | BIT(9) | BIT(10) | BIT(11)); //output channel0 ->UT0_TX
//任意IO口输出,所选则的IO口需要设置为输出, 且开上下拉.
AC3433_UART_DATA_PORT->DIR &= ~AC3433_UART_DATA_BIT;
AC3433_UART_DATA_PORT->DIE &= ~AC3433_UART_DATA_BIT;
AC3433_UART_DATA_PORT->OUT &= ~AC3433_UART_DATA_BIT;
AC3433_UART_DATA_PORT->PD |= AC3433_UART_DATA_BIT;
AC3433_UART_DATA_PORT->PU |= AC3433_UART_DATA_BIT;
set_uart_isr_callback(0, ac3433_uart_isr_callback);
JL_UART0->BAUD = (UART_CLK / baud) / 3 - 1;
JL_UART0->CON0 = BIT(13) | BIT(12) | BIT(10) | BIT(6) | BIT(4) | BIT(0);
return 0;
}
void ac3433_tx_dac_data(void)
{
uart_tx_dac_api();
}
void ac3433_iic_init(void)
{
iic_init();
ac3433_set_iic_delay(5000);
}
void ac3433_write_data(u8 chip_id, u8 iic_addr, u8 iic_dat)
{
g_iic_busy = 1;
ac3433_mult_detect();
iic_start(); //I2C启动
iic_sendbyte(chip_id); //写命令
if (0xff != iic_addr) {
iic_sendbyte(iic_addr); //写地址
}
iic_sendbyte(iic_dat); //写数据
iic_stop(); //I2C停止时序
if (iic_dat == FT33_ADDR_READ) {
iic_start();
iic_sendbyte(FT33_ADDR_READ);
iic_revbyte(0);
iic_revbyte(1);
iic_stop();
}
ac3433_mult_release();
g_iic_busy = 0;
}
void ac3433_write(u8 chip_id, u8 iic_addr, u8 *iic_dat, u8 n)
{
g_iic_busy = 1;
ac3433_mult_detect();
iic_start(); //I2C启动
iic_sendbyte(chip_id); //写命令
if (0xff != iic_addr) {
iic_sendbyte(iic_addr); //写地址
}
for (; n > 0; n--) {
iic_sendbyte(*iic_dat++); //写数据
}
iic_stop(); //I2C停止时序
ac3433_mult_release();
g_iic_busy = 0;
}
void ac3433_read(u8 chip_id, u8 iic_addr, u8 *iic_dat)
{
g_iic_busy = 1;
ac3433_mult_detect();
iic_start(); //I2C启动
iic_sendbyte(chip_id); //写命令
if (0xff != iic_addr) {
iic_sendbyte(iic_addr); //写地址
}
*iic_dat = iic_revbyte(1);
if (*iic_dat == FT33_ADDR_READ) {
iic_start();
iic_sendbyte(FT33_ADDR_READ);
iic_revbyte(0);
iic_revbyte(1);
iic_stop();
}
iic_stop();
ac3433_mult_release();
g_iic_busy = 0;
}
void ac3433_readn(u8 chip_id, u8 iic_addr, u8 *iic_dat, u8 n)
{
g_iic_busy = 1;
ac3433_mult_detect();
iic_start(); //I2C启动
iic_sendbyte(chip_id); //写命令
if (0xff != iic_addr) {
iic_sendbyte(iic_addr); //写地址
}
for (; n > 1; n--) {
*iic_dat++ = iic_revbyte(0); //读数据
}
*iic_dat++ = iic_revbyte(1);
iic_stop(); //I2C停止时序
ac3433_mult_release();
g_iic_busy = 0;
}
void ac3433_write_and(u8 chip_id, u8 iic_addr, u8 n)
{
u8 read_data;
ac3433_read(FT33_ADDR_READ, iic_addr, &read_data);
read_data = read_data & n;
ac3433_write_data(chip_id, iic_addr, read_data);
}
void ac3433_write_or(u8 chip_id, u8 iic_addr, u8 n)
{
u8 read_data;
ac3433_read(FT33_ADDR_READ, iic_addr, &read_data);
read_data = read_data | n;
ac3433_write_data(chip_id, iic_addr, read_data);
}
void ac3433_interface_register(void)
{
ft33_init_interface_register(ac3433_iic_init);
ft33_write_data_interface_register(ac3433_write_data);
ft33_write_datan_interface_register(ac3433_write);
ft33_write_and_interface_register(ac3433_write_and);
ft33_write_or_interface_register(ac3433_write_or);
ft33_read_data_interface_register(ac3433_read);
ft33_read_datan_interface_register(ac3433_readn);
ft33_set_iic_delay_interface_register(ac3433_set_iic_delay);
}
/*----------------------------------------------------------------------------*/
/**@brief AC3433 初始化函数
@param fre
@return
@note void ac3433_init(u16 fre)
*/
/*----------------------------------------------------------------------------*/
void ac3433_init(u16 fre)
{
#if (FMTX_CHIP_OSC_SELECT == OSC_24M)
ft33_set_clk(24000000L);
#else
ft33_set_clk(12000000L);
#endif
ac3433_interface_register();
ft33_set_data_mode(0);
ft33_set_channel(2); //1:MONO 2:STEREO
ft33_set_prem_cof(3);
if (ft33_init(fre) == false) {
printf("warning !!! ac3433 init err\n");
}
ft33_set_icp(1);
ft33_set_cpib(7);
ac3433_uart_init(AC3433_UART_RATE);
timer3_init(ac3433_tx_dac_data);
}
/*
void ac3433_set_freq(u16 fre)
fre
90MHZ应该传入900
*/
/*----------------------------------------------------------------------------*/
/**@brief AC3433 频点设置函数
@param fre
@return
@note void ac3433_set_freq(u16 fre)
*/
/*----------------------------------------------------------------------------*/
void irq_enable(u32 idx);
void irq_disable(u32 idx);
void ac3433_set_freq(u16 fre)
{
irq_disable(63);
ft33_set_freq(fre);
irq_enable(63);
}
void ac3433_set_power(u8 power, u16 freq)
{
if (power > AC3433_TX_POWER_MAX || power < AC3433_TX_POWER_MIN) {
power = AC3433_TX_POWER_MAX;
}
ft33_set_power(power);
}
REGISTER_FM_EMITTER(ac3433) = {
.name = "ac3433",
.init = ac3433_init,
.start = NULL,
.stop = NULL,
.set_fre = ac3433_set_freq,
.set_power = ac3433_set_power,
};
#endif //AC3433