原创 MAS3587F可以压缩MP3了

2008-11-4 16:01 1630 1 1 分类: MCU/ 嵌入式

MAS3587F可以压缩MP3了:


参考网上的源码,经过测试,可以在MAS3587F的PIO口接收到MP3数据了。


i2c的源码:


//以下是对IIC总线的操作子程序


#define Is77e58
void d5us(void)//5us 22.1184MHz
{
    _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
#ifdef Is77e58
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 _nop_();
#endif
}


 


//*******************************************************************************************************
void IICStart(void)//启动总线
{
    unsigned int ii;


    bI2cError=0;
 d5us();
 i2cSCL=1;
 d5us();
 while(!i2cSCL){
     if(++ii==20000){//100ms
   bI2cError=1;
   return;
  }
  d5us();
 }
 i2cSDA=1;
 d5us();
 i2cSDA=0;
 d5us();
 i2cSCL=0;
 d5us();
 i2cSDA=1;
 d5us();
}
//*******************************************************************************************************
void IICStop(void)//停止IIC总线
{
 d5us();
 i2cSDA=0;
 d5us();
 i2cSCL=1;
 d5us();
 i2cSDA=1;
 d5us();
 i2cSCL=0;
 d5us();
}
//*******************************************************************************************************
unsigned char IICRecAck(void)//检查应答位
{
    unsigned int ii;
    unsigned char k;


    bI2cError=0;
 d5us();
 i2cSDA=1;
 d5us();


 i2cSCL=1;
  d5us();
  while(!i2cSCL){
      if(++ii==20000){//100ms
    bI2cError=1;
    return 0x01;
   }
   d5us();
  }


    if(i2cSDA)k=0x01;
 else k="0x00";       


 d5us();
 i2cSCL=0;
 d5us();
 return(k);
}
//*******************************************************************************************************
void IICAck(void)//对IIC总线产生应答
{
 d5us();
 i2cSDA=0;
 d5us();
 i2cSCL=1;
 d5us();
 i2cSCL=0;
 d5us();
 i2cSDA=1;
 d5us();
}


//*******************************************************************************************************
void IICNoAck(void)//不对IIC总线产生应答
{
 d5us();
 i2cSDA=1;
 d5us();
 i2cSCL=1;
 d5us();
 i2cSCL=0;
 d5us();
}
//*******************************************************************************************************
void IICSendByte(unsigned char sendbyte)//向IIC总线写数据
{
    unsigned int ii;
 unsigned char data j="8";


 bI2cError=0;
 for(;j>0;j--){
  sendbyte<<=1; //无论C51怎样实现这个操作,始终会使CY=sendbyte^7;
  i2cSDA=CY;
  d5us();
  i2cSCL=1;
  d5us();
  while(!i2cSCL){
      if(++ii==20000){//100ms
    bI2cError=1;
    return;
   }
   d5us();
  }


  i2cSCL=0;
  d5us();
 }
}
//*******************************************************************************************************
unsigned char IICReceiveByte(void)//从IIC总线上读数据子程序
{
    unsigned char ii;
 unsigned char receivebyte,i=8;


 bI2cError=0;
 d5us();
 while(i--){
  i2cSCL=1;
  d5us();
  while(!i2cSCL){
      if(++ii==20000){//100ms
    bI2cError=1;
    return 0xff;
   }
   d5us();
  }


  receivebyte=(receivebyte<<1)|i2cSDA;
  d5us();
  i2cSCL=0;
  d5us();
 }
 return(receivebyte);
}


 


 


读写字函数:


unsigned char WriteCONF(unsigned char Address,unsigned char byte1,unsigned char byte2)//Write to DIRECT CONFIGURATION register
{
    d5ms();
 I2cErrNo=0;
 IICStart();if(bI2cError)goto WriteCONFerror;


 IICSendByte(I2C_Device_w);if(bI2cError)goto WriteCONFerror;


 if(IICRecAck())goto WriteCONFerror;


 if(bI2cError)goto WriteCONFerror;


d1ms();
 IICSendByte(Address);if(bI2cError)goto WriteCONFerror;


 if(IICRecAck())goto WriteCONFerror;


 if(bI2cError)goto WriteCONFerror;


d1ms();
 IICSendByte(byte1);if(bI2cError)goto WriteCONFerror;


 if(IICRecAck())goto WriteCONFerror;


 if(bI2cError)goto WriteCONFerror;


 IICSendByte(byte2);if(bI2cError)goto WriteCONFerror;


 if(IICRecAck())goto WriteCONFerror;


 if(bI2cError)goto WriteCONFerror;


d1ms();
 IICStop();
 return(0);


WriteCONFerror:
    IICStop();
    return(0);
}


 


