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

📄 d61538ic-sl.cpp

📁 C语言写的关于M61538双声道语音IC驱动
💻 CPP
字号:
/***************************************************/
/*     yhy program for Qisheng AV1307 2005-04-08   */
/*     只选择了SL左环绕通道,请你帮忙,谢谢!      */
/***************************************************/
#include <intrins.h>  // 内部函数
#include "Global.h"   // 全局变量函数文件 
#include "define.h"   // 自定义变量函数文件
#include  <stdio.h>
/*=================================================*/
/*=============  I2C总线程序函数      =============*/
/*=================================================*/
void I2CInit(void);     // 初始化 
void I2cWait(void);     // 等待延时
void I2cStart(void);    // 开始信号
void I2cStop(void);     // 结束信号

Word Send_IC_16bitData(Word wData);
void D61538_senddata(Word bytecnt);

void Left_Surround_Volume_Increase(void);  //左通道音量加
void Left_Surround_Volume_Decrease(void);  //左通道音量减

/*=====================================================*/
//  将采集到的数据同D6153_buf[]相&,若&后结果为D61538_buf[]
//  数值,则为所选择的通道。
// 通道选择初始化数值  L   R    C   SW   SL   SR   Test-model
// 0x78f2(SL+SR,10,60DB)  0x50A1(C+SW,01,40DB)  0x78F0(L+R,00,60DB)
/*======================================================*/
Word TrmBuf[4]   ={0xffff,0xffff,0xffff,0xffff};

// D615388音量代码数值,通过采集到的数据每七位控制各通道。  

// surround Left channel
#define SL_1DB       0x03fe  // 1dB   0000001 1111111 10    
#define SL_10DB      0x15fe  // 10dB  0001010 1111111 10


/*===========I2C transmit value  function ==========*/
//Wait for some time to get proper i2c timing
//=======================================================
void I2cWait(void)  ///delay time 8uS   
{
    _nop_();  _nop_();  _nop_();   _nop_();
    _nop_();  _nop_();  _nop_();   _nop_();
}
/*===========================================
 I2c start condition
 SDA  high -> low  while SCL=high,read data while clock L-->H
 send data a high single after send data D0~D15,while clock H-->L
 =======================================*/
void I2cStart(void)   ///开始函数
{
    D61538_DATA=1;
    D61538_CLK =1;
    I2cWait();     // delay 8uS 
    D61538_DATA=0;
    I2cWait();     // delay 8uS 
    D61538_CLK =0;
}
/*======================================
 I2c stop condition
 SDA low -> high while SCL=high
 =======================================*/
void I2cStop(void)   ///停止函数
{
    D61538_DATA=0;
    I2cWait();
    D61538_CLK =1;
    I2cWait();
    D61538_DATA=1;
}
//===========================================
/*==  传送一个WORD数据至slave中    ========*/
//=======================================================
Word  Send_IC_16bitData(Word wData)   ///传送D0....D15数据
 {	
   unsigned char i;
   Bool  ack;
   //------------------------
  //   D61538_CLK =1;
   //-------------------
    for(i=0;i<15;i++)
	  {
	  //------------------------
       D61538_CLK =1;
      //-------------------
	   if(wData&0x8000)	//若wData与0x8000作AND逻辑与后等于0x8000,即表示
	   // 位15等于"1"则条件成立,所以设定D61538_DATA="1",否则="0".
		{ 
			D61538_DATA=1;
		}
	    else
	    {
	    	D61538_DATA=0;		
		}
        wData <<= 1;    // 以便传送完16位
        I2cWait();
        
       	D61538_CLK =1;   // the rising edge of colock 
       	I2cWait();
		D61538_CLK =0;   // the following edge of colock
		I2cWait(); 						
	  }	
	 D61538_DATA=1; ///先设定SDA、SCL为1,
	 I2cWait();
	 D61538_CLK =1;
     I2cWait();
     ack = D61538_DATA;
	 D61538_CLK =0; /// 恢复SCL为"0"电平
	 I2cWait();
	// D61538_DATA=0; /// 恢复SDA为"0"电平
	 return  ack; //D61538_DATA ;  
 }
//=================================================
           
