⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tda7540.c

📁 美上美fea397 FM/AM车载收音模块(tda7540芯片)控制源码
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "def.h"
#include "hardconfigure.h"
#include <macros.h>
#include "project_environment.h"     

#define TDA7540_addr0   0x50
#define TDA7540_addr1   0x62
#define FM_MIN 0x078c
#define FM_MAX 0x0926
//#define FM_MIN 875
//#define FM_MAX 1080 
#define AM_MIN 0x2bb6
#define AM_MAX 0x3000
#define SENSITVE 1  //灵敏度调整1-10
/*
const U8 Init_TDATDA7540_AM_a[32]={0x16,0x00,0x00,0x00,0x00,0xa2,0x81,0x00,0x00,0x86,
								0xa0,0x65,0xcb,0xbf,0xf5,0x0c,0xf1,0xc0,0xcc,0x55,
								0x51,0x52,0x0a,0x00,0xf7,0x48,0x27,0x53,0xe4,0x6d,
								0x65,0xe1};
const U8 Init_TDATDA7540_AM_b[8]={0x30,0x00,0x00,0x00,0x00,0x00,0xfe,0xde};
*/								
const U8 Init_TDATDA7540_AM[40]={//0x40~0x67
                                0x16,0x00,0x00,0x00,0x00,0xa2,0x81,0x00,0x00,0x86,
								0xa0,0x65,0xcb,0xbf,0xf5,0x0c,0xf1,0xc0,0xcc,0x55,
								0x51,0x52,0x0a,0x00,0xf7,0x48,0x27,0x53,0xe4,0x6d,
								0x65,0xe1,
								0x30,0x00,0x00,0x00,0x00,0x00,0xfe,0xde
								};
/*
const U8 Init_TDATDA7540_FM_a[32]={//0x40,//dx
								0x56,0x3a,0x08,0x00,0x54,0x91,0xaf,0x00,0x00,0x86,//
								0xa0,0x65,0x4b,0xbf,0x25,0x0c,0xf1,0xc0,0x4c,0x50,
								0x51,0x52,0x0a,0x50,0xf7,0x4c,0x27,0x53,0x54,0x6d,
								0x55,0xe1};
const U8 Init_TDATDA7540_FM_b[8]={//0x60,
								0x94,0x00,0x00,0x00,0x00,0x00,0xfe,0xfe};
*/
const U8 Init_TDATDA7540_FM[40]={//0x40,//dx
								0x56,0x3a,0x08,0x00,0x54,0x91,0xaf,0x00,0x00,0x86,//
								0xa0,0x65,0x4b,0xbf,0x25,0x0c,0xf1,0xc0,0x4c,0x50,
								0x51,0x52,0x0a,0x50,0xf7,0x4c,0x27,0x53,0x54,0x6d,
								0x55,0xe1,
                                //0x60,
								0x94,0x00,0x00,0x00,0x00,0x00,0xfe,0xfe
								};

unsigned char TV2_H,TV2_M,TV2_L;

U16 Select_Fm(U16 Fre);

#define  SetFM_DX()  Write_TDATDA7540(0x47,0x00)

#define  SetFM_LX()  Write_TDATDA7540(0x47,0x80)


/*
void SetFM_DX(void)
{char buff = 0x00;
  //Write_TDATDA7540(0x47,0x00)
  WriteI2C_SubAddrU8(&buff,1,0x47,TDA7540_addr1);
}
void SetFM_LX(void)
{char buff = 0x80;
  //Write_TDATDA7540(0x47,0x80)
  WriteI2C_SubAddrU8(&buff,1,0x47,TDA7540_addr1);
}
*/
/*************************************************************************************/
/*函数原型:void Write_TDATDA7540(U8 TDA_addr,U8 TDA_data)                              */
/*功    能:配置TDA寄存器的值                                                        */
/*参    数:TDA_addr:寄存器地址,TDA_data:配置数据                                   */
/*返    回:无                                                                       */
/*************************************************************************************/
void Write_TDATDA7540(U8 TDA_addr,U8 TDA_data)   
{
   WriteI2C_SubAddrU8(&TDA_data,1,TDA_addr,TDA7540_addr1);
} 
/*************************************************************************************************/
/*函数原形:U8 Read_TDATDA7540(void)                                                                */
/*功	能:读TUNER状态                                                                          */
/*参    数:                                                                    */
/*************************************************************************************************/
/*U8 Read_TDATDA7540(void)   
{   
	U8 temp;
	TDA7540Start();   
    TDA7540Write_I2c(RDTDATDA7540);   
    TDA7540TestAck();   
    temp=TDA7540Read_I2c();   
    TDA7540Ack();   
    TDA7540Stop();
	return(temp);   
}*/
/*************************************************************************************************/
/*函数原形:void Inital_TDATDA7540(void)                                                            */
/*功	能:配置FM寄存器                                                                         */
/*参    数:                                                                    */
/*************************************************************************************************/

