📄 tea5767.c
字号:
#include <reg52.h>
#include "TEA5767.h"
#include "global.h"
#define TEA5767_wr 0xC0//10100000
#define TEA5767_rd 0xC1//10100001
#define i2c_5767_SCL_0 P2 &= 0xFD
#define i2c_5767_SCL_1 P2 |= 0x02
#define i2c_5767_DA_0 P2 &= 0xFE
#define i2c_5767_DA_1 P2 |= 0x01
sbit i2c_5767_DA_receive = P2^0 ;
void Init_Tea5767(unsigned long freq)
{
//初始化IO端口
Set_Freq(freq);
}
unsigned char Write_5767(unsigned char * senddata)
{
unsigned char i;
stopInterupt();
i2c_5767_start(); //启动条件S(1)
i2c_5767_write8bit(TEA5767_wr); //TEA5767写地址
if(i2c_5767_receive_ack()) //收应答A
{
for(i=0;i<5;i++) //发数据
{
i2c_5767_write8bit(senddata[i]);
i2c_5767_receive_ack(); //收应答A
}
i2c_5767_stop(); //停止条件P
startInterupt();
return TRUE;
}
else
{
i2c_5767_stop();
// delay_us(10);
startInterupt();
return FALSE;
}
}
unsigned char Read_5767(unsigned char * receivedata)
{
unsigned char i ;
stopInterupt();
i2c_5767_start(); //启动条件S(1)
i2c_5767_write8bit(TEA5767_rd); //TEA5767写地址
if(i2c_5767_receive_ack())
{
for(i=0;i<5;i++)
{
receivedata[i]=i2c_5767_read8bit(); //读数据
i2c_5767_send_ack();
}
i2c_5767_stop(); //停止条件P
delay_us(10);
startInterupt();
return TRUE;
}
else
{
i2c_5767_stop();
startInterupt();
// EA=0;
return FALSE;
}
}
void i2c_5767_start()
{
i2c_5767_SCL_0;
delay_us(10);
i2c_5767_DA_1;
delay_us(10);
i2c_5767_SCL_1;
delay_us(10);
i2c_5767_DA_0;
delay_us(10);
i2c_5767_SCL_0;
}
void i2c_5767_stop()
{
i2c_5767_SCL_0;
delay_us(10);
i2c_5767_DA_0;
delay_us(10);
i2c_5767_SCL_1;
delay_us(10);
i2c_5767_DA_1;
}
void i2c_5767_write8bit(unsigned char dat)
{
unsigned char i;
i2c_5767_SCL_0;
for(i=0;i<8;i++)
{
if(dat&0x80)
i2c_5767_DA_1;
else
i2c_5767_DA_0;
dat<<=1;
delay_us(10);
i2c_5767_SCL_1;
delay_us(10);
i2c_5767_SCL_0;
}
}
unsigned char i2c_5767_read8bit(void)
{
unsigned char tmp,i;
tmp = 0;
for (i = 0; i < 8; i++)
{
i2c_5767_SCL_0;
i2c_5767_DA_1;
delay_us(10);
i2c_5767_SCL_1;
delay_us(10);
if ( i2c_5767_DA_receive )
tmp++;
i2c_5767_SCL_0;
if (i != 7)
tmp <<=1;
}
return tmp;
}
unsigned char i2c_5767_receive_ack()
{
unsigned char tmp =0;
i2c_5767_SCL_0;
i2c_5767_DA_1;
delay_us(10);
i2c_5767_SCL_1;
while ((i2c_5767_DA_receive)&&(tmp<255))
{
tmp++;
}
i2c_5767_SCL_0;
if (tmp == 255)
return FALSE;
else return TRUE;
}
void i2c_5767_send_ack(void)
{
i2c_5767_SCL_0;
i2c_5767_DA_0;
delay_us(10);
i2c_5767_SCL_1;
i2c_5767_DA_0;
delay_us(10);
i2c_5767_SCL_0;
delay_us(10);
}
//由PLL计算频率
unsigned long PLL_2_Freq(unsigned int pll)
{
unsigned long frequency;
unsigned char hlsi;
unsigned int npll=pll;
// npll=pll;
hlsi=0;//WriteData[2]&0x10;
if (hlsi)
frequency=(unsigned long)((float)npll*(float)8.192-225); //频率单位:KHz
else
frequency=(unsigned long)((float)npll*(float)8.192+225); //频率单位:KHz
return (frequency+50);
}
//由频率计算PLL
//Freq 0.1M
unsigned int Freq_2_PLL(unsigned long Freq) // 955,2d6e
{
unsigned char hlsi;
unsigned int pll=0;
hlsi=0;//WriteData[2]&0x10;
if (hlsi)
pll=(unsigned int)(((float)Freq+225)*4/32.768); //频率单位:k
else
pll=(unsigned int)(((float)Freq-225)*4/32.768); //频率单位:k
return pll;
}
void Search_up(unsigned long freq)
{
unsigned char Data[5];
unsigned int pll;
pll = Freq_2_PLL(freq);
Data[0] = ((pll>>8)&0x003F)|0x40 ;
Data[1] = pll&0x00FF;
Data[2] = 0xC0; //向上搜索
Data[3] = 0x90;
Data[4] = 0x00;
Write_5767(Data);
}
void Search_down(unsigned long freq)
{
unsigned char Data[5];
unsigned int pll;
pll = Freq_2_PLL(freq);
Data[0] = ((pll>>8)&0x003F)|0x40 ;
Data[1] = pll&0x00FF;
Data[2] = 0x40; //向下搜索
Data[3] = 0x90;
Data[4] = 0x00;
Write_5767(Data);
}
void Set_Freq(unsigned long freq)
{
unsigned char Data[5];
unsigned int pll;
pll = Freq_2_PLL(freq);
Data[0] = (pll>>8)&0x003F ;
Data[1] = pll&0x00FF;
Data[2] = 0x40;
Data[3] = 0x90;
Data[4] = 0x00;
Write_5767(Data);
}
void Set_Mute(unsigned long freq)
{
unsigned char Data[5];
unsigned int pll;
pll = Freq_2_PLL(freq);
Data[0] = ((pll>>8)&0x003F)|0x80 ;
Data[1] = pll&0x00FF;
Data[2] = 0x40;
Data[3] = 0x90;
Data[4] = 0x00;
Write_5767(Data);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -