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

📄 mp3demo.c

📁 在TMS320C5402开发板下的MP3的HPI加载程序
💻 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   SENDBUF   0x28b2

#define   KEY_UP   0x80
#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 KEYNUM     27
#define MAINLONG   3
#define ERR        16
#define FRR        16
#define MAXBYTE    16

/*定义寄存器端口地址*/
#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 char rd_hpi(uint addr);
void rst8019();
void init_AIC23();
void write_AIC23(uchar addr,uint dat);
unsigned char getkey();
void Nrst();

void delay1(unsigned char k);
unsigned char getDSP();

//function of sta013
void write8(unsigned char d);
void writeSTA013(unsigned char addr,unsigned char x);
unsigned char readsta013(unsigned char addr);
unsigned char read8();
void startbit();
void stopbit();
void init_sta013();



main()
{
     uchar i,j,key;
     uint k;

     init_AIC23();   
     init_sta013();
     
     delay(10000);
     rst8019();
     Nrst();
     LOADDSP();
     init_51();
  
     delay(30000);
     volume=108;
     write_AIC23(L_HEADPHONE_VOLUME,0x0180+volume);   
     
start:     

         if(rd_hpi(0x007c)==0x01)
         {
             WR_CR=0x46;     //SET ADDR
             WR_PARA=0xb0;
             WR_PARA=0x04;
             WR_CR=0x42;

             for(j=1;j<9;j++)
             {
               wr_hpi(0x007c,j);
               WR_HPIL_A=SENDBUF/256;
               WR_HPIH_A=SENDBUF%256;
               for(k=0;k<600;k++)
               {  
                 WR_PARA=RD_HPIL0_D;       
                 WR_PARA=RD_HPIH0_D;                      
               }
             }
         }
         
         if(RI)
         {
            RI=0;
            key=SBUF;
            if(key==VOL1)
            {
              do{
                if(volume>0)
                  volume--;
                write_AIC23(L_HEADPHONE_VOLUME,0x0180+volume);   
                delay(10000);
                key=getkey();
              }while(key!=KEY_UP);
            }
            else if(key==VOL2)
            {
              do{
                if(volume<0x7f)
                  volume++;
                write_AIC23(L_HEADPHONE_VOLUME,0x0180+volume);  
                delay(10000);
                key=getkey();
              }while(key!=KEY_UP);
            }
            else if(key<255)
              wr_hpi(0x007e,key);
         }
         
     goto start;
}

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();
}
unsigned char rd_hpi(uint addr)
{
      unsigned char i;
      WR_HPIL_A=addr/256;
      WR_HPIH_A=addr%256;
      i=RD_HPIL0_D;
      i=RD_HPIH0_D;
      return(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 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;       
     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 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,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;
}

unsigned char getkey()
{
    uchar key;
    if(RI)
    {
      RI=0;
      key=SBUF;
      return(key);
    }
    return(255);
}

void writeSTA013(unsigned char addr,unsigned char x)
{
   startbit();   
   write8(0x86);  //STA013  write
   write8(addr);
   write8(x);  
   stopbit();    
}
unsigned char readsta013(unsigned char addr)
{
   unsigned char dat;

   startbit();
   write8(0x86);
   write8(addr);   
   
   startbit();
   write8(0x87);
   dat=read8();
   stopbit();  
   return(dat);
}
unsigned char read8()
{
  unsigned char i;
  unsigned char 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(unsigned char d)
{
  unsigned char 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(100);
   RST013=1;
   delay(100);
//   delay(60000);
   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 + -