void Inital_TDATDA7540(enum audio_source mode)
{
	U8 MUTE1,LEVEL,IF1,TANK,IQ,SCTRL,STD4,STD5,STD7;
	U8 temp1,temp2;
	U8 i;
	char buff[40];
	//const U8  *pInit_dataTDA7540a;
	//const U8  *pInit_dataTDA7540b;
	if (mode == AM) {
	    for (i=0;i<40;i++) {
		    buff[i]=Init_TDATDA7540_AM[i];
		}
	}
	else {
	    for (i=0;i<40;i++) buff[i]=Init_TDATDA7540_FM[i];
	}
	WriteI2C_SubAddrU8(buff,32,0x40,TDA7540_addr1);
	WriteI2C_SubAddrU8(buff+32,8 ,0x60,TDA7540_addr1);
	
	ReadI2C_SubAddrU8(&TV2_L,1,0x4a,TDA7540_addr0);
	ReadI2C_SubAddrU8(&TV2_M,1,0x56,TDA7540_addr0);
	ReadI2C_SubAddrU8(&TV2_H,1,0x57,TDA7540_addr0);
	ReadI2C_SubAddrU8(&MUTE1,1,0x4b,TDA7540_addr0);
	ReadI2C_SubAddrU8(&LEVEL,1,0x4c,TDA7540_addr0);
	ReadI2C_SubAddrU8(&IF1,  1,0x50,TDA7540_addr0);
	ReadI2C_SubAddrU8(&TANK, 1,0x51,TDA7540_addr0);
	ReadI2C_SubAddrU8(&IQ,   1,0x52,TDA7540_addr0);
	ReadI2C_SubAddrU8(&SCTRL,1,0x58,TDA7540_addr0);
	ReadI2C_SubAddrU8(&STD4, 1,0x53,TDA7540_addr0);
	ReadI2C_SubAddrU8(&STD5, 1,0x54,TDA7540_addr0);
	ReadI2C_SubAddrU8(&STD7, 1,0x55,TDA7540_addr0);
	/*
	if (mode == AM) {
	    temp1 = MUTE1 | 0x7f;
	    temp2 = (IF1 & 0xf8) | 0x01;
	}
	else  {
	   temp1 = MUTE1 | 0x80;
	   temp2 = (IF1 & 0xf8) | 0x05;
	}*/
	if (mode == AM) {
	    temp1 = 0x7f;
	    temp2 = 0x01;
	}
	else  {
	   temp1 = 0x80;
	   temp2 = 0x05;
	}
	temp1 |= MUTE1;
	temp2 |= (IF1 & 0xf8);
	
	Write_TDATDA7540(12,temp1);
	//WriteI2C_SubAddrU8(&temp1,1,12,TDA7540_addr1);
	Write_TDATDA7540(18,(LEVEL & 0x1f) | 0xc0);
	//LEVEL = (LEVEL & 0x1f) | 0xc0;
	//WriteI2C_SubAddrU8(&LEVEL,1,18,TDA7540_addr1);
	Write_TDATDA7540(19,temp2);
	//WriteI2C_SubAddrU8(&temp2,1,19,TDA7540_addr1);
	Write_TDATDA7540(20,TANK);
	//WriteI2C_SubAddrU8(&TANK,1,20,TDA7540_addr1);
	Write_TDATDA7540(21,IQ);
	//WriteI2C_SubAddrU8(&IQ,1,21,TDA7540_addr1);
	Write_TDATDA7540(23,SCTRL&0xf0);
	//SCTRL &= 0XF0;
    //WriteI2C_SubAddrU8(&SCTRL,1,23,TDA7540_addr1);
	Write_TDATDA7540(27,(STD4&0x78)|0x03);
	//STD4 = (STD4 & 0X78) | 0X03;
	//WriteI2C_SubAddrU8(&STD4,1,27,TDA7540_addr1);
	Write_TDATDA7540(28,(STD5&0x07)|0xe0);
	//STD5 = (STD5 & 0X07) | 0XE0;
	//WriteI2C_SubAddrU8(&STD5,1,28,TDA7540_addr1);
	Write_TDATDA7540(30,(STD7&0x0f)|0x60);
	//STD7 = (STD7 & 0X0F) | 0X60;
	//WriteI2C_SubAddrU8(&STD7,1,30,TDA7540_addr1);
}

