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

📄 dsp0315.c

📁 mp3播放器软件
💻 C
字号:
/*using edge interrupt*/
/******************************************************************************************/
/*                 Main Program                                                           */
/*                  T-Square Design Inc                                                   */
/*                                                                   by Dragon du         */
/*                                                                   July 6,2002          */
/******************************************************************************************/

#pragma code debug small
#include<stdio.h>
#include<reg51.h>
#include<string.h>
#include<stdlib.h>
#include<MATH.h>
#include<absacc.h>
#include<intrins.h>
#include <CTYPE.h>
#include "define.h"
extern bit  SmcRead(unsigned long PageAddr);
extern char IdmaRw;
//------------------------------------------------------------------------------------------
//SEND command to DSP
//input Command
//output DSP return value
//------------------------------------------------------------------------------------------
unsigned short SendCmd(unsigned short Cd)
{
	data unsigned char d;
	xdata unsigned char s;
	xdata unsigned short DspValue;

XBYTE[INT_OUT] = 0xff;
		s = XBYTE[DSP_FLG]&0X01;
		while (!s)
		{
			s = XBYTE[DSP_FLG]&0X01;
		}
		d = -((Cd & 0x0ff) + (Cd>>8) );
		XBYTE[HOBOX0] = Cd & 0x0ff;
		XBYTE[HOBOX1] = Cd>>8;
		XBYTE[HOBOX2] = d;
		XBYTE[HOBOX3] = 0;

XBYTE[INT_OUT] = 0xdf;
		s = XBYTE[DSP_FLG]&0X01;
		while (s)
		{
			s = XBYTE[DSP_FLG]&0X01;
		}
XBYTE[INT_OUT] = 0xff;
_nop_();

XBYTE[INT_OUT] = 0x5f;
		s = XBYTE[DSP_FLG]&0X01;
		while (!s)
		{
			s = XBYTE[DSP_FLG]&0X01;
		}
XBYTE[INT_OUT] = 0x7f;

//		a = XBYTE[HIBOX0];
//		b = XBYTE[HIBOX1];
		d = XBYTE[HIBOX3];
//		c = 0;
	DspValue = XBYTE[0x201];
	DspValue = (DspValue << 8) + XBYTE[0X200];
	return DspValue;
}//------------------------------------------------------------------------------------------
//Download DSP program
//input 	File *F: opened DSP file
//		Len:IDMA transfer Length
//		DAddr:DSP address.
//		BAddr:0x1000 base address
//output 	TURE,FALSE
//------------------------------------------------------------------------------------------

