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);
}
文章评论(0条评论)
登录后参与讨论