//*******************************************************************************************************
unsigned int ReadCONF(unsigned char Address)//Reading DIRECT CONFIGURATION register
{
 unsigned int temp;


 d5ms();
 IICStart();if(bI2cError)goto ReadCONFerror;
 IICSendByte(I2C_Device_w);if(bI2cError)goto ReadCONFerror;
 if(IICRecAck())goto ReadCONFerror;
 if(bI2cError)goto ReadCONFerror;
d1ms();
 IICSendByte(Address);if(bI2cError)goto ReadCONFerror;
 if(IICRecAck())goto ReadCONFerror;
 if(bI2cError)goto ReadCONFerror;
d1ms();
 IICStart();if(bI2cError)goto ReadCONFerror;
 IICSendByte(I2C_Device_r);if(bI2cError)goto ReadCONFerror;
 if(IICRecAck())goto ReadCONFerror;
 if(bI2cError)goto ReadCONFerror;
d1ms();
 temp=IICReceiveByte();if(bI2cError)goto ReadCONFerror;
 IICAck();


 temp=(temp<<8) | IICReceiveByte();if(bI2cError)goto ReadCONFerror; //!注意不要用&
 IICNoAck();
d1ms();
 IICStop();
 return(temp);


ReadCONFerror:
 IICStop();
 return(0);
}


 


//*******************************************************************************************************
void WriteCODEC_Verify(unsigned char subad,unsigned char byte1,unsigned char byte2)
{
    unsigned int dat,dat1;
 unsigned char i;


 dat1=(byte1<<8)+byte2;
 WriteCODEC(subad,byte1,byte2);
 for(i=0;i<100;i++)d1ms();
 dat=ReadCODEC(subad);
 if(dat!=dat1)bI2cError=1;
}



//*******************************************************************************************************
unsigned char WriteCODEC(unsigned char subad,unsigned char byte1,unsigned char byte2)//Write to CODEC register
{
 d5ms();


 IICStart();if(bI2cError)goto WriteCODECerror;
 IICSendByte(I2C_Device_w);if(bI2cError)goto WriteCODECerror;
 if(IICRecAck())goto WriteCODECerror;


d1ms();
 IICSendByte(codec_write);if(bI2cError)goto WriteCODECerror;//send Codec's address
 if(IICRecAck())goto WriteCODECerror;


d1ms();
 IICSendByte(0x00);if(bI2cError)goto WriteCODECerror;   //Codec register subaddress
 if(IICRecAck())goto WriteCODECerror;



 IICSendByte(subad);if(bI2cError)goto WriteCODECerror;
 if(IICRecAck())goto WriteCODECerror;    


d1ms();
 IICSendByte(byte1);if(bI2cError)goto WriteCODECerror;   //send first 8bit (15 - 8)
 if(IICRecAck())goto WriteCODECerror;    



 IICSendByte(byte2);if(bI2cError)goto WriteCODECerror;   //send next 8bit (7 - 0)
 if(IICRecAck())goto WriteCODECerror;


d1ms();
 IICStop();
 return(0);


WriteCODECerror:
 IICStop();
 return(0);
}


 


//*******************************************************************************************************
unsigned int ReadCODEC(unsigned char subad)//Reading CODEC register
{
 unsigned int temp;


 d5ms();


 IICStart();if(bI2cError)goto ReadCODECerror;
 IICSendByte(I2C_Device_w);if(bI2cError)goto ReadCODECerror;
 if(IICRecAck())goto ReadCODECerror;


d1ms();
 IICSendByte(codec_write);if(bI2cError)goto ReadCODECerror;   //send Codec's address
 if(IICRecAck())goto ReadCODECerror;


d1ms();
 IICSendByte(0x00);if(bI2cError)goto ReadCODECerror;   //Codec register subaddress
 if(IICRecAck())goto ReadCODECerror;



 IICSendByte(subad);if(bI2cError)goto ReadCODECerror;    //send subadress register
 if(IICRecAck())goto ReadCODECerror;


d1ms();
 IICStop();


 IICStart();if(bI2cError)goto ReadCODECerror;
 IICSendByte(I2C_Device_w);if(bI2cError)goto ReadCODECerror;
 if(IICRecAck())goto ReadCODECerror;


d1ms();
 IICSendByte(codec_read);if(bI2cError)goto ReadCODECerror;  //send Codec's address
 if(IICRecAck())goto ReadCODECerror;


d1ms();
 IICStart();
 IICSendByte(I2C_Device_r);if(bI2cError)goto ReadCODECerror;  //send Device Read
 if(IICRecAck())goto ReadCODECerror;


d1ms();
 temp=IICReceiveByte();if(bI2cError)goto ReadCODECerror;   //put first byte (15 - 8) in data1
 IICAck();


 temp=(temp<<8) | IICReceiveByte();if(bI2cError)goto ReadCODECerror;//!注意不要用&   put second byte (7 - 0) in data2
 IICNoAck();
d1ms();
 IICStop();
 return(temp);


ReadCODECerror:
 IICStop();
 return(0);
}



