📄 dsp0315.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 + -