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

📄 download.c

📁 DSP5402 开发板原理图 很详细 仅共参看
💻 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	  DSPRST     = P1^2;
sbit  	  RST8019    = P1^3;
sbit  	  USBRST	 = P1^4;
sbit	  LCDRST	 = P1^5;
sbit	  RST013	 = P3^2;		
sbit  	  CS         = P3^3;
sbit      SDIN       = P3^4;
sbit      SCLK       = P3^5;

sbit	  SDA		 = P1^6;
sbit	  SCK		 = P1^7;
  
uchar 	hpic;
bit 	ok,readT,key_down;
uchar	time,stoptime,ms,DSPorder;
uchar 	volume;

void 	wr_dspcode();
void  	delay(uint  wu);
void  	LOADDSP();
void 	init_51();
void 	init_AIC23();
void 	write_AIC23(uchar addr,uint dat);
void 	DspRst(void);
void	UsbRst(void);
void	LcdRst(void);
void 	RstNet();

//function of sta013
void 	write8(uchar d);
void 	writeSTA013(uchar addr,uchar x);
//uchar	readsta013(uchar addr);
uchar	read8();
void 	startbit();
void 	stopbit();
void	init_STA013(void);


uchar	rd_hpi(uint addr);

uchar	getDSP();

main()
{

     init_AIC23();   
	 init_STA013();
	
     delay(10000);
     RstNet();
     DspRst();
	 LcdRst();
	 UsbRst();	
     LOADDSP();
     init_51();
  
     delay(30000);
     volume=108;
     write_AIC23(L_HEADPHONE_VOLUME,0x0180+volume);   
     
     while(1);

}

void  	delay(uint  wu)
		{
  			for(wu;wu>0;wu--);
		}

void	delay1(uchar	k)
		{
			for( ;k>0;k--);
		}
void	LcdRst(void)
		{
			LCDRST = 0;
			delay(200);
			LCDRST = 1;
			delay(200);			
		}
void 	DspRst()
		{
      		DSPRST=0;
      		delay(200);
      		DSPRST=1;
      		delay(200);
		}

void	UsbRst(void)
		{
			USBRST = 0;
			delay(200);
			USBRST = 1;
			delay(200);	
		}

void	RstNet()
		{
      		RST8019=1;
      		delay(200);
      		RST8019=0;
	  		delay(200);	
		}		      

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++;
       			if(len==0) break;
       			else
       			{
         			addr=((*dspptr++)*256)+(*dspptr++);
         			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++;       
           				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;    //THE START ADDRESS OF RUN
     		WR_HPIH1_D=0x80;        
     
		}     

Timer0() interrupt 1
	{
   		ok=1;
   		ms++;
	}

void	init_51()
		{
      		TMOD=0x21;
      		SCON=0x40;
      		REN=1;
      		TH1=0xfd;
      		TL1=0xfd;
      		ET1=0;
      		ES=0;
      		IT0=1;
      		EX0=0;
     		ET0=1;
      		EA=1;
      		TR1=1;
      		TR0=1;
		}
/***************************************************************/

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,0x014);   //MIC ADC DAC ON  0DB
//     		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);
   
   			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 	writeSTA013(uchar addr,uchar x)
		{
   			startbit();   
  			write8(0x86);  //STA013  write
   			write8(addr);
   			write8(x);  
   			stopbit();    
		}
/*
uchar	readsta013(uchar addr)
		{
   			uchar	dat;

   			startbit();
   			write8(0x86);
   			write8(addr);   
   
   			startbit();
   			write8(0x87);
   			dat=read8();
   			stopbit();  
   			return(dat);
		}

uchar	read8()
		{
  			uchar i;
  			uchar d=0;
  			SCK=0;
  			for(i=0;i<8;i++)
  			{
    			SDA=1;
    			SCK=1;
				delay1(38);
    			if(SDA==1) d=d|((0x80)>>i);
    			delay1(38);
    			SCK=0;
  			}
  
  			SCK=0;
			delay1(38);            //NO ACK
  			SDA=1;
  			SCK=1;
			delay1(38);
  			SCK=0;
  
  			return(d);
		}
*/ 
void	write8(uchar d)
		{
  			uchar i;
  			for(i=0;i<8;i++)
  			{
    			SCK=0;
    			if((d<<i)&0x80) SDA=1;
    			else SDA=0;
    			SCK=1;
				delay1(38);
  			}
  			SCK=0;
  
  			SCK=1;          //ACK bit
  			while(SDA);
  			SCK=0;
		}

void	startbit()
		{
   			SCK=0;
			delay1(38);
   			SDA=1;
   			SCK=1;
			delay1(38);     //start bit
   			SDA=0;
			delay1(38);
   			SCK=0;
			delay1(38);
		}
void 	stopbit()
		{
   			SCK=0;
   			SDA=0;
			delay1(38);
   			SCK=1;
			delay1(38);     //stop bit
   			SDA=1;
			delay1(38);
   			SCK=0;
			delay1(38);
		}
void 	init_sta013()
		{
   			RST013=0;
   			delay(200);
   			RST013=1;
   			delay(10000);
   			writeSTA013(0x54,5);   //PCM_DIVIDER  384FS
   			writeSTA013(0x63,1);   //DAC_CLK fixed
   			writeSTA013(0x0A,17);   //RESERVED
   			writeSTA013(0x0B,3);    //RESERVED
   			writeSTA013(0x55,0X0c);   //PCM_CONF  16BIT
   			writeSTA013(0x52,160);   //PLL_FRAC_441_H
   			writeSTA013(0x51,186);   //PLL_FRAC_441_L
   			writeSTA013(0x65,140);   //PLL_FRAC_H  
   			writeSTA013(0x64,42);   //PLL_FRAC_L
   			writeSTA013(0x50,10);   //MFSDF_441
   			writeSTA013(0x61,7);    //MFSDF(X)
   			writeSTA013(0x05,0xa1);  //PLLCTRL  
   			writeSTA013(0x18,0X04);  //DATA_REQ_ENABLE
   			writeSTA013(0x0d,0X04);  //SCKL_POL SAMPLING ON FALLING EDGE
   			writeSTA013(0x0C,0X01);  //REQ_POL LINE IS HIGH
   			writeSTA013(0x72,0X01);  //RUN
   			writeSTA013(0x14,0X00);  //MUTE  
   			writeSTA013(0x13,0X01);  //PLAY
		}

⌨️ 快捷键说明

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