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

📄 download.c

📁 TI公司的DSP TMS320VC5402开发板的全套资料
💻 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 + -