void D61538_senddata(Word bytecnt)   ///D61538 IC送数函数
{
    I2cStart();
    Send_IC_16bitData(bytecnt);
    I2cStop();
}   
//*******************************************/
/*      below for D61538                   */
/* data to be sent is stored in TrmBuf     */
/*******************************************/
 BYTE gbLVol  = DEFAULT_VOL ;
 BYTE gbRVol  = DEFAULT_VOL ;
 BYTE gbSLVol = DEFAULT_VOL ;
 BYTE gbSRVol = DEFAULT_VOL ;
 BYTE gbCVol  = DEFAULT_VOL ;
//=======================================
//================================
void D61538_init(void)  // D61538 IC的初始化
 {
   //// 左环绕通道
       TrmBuf[0]   = gbSLVol;  //(左环绕)存音量原数据
       TrmBuf[1]   = (TrmBuf[0] >> 9) & 0x007f; //保留有效数据
       gbSLVol     = TrmBuf[1];
       TrmBuf[2]   = TrmBuf[0] | 0x01fe;  // 转无效数据全为-95dB~更大
       TrmBuf[1]   = TrmBuf[1] << 9 ;   //有效数据回原位
       TrmBuf[3]   = TrmBuf[1] | TrmBuf[2];  //两数据组成预传数
       D61538_senddata(TrmBuf[3]);  ///送数
      // Send_IC_16bitData(TrmBuf[3]);
       
  }  


/*-----------------*****************************-------------*/
// 思路:以0x27=39dB为分界线,高于以"V_Step"增减,低于以1dB增减
/*--------------------***************************------------*/
////      左环绕通道的代码
/*-----------------------**********---------------------*/
void Left_Surround_Volume_Increase(void)  //左环绕音量加函数
{
    if(gbSLVol)   ///gbSLVol是变化数值,就是通过遥控器的增加或者减少键,它的数值会变化的。
    {
#ifdef QS3_VOL
   if( (gbSLVol > 0x27) && (gbSLVol != 0) )
    {
    gbSLVol -= V_Step ;
    }
	else
	{
    gbSLVol -- ;
	}
#else
    gbSLVol--;
#endif

#ifdef NEW_ONE_KEY
       if((gbMusicCinema == CINEMA_MODE) || (gbInputMode==AC3_MODE))
#else
       if(gbMusicCinema == CINEMA_MODE)
#endif	   	
       {
    /// D61538  IC的算法   
     //-------------添加代码--------------------------
       TrmBuf[0]   = gbSLVol;   //存音量原数据
       TrmBuf[1]   = (TrmBuf[0] >> 9) & 0x007f;   //保留有效数据
       gbSLVol     = TrmBuf[1];
       TrmBuf[2]   = TrmBuf[0] | 0x01fe;  // 转无效数据全为-95dB~更大
       TrmBuf[1]   = TrmBuf[1] << 9 ;     //有效数据回原位
       TrmBuf[3]   = TrmBuf[1] | TrmBuf[2];  //两数据组成预传数
       D61538_senddata(TrmBuf[3]);  ///送数
      
       
       }
    }
}

void Left_Surround_Volume_Decrease(void)  //左环绕音量减函数
{
    if(gbSLVol < 0x3b)  //0x3b=59dB
    {
#ifdef QS3_VOL
    if( (gbSLVol >= 0x27) && (gbSLVol < 0x3b) )
    {
    gbSLVol += V_Step ;
	 }
	else
	 {
    gbSLVol ++ ;
	 }
#else
    gbSLVol ++ ;
#endif
#ifdef NEW_ONE_KEY
       if((gbMusicCinema == CINEMA_MODE) || (gbInputMode==AC3_MODE))
#else
       if(gbMusicCinema == CINEMA_MODE)
#endif	   	
       {
       /// D61538  IC的算法        
     //------------------------------------------
       TrmBuf[0]   = gbSLVol;  //存音量原数据
       TrmBuf[1]   = TrmBuf[0] >> 9; //保留有效数据
       gbSLVol     = TrmBuf[1];
       TrmBuf[2]   = TrmBuf[0] | 0x017e;  // 转无效数据全为-95dB~更大
       TrmBuf[1]   = TrmBuf[1] << 9 ;   //有效数据回原位
       TrmBuf[3]   = TrmBuf[1] | TrmBuf[2];  //两数据组成预传数
       D61538_senddata(TrmBuf[3]);  ///送数
       // Send_IC_16bitData(TrmBuf[2]);
     //--------------------------------------------    
       }
    }
}

 






















































































⌨️ 快捷键说明

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