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

📄 tea5767.c

📁 tea5767_102模块,i2c总线控制方式
💻 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 + -