303 lines
7.0 KiB
C
303 lines
7.0 KiB
C
#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
|
||
|