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

📄 wavdemo.c

📁 5402dasp开发板提供的aic23驱动程序全部是错的
💻 C
字号:
                                                                                                                                                                
#include  <Reg52.h>        
#include  <absacc.h>
#include  <stdio.h>
#include  <intrins.h>
#include  <dspcode.h>  
/*定义宏*/
#define   uint unsigned  int
#define   uchar unsigned  char

#define   VOL1     0x81
#define   VOL2     0x82

#define   L_LINE_VOLUME        0x00
#define   R_LINE_VOLUME        0x01
#define   L_HEADPHONE_VOLUME   0x02
#define   R_HEADPHONE_VOLUME   0x03
#define   A_AUDIO_PATH         0x04
#define   D_AUDIO_PATH         0x05
#define   POWER_CON            0x06
#define   D_AUDIO_INTERFACE    0x07
#define   SAMPLE_RATE          0x08
#define   D_INTERFACE_ACT      0x09
#define   RESET                0x0f


/*定义寄存器端口地址*/
#define   HPICL          XBYTE[0xe000]
#define   HPICH          XBYTE[0xe100]
#define   WR_HPIL0_D     XBYTE[0xe200]
#define   WR_HPIH0_D     XBYTE[0xe300]
#define   WR_HPIL_A      XBYTE[0xe400]
#define   WR_HPIH_A      XBYTE[0xe500]
#define   WR_HPIL1_D     XBYTE[0xe600]
#define   WR_HPIH1_D     XBYTE[0xe700]

#define   RD_HPIL0_D     XBYTE[0xeA00]
#define   RD_HPIH0_D     XBYTE[0xeB00]
#define   RD_HPIL1_D     XBYTE[0xeE00]
#define   RD_HPIH1_D     XBYTE[0xeF00]

#define   WR_CR          XBYTE[0x7100]
#define   WR_PARA        XBYTE[0x7000]

sbit  NRST       =P1^2;
sbit  RST8019    =P1^3;
sbit  RST013     =P1^6;

sbit  CS         =P1^1;
sbit  SDIN       =P3^5;
sbit  SCLK       =P3^4;

sbit  SDA       =P1^4;
sbit  SCK       =P1^5;

  
uchar hpic;
bit ok,readT,key_down;
unsigned char time,stoptime,ms,DSPorder;
unsigned char volume;

void wr_dspcode();
void  delay(uint  wu);
void  LOADDSP();
void init_51();
void wr_hpi(uint addr,uint dat);
unsigned int rd_hpi(uint addr);
void rst8019();
void init_AIC23();
void write_AIC23(uchar addr,uint dat);
void Nrst();
void inter_init();
extern void LCD_DIS_STRING(unsigned char addr,unsigned char num,unsigned char *pdat); 
extern void LCD_INIT(void);

void delay1(unsigned char k);
unsigned char getDSP();
code unsigned char st1[]={"F"};
void send_char(uchar val);
uchar rev_buf[2];
uchar strlen=0;

unsigned int rd_hpi(uint addr)
{
      unsigned char i,i1;
	
      WR_HPIL_A=addr/256;
      WR_HPIH_A=addr%256;
      i1=RD_HPIL0_D;
      i=RD_HPIH0_D;
      return(i1*256+i);
}

void wr_hpi(uint addr,uint dat)
{
     WR_HPIL_A=addr/256;
     WR_HPIH_A=addr%256;
     WR_HPIL1_D=dat/256;       
     WR_HPIH1_D=dat%256;        
}

void main()
{   
     uchar i,j,key;
     uint k1;
	inter_init();
	 init_51();
	
//	LCD_INIT();
    init_AIC23();   

     delay(10000);
     rst8019();
     Nrst();

     LOADDSP();
    send_char('G'); 

     delay(30000);

	delay(30000);
	
     volume=108;
     write_AIC23(L_HEADPHONE_VOLUME,0x0180+volume);	
 //    LCD_DIS_STRING(0x80,5,st1);
     while(1)
	{
	if (strlen>=4)
		{	
			switch (rev_buf[0])
			{case 'r': 	for(i=0;i<2;i++)
						{
						k1=rd_hpi(0x1000+i);						
						send_char(k1%256);
						send_char(k1/256);
					//	k1=rd_hpi(0x11f0+i);						
					//	send_char(k1%256);
					//	send_char(k1/256);
						}
					
						break;			
			default:break;
			}
		strlen=0;
		}
	}

}

void send_char(uchar val)
{
	SBUF=val;
	while(!TI);
 	TI=0;

}

void  delay(uint  wu)
{
  for(wu;wu>0;wu--);
}
void delay1(unsigned char k)
{
    for(;k>0;k--);
}