//*******************************************************************************************************
void WriteDSP_D0_Verify(unsigned char addh,unsigned char addl,unsigned char dath,unsigned char datm,unsigned char datl)
{
    unsigned long dat,dat1;
 unsigned char i;


    dat1=(dath<<16)+(datm<<8)+datl;
 WriteDSP_D0(addh,addl,dath,datm,datl);
 for(i=0;i<100;i++)d1ms();
 dat=ReadDSP_D0(addh,addl);
 if(dat!=dat1)bI2cError=1;
}


 



//*******************************************************************************************************
void WriteDSP_D0(unsigned char addh,unsigned char addl,unsigned char dath,unsigned char datm,unsigned char datl)
{
 IICStart();if(bI2cError)goto WriteDSP_D0err;
 IICSendByte(I2C_Device_w);if(bI2cError)goto WriteDSP_D0err;
d1ms();
 if(IICRecAck())goto WriteDSP_D0err;


 IICSendByte(data_write);if(bI2cError)goto WriteDSP_D0err;//send subcommando DSP
d1ms();
 if(IICRecAck())goto WriteDSP_D0err;


 IICSendByte(0xe0);if(bI2cError)goto WriteDSP_D0err;  //0xe0 0x00 write D0 memory
 if(IICRecAck())goto WriteDSP_D0err;


 IICSendByte(0x00);if(bI2cError)goto WriteDSP_D0err;
d1ms();
 if(IICRecAck())goto WriteDSP_D0err;


 IICSendByte(0x00);if(bI2cError)goto WriteDSP_D0err;  //0x00 0x01 1 word to write
 if(IICRecAck())goto WriteDSP_D0err;


 IICSendByte(0x01);if(bI2cError)goto WriteDSP_D0err;
d1ms();
 if(IICRecAck())goto WriteDSP_D0err;


 IICSendByte(addh);if(bI2cError)goto WriteDSP_D0err;  //addh,addl start address
 if(IICRecAck())goto WriteDSP_D0err;


 IICSendByte(addl);if(bI2cError)goto WriteDSP_D0err;
d1ms();
 if(IICRecAck())goto WriteDSP_D0err;


 IICSendByte(0x00);if(bI2cError)goto WriteDSP_D0err;  //0x00,dath,datm,datl  value
 if(IICRecAck())goto WriteDSP_D0err;


 IICSendByte(dath);if(bI2cError)goto WriteDSP_D0err;
d1ms();
 if(IICRecAck())goto WriteDSP_D0err;


 IICSendByte(datm);if(bI2cError)goto WriteDSP_D0err;
 if(IICRecAck())goto WriteDSP_D0err;


 IICSendByte(datl);if(bI2cError)goto WriteDSP_D0err;
d1ms();
 if(IICRecAck())goto WriteDSP_D0err;


 IICStop();
 return;


WriteDSP_D0err:
 IICStop();
 return;
}


 


