📄 download.c
字号:
#include <Reg52.h>
#include <absacc.h>
#include <stdio.h>
#include <intrins.h>
//#define DATA
#include "dsp_code.h"
#ifdef DATA
#include "dsp_data.h"
#endif
/* 定义宏 */
#define uint unsigned int
#define uchar unsigned char
#define VOL1 0x81
#define VOL2 0x82
/* TLV320AIC23寄存器地址 */
#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
/* 定义寄存器端口地址
---------------------------------------------------------------
A15 A14 A13 A12 A11 A10 A9 A8
---------------------------------------------------------------
X X X nHCS HR/nW HCNTL1 HCNTL0 HBIL
---------------------------------------------------------------*/
#define HPICL XBYTE[0xe000]
#define HPICH XBYTE[0xe100]
#define WR_HPIL0_D XBYTE[0xe200] // HCNTL0 = 0,HCNTL0 = 1,每写1次,HPIA事先增1
#define WR_HPIH0_D XBYTE[0xe300]
#define WR_HPIL_A XBYTE[0xe400] // 只代表第一个字节,先高字节还是低字节由BOB位来决定
#define WR_HPIH_A XBYTE[0xe500]
#define WR_HPIL1_D XBYTE[0xe600] // HCNTL0 = 1,HCNTL0 = 1,HPIA寄存器不受影响
#define WR_HPIH1_D XBYTE[0xe700]
#define RD_HPIL0_D XBYTE[0xeA00] // HCNTL0 = 0,HCNTL0 = 1,每读1次,HPIA事后增1
#define RD_HPIH0_D XBYTE[0xeB00]
#define RD_HPIL1_D XBYTE[0xeE00] // HCNTL0 = 1,HCNTL0 = 1,HPIA寄存器不受影响
#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 CS = P3^3; // SPI
sbit SDIN = P3^4;
sbit SCLK = P3^5;
uchar hpic;
bit ok,readT,key_down;
unsigned char time,stoptime,ms,DSPorder;
unsigned char volume;
void wr_dspcode(void);
void delay(uint wu);
void LOADDSP(void);
void init_51(void);
void init_AIC23(void);
void write_AIC23(uchar addr, uint dat);
void DspRst(void);
void UsbRst(void);
void LcdRst(void);
void RstNet(void);
unsigned char rd_hpi(uint addr);
unsigned char getDSP();
int main(void)
{
init_AIC23();
delay(10000);
RstNet();
DspRst();
LcdRst();
UsbRst();
LOADDSP();
init_51();
delay(30000);
//volume = 108;
//write_AIC23(L_HEADPHONE_VOLUME, 0x0180+volume);
while(1);
return 0;
}
void delay(uint wu)
{
for (wu; wu > 0; wu--);
}
void LcdRst(void)
{
LCDRST = 0;
delay(200);
LCDRST = 1;
delay(200);
}
void DspRst(void)
{
DSPRST = 0;
delay(200);
DSPRST = 1;
delay(200);
}
void UsbRst(void)
{
USBRST = 0;
delay(200);
USBRST = 1;
delay(200);
}
void RstNet(void)
{
RST8019 = 1;
delay(200);
RST8019 = 0;
delay(200);
}
void LOADDSP(void)
{
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(void)
{
uchar code *dspptr, *temp;
uchar len, stage_data;
char i;
uint addr;
HPICL = 0x08; // clear HPIint,least is first BOB = 0,第1字节为高字节;SMOD = 0,主机寻址方式(HOM)
HPICH = 0x08; // HPIC是16位寄存器,主机写HPIC,第一字节与第二字节内容必须相同
dspptr = dsp_program;
while (1)
{
len = *dspptr++; // 第一个字节表示数据长度(字节数),第二、三字节表示起始地址,高位字节在前
if (len == 0)
{
if(stage_data) // 如果已经是在写数据空间,说明已经结束,跳出循环
{
break;
}
else
{
stage_data = 1; // 程序空间写完了,开始写数据空间
#ifdef DATA
dspptr = dsp_data;
#endif
#ifndef DATA
break;
#endif
}
}
else
{
addr = ((*dspptr++) * 256); //将两个字节的数据组合成一个16位地址
addr += *dspptr++;
addr--; // HCNTL0 = 0,HCNTL0 = 1,每写1次,HPIA事先增1
temp = dspptr;
again:
WR_HPIL_A = addr / 256; // BOB = 0,第1字节为高字节,地址高8位
WR_HPIH_A = addr % 256; // 地址低8位
for (i=0; i < len/2; i++)
{
WR_HPIL0_D = *dspptr++; // 第一字节,16位数据高8位
WR_HPIH0_D = *dspptr++; // 第二字节,16位数据低8位
}
dspptr = temp; // 指针回到刚刚写完的len长度数据的首字节,以便读出进行校验
addr++; // HCNTL0 = 0,HCNTL0 = 1,每读1次,HPIA事后增1
WR_HPIL_A = addr / 256;
WR_HPIH_A = addr % 256;
for (i=0; i < len/2; i++)
{
if (RD_HPIL0_D != *dspptr++)
{
dspptr = temp; // 将dspptr指回到该len长度的首字节,以便重新写该len长度的数据
addr--;
goto again; // 不相等,再写
}
if (RD_HPIH0_D != *dspptr++)
{
dspptr = temp; // 将dspptr指回到该len长度的首字节,以便重新写该len长度的数据
addr--;
goto again;
}
}
}
}
WR_HPIL_A = 0x00; // 向地址0x007f写入pc指针加载地址
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(void)
{
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(void)
{
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(R_LINE_VOLUME, 0x0117);
volume = 100;
write_AIC23(L_HEADPHONE_VOLUME, 0x0180+volume); //0x1e4
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(A_AUDIO_PATH, 0x055);
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; // A[15..9]控制地址,A[8..0]控制数据
CS=0;
for (i = 0; i < 16; i++) // 模拟SPI时序发送
{
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);
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -