#include <Reg52.h>
#include <absacc.h>
#include <stdio.h>
#include <intrins.h>
#include <dspcode.h>
//include <predefine.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]
sbit DSPRST = P1^2;
sbit RST8019 = P1^3;
sbit USBRST = P1^4;
sbit LCDRST = P1^5;
sbit CS =P3^3;
sbit SDIN =P3^4;
sbit SCLK =P3^5;
sbit HCS=P2^4;
sbit HBIL=P2^0;
sbit HCNTL0=P2^1;
sbit HCNTL1=P2^2;
sbit HRW=P2^3;
sbit HDS2=P3^6; //WR
sbit HDS1=P3^7; //RD
sbit P10=P1^0;
uchar hpic;
bit ok,readT,key_down;
unsigned char time,stoptime,ms,DSPorder;
unsigned char volume;
unsigned char aa[10]={0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19};
void wr_dspcode();
void delay(uint wu);
void init_51();
void init_AIC23();
void write_AIC23(uchar addr,uint dat);
void DspRst(void);
void UsbRst(void);
void LcdRst(void);
void RstNet();
unsigned char rd_hpi(uint addr);
unsigned char getDSP();
void LOADDSP();
void dspcode_write();
void hpic_w(unsigned char,unsigned char); //写HPI控制寄存器HPIC
void hpia_w(unsigned int); //将f020即将访问的dsp地址写入HPIA寄存器
void hpid0_w(unsigned char,unsigned char);//f020写数据到hpid
unsigned int hpid0_R(void); //f020读hpid寄存器数据
void hpid1_w(unsigned char,unsigned char);//HCT1HCT0=11,f020写hpid寄存器数据,但不影响hpia
void HPI_init();
void delay1(unsigned int);
main()
{
uint ad;
uchar *cc;
int i;
init_AIC23();
delay(10000);
HPI_init();
RstNet();
DspRst();
LcdRst();
UsbRst();
LOADDSP();
init_51();
delay(30000);
volume=108;
write_AIC23(L_HEADPHONE_VOLUME,0x0180+volume);
HPICL=0x08; //clear HPIint,first byte is most significant
HPICH=0x08;
while(1)
{ ad=0x0300; //80
ad--;
cc=aa;
again:
WR_HPIL_A=ad/256;
WR_HPIH_A=ad%256;
for(i=0;i<100;i++)
{
WR_HPIL0_D=i;
WR_HPIH0_D=i;
}
ad=0x0300;
WR_HPIL_A=ad/256;
WR_HPIH_A=ad%256;
if(RD_HPIL0_D==0x0)P10=0;
}
}
void delay(uint wu)
{
for(wu;wu>0;wu--);
}
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();
} */
/*
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;
uchar hpidl,hpidh;
// uchar *cc;
// uchar ad;
HPICL=0x08; //clear HPIint,first byte is most significant
HPICH=0x08;
/* P2=0xe0; //写hpic低8位命令,HCS=0,HR/W=0,HCT1HCT0=00,HBIL=0
P0=0x08;
P2=0xe1; //写hpic高8位命令,HR/W=0,HCT1HCT0=00,HBIL=1
P0=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;
/* hpia_w();
P2=0xe4;//写hpia第一个字节(高8位)命令,HCS=0,HR/W=0,HCT1HCT0=10,HBIL=0
P0=addr/256;
P2=0xe5;//写hpia第二个字节(低8位)命令,HCS=0,HR/W=0,HCT1HCT0=10,HBIL=1
P0=addr%256;
hpia_w(addr); */
for(i=0;i<len/2;i++)
{
// WR_HPIL0_D=*dspptr++;
// WR_HPIH0_D=*dspptr++;
hpidl=*dspptr++;
hpidh=*dspptr++;
// WR_HPIL0_D=hpidl;
// WR_HPIH0_D=hpidh;
P0=hpidl;
HDS1=1;
P2=0xe2; //写hpid第一个字节(16位的高8位)命令,HCS=0,HR/W=0,HCT1HCT0=01,HBIL=0
HDS1=0;
delay(1);
HDS1=1;
P0=hpidh;
HDS1=1;
P2=0xe3; //写hpid第二个字节(16位的低8位)命令,HCS=0,HR/W=0,HCT1HCT0=01,HBIL=1
HDS1=0;
delay(1);
HDS1=1;
}
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;
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;
}
/***************************************************************/
/*
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 d