/*
void Inital_TDATDA7540(enum audio_source mode)
{
	U8 MUTE1,LEVEL,IF1,TANK,IQ,SCTRL,STD4,STD5,STD7;
	U8 temp1,temp2;
	U8 i;
	char buff[40];
	//const U8  *pInit_dataTDA7540a;
	//const U8  *pInit_dataTDA7540b;
	if (mode == AM) {
	    for (i=0;i<32;i++) {
		    buff[i]=Init_TDATDA7540_AM_a[i];
		}
	}
	else {
	    for (i=0;i<40;i++) buff[i]=Init_TDATDA7540_FM[i];
	}
	WriteI2C_SubAddrU8(buff,40,0x40,TDA7540_addr1);
	//WriteI2C_SubAddrU8(buff+32,8 ,0x60,TDA7540_addr1);
	
	ReadI2C_SubAddrU8(&TV2_L,1,0x4a,TDA7540_addr0);
	ReadI2C_SubAddrU8(&TV2_M,1,0x56,TDA7540_addr0);
	ReadI2C_SubAddrU8(&TV2_H,1,0x57,TDA7540_addr0);
	ReadI2C_SubAddrU8(&MUTE1,1,0x4b,TDA7540_addr0);
	ReadI2C_SubAddrU8(&LEVEL,1,0x4c,TDA7540_addr0);
	ReadI2C_SubAddrU8(&IF1,  1,0x50,TDA7540_addr0);
	ReadI2C_SubAddrU8(&TANK, 1,0x51,TDA7540_addr0);
	ReadI2C_SubAddrU8(&IQ,   1,0x52,TDA7540_addr0);
	ReadI2C_SubAddrU8(&SCTRL,1,0x58,TDA7540_addr0);
	ReadI2C_SubAddrU8(&STD4, 1,0x53,TDA7540_addr0);
	ReadI2C_SubAddrU8(&STD5, 1,0x54,TDA7540_addr0);
	ReadI2C_SubAddrU8(&STD7, 1,0x55,TDA7540_addr0);
	
	if (mode == AM) {
	    temp1 = MUTE1 | 0x7f;
	    temp2 = (IF1&0xf8)|0x01;
	}
	else  {
	   temp1 = MUTE1 | 0x80;
	   temp2 = (IF1&0xf8)|0x05;
	}
	Write_TDATDA7540(12,temp1);
	Write_TDATDA7540(18,(LEVEL&0x1f)|0xc0);
	Write_TDATDA7540(19,temp2);
	Write_TDATDA7540(20,TANK);
	Write_TDATDA7540(21,IQ);
	Write_TDATDA7540(23,SCTRL&0xf0);
	Write_TDATDA7540(27,(STD4&0x78)|0x03);
	Write_TDATDA7540(28,(STD5&0x07)|0xe0);
	Write_TDATDA7540(30,(STD7&0x0f)|0x60);
}
*/
/*************************************************************************************************/
/*函数原形:void Select_Fm(U16 Fre)                                                              */
/*功	能:选择FM频道                                                                           */
/*参    数:Fre:875-1080                                                                         */
/*************************************************************************************************/
U16 Select_Fm(U16 Fre)
{   unsigned char buff[4];
	U16 temp;
	U8 TV2;
	if (Fre < 875 || Fre >1080) Fre = 875;
	temp=((Fre-875)<<1)+FM_MIN;
	if(Fre<=981)TV2=TV2_L+(Fre-875)*(TV2_M-TV2_L)/(981-875);
	else TV2=TV2_M+(Fre-981)*(TV2_H-TV2_M)/(1080-981);
	Write_TDATDA7540(1,(U8)(temp&0x00ff));
	Write_TDATDA7540(2,(U8)((temp>>8)&0x00ff));
	Write_TDATDA7540(4,TV2);
	//buff[0]=0xe3;buff[1]=0x04;buff[2]=(unsigned char)(Fre);buff[3]=(unsigned char )(Fre>>8);
	//add_FIFO_ReturnProcessor(buff,1,2);
    return Fre;
}
/*************************************************************************************************/
/*函数原形:void Select_Am(U16 Fre)                                                              */
/*功	能:选择AM频道                                                                       */
/*参    数:                                                                    */
/*************************************************************************************************/
U16 Select_Am(U16 Fre)
{   unsigned char buff[4];
	U16 temp;
	if (Fre < 522 || Fre >1620) Fre = 522;
	temp=Fre+(AM_MIN-522);
	Write_TDATDA7540(1,(U8)(temp&0x00ff));
	Write_TDATDA7540(2,(U8)((temp>>8)&0x00ff));
	//buff[0]=0xe3;buff[1]=0x04;buff[2]=(unsigned char)(Fre);buff[3]=(unsigned char )(Fre>>8);
	//add_FIFO_ReturnProcessor(buff,1,2);
	return Fre;

}
/*************************************************************************************************/
/*函数原形:void Open_IFCounter(void)                                                          */
/*功	能:                                                                       */
/*参    数:                                                                    */
/*************************************************************************************************/
void Open_IFCounter(void)
{
	Write_TDATDA7540(0,0xd6);
	Write_TDATDA7540(5,0xd9);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -