📄 tda7540.c
字号:
#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 + -