//*******************************************************************************************************
unsigned long ReadDSP_D0(unsigned char addh,unsigned char addl)
{
    unsigned char byte1,byte2,byte3;


 IICStart();if(bI2cError)goto ReadDSP_D0err;
 IICSendByte(I2C_Device_w);if(bI2cError)goto ReadDSP_D0err;
d1ms();
 if(IICRecAck())goto ReadDSP_D0err;


 IICSendByte(data_write);if(bI2cError)goto ReadDSP_D0err;//send subcommando DSP
d1ms();
 if(IICRecAck())goto ReadDSP_D0err;


 IICSendByte(0xc0);if(bI2cError)goto ReadDSP_D0err;  //0xe0 0x00 write D0 memory
 if(IICRecAck())goto ReadDSP_D0err;


 IICSendByte(0x00);if(bI2cError)goto ReadDSP_D0err;
d1ms();
 if(IICRecAck())goto ReadDSP_D0err;


 IICSendByte(0x00);if(bI2cError)goto ReadDSP_D0err;  //0x00 0x01 1 word to write
 if(IICRecAck())goto ReadDSP_D0err;


 IICSendByte(0x01);if(bI2cError)goto ReadDSP_D0err;
d1ms();
 if(IICRecAck())goto ReadDSP_D0err;


 IICSendByte(addh);if(bI2cError)goto ReadDSP_D0err;  //addh,addl start address
 if(IICRecAck())goto ReadDSP_D0err;


 IICSendByte(addl);if(bI2cError)goto ReadDSP_D0err;
d1ms();
 if(IICRecAck())goto ReadDSP_D0err;


 IICStop();


 IICStart();if(bI2cError)goto ReadDSP_D0err;
 IICSendByte(I2C_Device_w);if(bI2cError)goto ReadDSP_D0err;
d1ms();
 if(IICRecAck())goto ReadDSP_D0err;


 IICSendByte(data_read);if(bI2cError)goto ReadDSP_D0err;//send subcommando DSP
d1ms();
 if(IICRecAck())goto ReadDSP_D0err;


 IICStart();if(bI2cError)goto ReadDSP_D0err;
 IICSendByte(I2C_Device_r);if(bI2cError)goto ReadDSP_D0err;
d1ms();
 if(IICRecAck())goto ReadDSP_D0err;


 byte1=IICReceiveByte();if(bI2cError)goto ReadDSP_D0err;
 IICAck();


 byte1=IICReceiveByte();if(bI2cError)goto ReadDSP_D0err;
d1ms();
 IICAck();


 byte2=IICReceiveByte();if(bI2cError)goto ReadDSP_D0err;
 IICAck();


 byte3=IICReceiveByte();if(bI2cError)goto ReadDSP_D0err;
d1ms();
 IICNoAck();


 IICStop();
 return((byte1<<16)+(byte2<<8)+byte3);


ReadDSP_D0err:
 IICStop();
 return(0);
}


 


初始化:


 for(i=0;i<1000;i++)d1ms();
    bitRes="0";
 for(i=0;i<1000;i++)d1ms();
 bitRes=1;
 for(i=0;i<2000;i++)d1ms();


 WriteCONF(CONTROL,0x8C,0x00);
 if(bI2cError)lcd_display1(0, 0, 10, "I2C error4");


 d5ms();
 WriteCONF(DCCF,0x50,0x50);
 if(bI2cError)lcd_display1(0, 0, 10, "I2C error5");
 d5ms();
 WriteCONF(DCFR,0x00,0x01);
 if(bI2cError)lcd_display1(0, 0, 10, "I2C error6");
 d5ms();
    ReadCONF(DCCF);
 if(bI2cError)lcd_display1(0, 0, 10, "I2C error7");


 


进入编码模式:


void mas_config_encoder(void)
{
    unsigned char i;
 unsigned long dat;


 WriteCONF(CONTROL,0x8C,0x00);
 for(i=0;i<4;i++)d5ms();


 WriteDSP_D0_Verify(0x07,0xf0,0x08,0x08,0x64);//encoder control
 WriteDSP_D0_Verify(0x07,0xf6,0x00,0x00,0x40);//application selection
 for(i=0;i<200;i++)d1ms();


 dat=ReadDSP_D0(0x07,0xf7);      //application running
 if((dat&0xff)!=0x40){
     lcd_display1(1, 0, 16, "D0,0x07f7 WRerr ");
 }


 WriteDSP_D0(0x07,0xf1,0x00,0x00,0x09);   //main to control (put last)
 for(i=0;i<200;i++)d1ms();


 dat=ReadDSP_D0(0x07,0xf1);
 if((dat&0xff)!=0x08){
     lcd_display1(1, 0, 16, "D0,0x07f1 WRerr ");
 }


 WriteCODEC_Verify(0x00,0x22,0x06);//audio codec config
 WriteCODEC_Verify(0x08,0x00,0x00);//input select mode
 WriteCODEC_Verify(0x11,0x00,0x00);//balance
}


 


接收数据:


 bitPCS=0;
 bitPR=0;
 bitPRTW=1;
 bitPRTR=1;
 bitEOD=1;


  mas_config_encoder();
  pd=0x0000;
  while(1){
   while(!bitEOD);
      bitPR="1";
   while(bitPRTW);
   XBYTE[pd]=P0;
   bitPR=0;
   if(++pd==0x0400)break;
   while(!bitPRTW);
  }


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
1
关闭 站长推荐上一条 /1 下一条