void Nrst()
{
      NRST=0;
      delay(100);
      NRST=1;
      delay(100);
}
   
void  LOADDSP()
{
      wr_dspcode();
}

 
void wr_dspcode()
{
     uchar  code   *dspptr,*temp;
     uchar len;
     char i;
     uint addr;
     
     HPICL=0x08;  //clear HPIint,least is first
     HPICH=0x08;
 
     dspptr=dspcode;
     while(1)
     {
       len=*dspptr++;   //字节0:每行代码的长度
       if(len==0) break;
       else
       {
         addr=((*dspptr++)*256)+(*dspptr++);  //字节1:每行代码的起始地址
         addr--;
         temp=dspptr;
again:         
         WR_HPIL_A=addr/256;
         WR_HPIH_A=addr%256;
         for(i=0;i<len/2;i++)
         {  
           WR_HPIL0_D=*dspptr++;       //字节3:每行代码的程序代码
           WR_HPIH0_D=*dspptr++;                      
         }
         dspptr=temp;
         addr++;
         WR_HPIL_A=addr/256;
         WR_HPIH_A=addr%256;
         for(i=0;i<len/2;i++)
         {  
           if(RD_HPIL0_D!=*dspptr++)  goto again;       //不相等,再写
           if(RD_HPIH0_D!=*dspptr++)  goto again;                      
         }
       }
     }
     WR_HPIL_A=0x00; 
     WR_HPIH_A=0x7f;
     WR_HPIL1_D=0x00;    //dsp运行程序起始地址
     WR_HPIH1_D=0x80;        
     
}     


void inter_init()        //中断初始化
{
 //SM0=0; SM1=0; SM2=0;
 //REN=1;

 T2CON=0x30 ;          //T2作为波特率发生器         
 //RCAP2L=0x0EE;           //f=11059200Hz,设定波特率为19200bps, TC=2^16-f/32*baud=65518
 //RCAP2H=0x0FF;
 RCAP2L=0x0DC;           //f=11059200Hz,设定波特率为9600bps, TC=2^16-f/32*baud=65500
 RCAP2H=0x0FF;

 TL2=RCAP2L;
 TH2=RCAP2H;
 TR2=0;                                                                                                  

   // PS=1;              //串行中断高优先级
}


void init_51()
{
     TR2=1;
     SCON=0x50;
     ES=1;
     EA=1;    

}
/***************************************************************/
void rst8019()
{
      RST8019=1;
      delay(100);
      RST8019=0;
}
unsigned char getDSP()
{
         WR_HPIL_A=0;
         WR_HPIH_A=0x7d;
         return(RD_HPIH0_D);
}  
void init_AIC23()
{ 
   write_AIC23(RESET,0);
   write_AIC23(D_INTERFACE_ACT,0x001);
   write_AIC23(POWER_CON,0);
   write_AIC23(SAMPLE_RATE,0x022);  //44.1k
//   write_AIC23(SAMPLE_RATE,0x062);  //22.05k
//   write_AIC23(SAMPLE_RATE,0x02e);    //8.021k
    
   write_AIC23(L_LINE_VOLUME,0x0117);
   write_AIC23(L_LINE_VOLUME,0x0117);
   
   volume=100;
   write_AIC23(L_HEADPHONE_VOLUME,0x0180+volume);   
   write_AIC23(R_HEADPHONE_VOLUME,0x0180+volume);   
   
//   write_AIC23(A_AUDIO_PATH,0x009);  //bypass DAC OFF
   write_AIC23(A_AUDIO_PATH,0x015);   //MIC ADC DAC ON  20DB
//     write_AIC23(A_AUDIO_PATH,0x1fc);   //bypass MIC ADC DAC ON 0DB sidetone 
//     write_AIC23(A_AUDIO_PATH,0x07d);   //bypass MIC ADC DAC ON 20DB sidetone(-6db)
//   write_AIC23(A_AUDIO_PATH,0x011);   //LINE ADC DAC ON
   
   write_AIC23(D_AUDIO_PATH,0x04);		//44.1khz
   
   write_AIC23(D_AUDIO_INTERFACE,0x043);   //master  dsp mode
}
void write_AIC23(uchar addr,uint dat)
{
    uchar i;
    dat|=addr<<9;
    CS=0;
    for(i=0;i<16;i++)
    {
      SCLK=0;
      if((dat<<i)&0x8000)
        SDIN=1;
      else 
        SDIN=0;
      SCLK=1;
    }
    SCLK=0;
    CS=1;
}

void UartInt(void) interrupt 4          //串口中断服务程序
{uchar key;
    if(RI)
    {
      RI=0;
      key=SBUF;
	rev_buf[strlen]=key;
	strlen++;	
    }
    
}

⌨️ 快捷键说明

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