unsigned short DownloadDsp(unsigned short F,unsigned short Len,unsigned short DAddr,unsigned short BAddr)
{
	data unsigned char Flag1;
	xdata char xdata *B;
	B = 0x1000;
	XBYTE[CLKGATE_CTRL_M] = 0x32;
	XBYTE[IDMA_ADDR+2] = DAddr & 0xff;
	XBYTE[IDMA_ADDR+3] = DAddr>>8;	//0x40 for dmx 0x80 for dmy
	XBYTE[IDMA_BUF_ADDR] = BAddr & 0xff;
	XBYTE[IDMA_BUF_ADDR+1] = BAddr>>8;	
	XBYTE[IDMA_BLK_SIZE] = Len & 0xff;
	XBYTE[IDMA_BLK_SIZE+1] = Len>>8;
	DspRw;
	if (IdmaRw) XBYTE[IDMA_CTRL] = 0x8b;
	else XBYTE[IDMA_CTRL] = 0xcb;
//	XBYTE[IDMA_CTRL] = 0xcb;
	Flag1 = XBYTE[IDMA_STATUS];
	while(!((Flag1 & 0x03) == 0x02)&&!((Flag1 & 0x03)==0x01))
	{
		Flag1 = XBYTE[IDMA_STATUS];
	}
	while(!((Flag1 & 0x03)==0x01))
	{
		MemoryRw;
		SmcRead(F++);
		DspRw;
		XBYTE[IDMA_BUF_ADDR] = 0;
		XBYTE[IDMA_BUF_ADDR+1] = 0;	
		XBYTE[IDMA_CTRL] = 0xcb;
		Flag1 = XBYTE[IDMA_STATUS];
		while(!((Flag1 & 0x03) == 0x02)&&!((Flag1 & 0x03)==0x01))
		{
			Flag1 = XBYTE[IDMA_STATUS];
		}
		XBYTE[IDMA_STATUS] = Flag1;
	}
	XBYTE[IDMA_STATUS] = Flag1;
	XBYTE[CLKGATE_CTRL_M] = 0x72;
	McuRw;
	return F;
}
//------------------------------------------------------------------------------------------
//load dsp program
//input none
//output 0:fail 	1:success
//------------------------------------------------------------------------------------------
char LoadDspPm(unsigned short Program)
{
	xdata unsigned short PLen;
	xdata unsigned short LenTo;
	xdata unsigned short DpAddr;
	xdata unsigned short BufAddr;
	xdata unsigned short DspMark;
	xdata unsigned short SmcReadCount;
	xdata unsigned short ii;
	xdata unsigned char *ShareBuf;
	MemoryRw;
	SmcRead(Program++);
	McuRw;
	if (XBYTE[0X1000] == 0XFF)
	{
		return FALSE;
	}
	
	SmcReadCount = 0;
	Write(DSP_CTRL, 0x20);
	_nop_();_nop_();_nop_();_nop_();
	Write(DSP_CTRL, 0xa0);
	ShareBuf = 0x1000;
	DpAddr = 0;
	BufAddr = 0;
	LenTo = 0;
	PLen = 0;
	while (1) 
	{
			LenTo = XBYTE[0x1000+BufAddr];
			LenTo = (LenTo<<8) + XBYTE[0x1000+BufAddr+1];
			DpAddr = XBYTE[0x1000+BufAddr+2];
			DpAddr = (DpAddr<<8) + XBYTE[0x1000+BufAddr+3];
			DspMark = DpAddr & IDMA_BANK_MASK;
			BufAddr = BufAddr + 4;
			if (LenTo == 0xffff)
				break;
			if (DspMark == IDMA_BANK_PM)
			{
				ii = LenTo;
				LenTo = LenTo *3;
				
			}
			else if ((DspMark == IDMA_BANK_DMX) ||(DspMark == IDMA_BANK_DMY))
			{
				ii = LenTo;
				LenTo = LenTo*2;
			}
			else return FALSE;
			
		Program = DownloadDsp(Program,ii, DpAddr,BufAddr);
		BufAddr = (BufAddr+LenTo)%512;
		if (BufAddr ==0)
		{
			MemoryRw;
			SmcRead(Program++);
			McuRw;
		}
		
		LenTo = 0;
	}
	McuRw;
	return TRUE;
}
/*
void SwapPage(unsigned short DspBufAddr,unsigned char OpCode)
{
	unsigned char Flag1;
	XBYTE[IDMA_ADDR+2] = DspBufAddr & 0xff;
	XBYTE[IDMA_ADDR+3] = DspBufAddr>>8;//0x40 for dmx 0x80 for dmy
	XBYTE[IDMA_BUF_ADDR] = 0;
	XBYTE[IDMA_BUF_ADDR+1] = 0;	
	XBYTE[IDMA_BLK_SIZE] = 0;
	XBYTE[IDMA_BLK_SIZE+1] = 1;
	DspRw;
	XBYTE[IDMA_CTRL] = OpCode;		//0xcb write 0x8b read
	Flag1 = XBYTE[IDMA_STATUS];
	while(!(Flag1 & 0x01))
	{
		Flag1 = XBYTE[IDMA_STATUS];
	}
	XBYTE[IDMA_STATUS] = Flag1;
	McuRw;
}
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -