在跑一个简单的程序时,执行到初始化中断向量表之后,程序跑飞,一查/XRS电平,发现有一个大概17us的低脉冲(见图1,dsp系统时钟150M)。用ccs 软件reset下,/XRS复位低脉冲消失,但是重新仿真load程序,依然跑飞,/XRS电平再次出现一个大概17us的低脉冲。图2 是本设计jtag和看门口电路图。

图1 /XRS电平,发现有一个大概17us的低脉冲

图2 jtag和看门狗电路
此外xa12-xa15 悬空处理(至少仿真引导应该没问题,现在仿真时总是出现复位),下面是测试程序,是想写一个dsp读取fifo 的程序,通过中断读取wrful和rdempty状态,然后进行读fifo。
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
#define rdempty GpioDataRegs.GPADAT.bit.GPIO21// input
#define wrempty GpioDataRegs.GPADAT.bit.GPIO23
#define wrfull GpioDataRegs.GPADAT.bit.GPIO26
#define rdreq GpioDataRegs.GPADAT.bit.GPIO22//output
#define wrreq GpioDataRegs.GPADAT.bit.GPIO24
#define DSP_nrst GpioDataRegs.GPADAT.bit.GPIO25
#define DSP_START GpioDataRegs.GPADAT.bit.GPIO27
Uint16 *ExRamStart = (Uint16 *)0x100000;
Uint16 adc1[100];
Uint16 IntReg[100];
void configGPIO(void);
void DELAY(Uint16 TIM);
interrupt void xint1_isr(void);
interrupt void xint2_isr(void);
void main(void)
{
Uint16 i;
InitSysCtrl();
DINT;
InitPieCtrl();
// Disable CPU interrupts and clear all CPU interrupt flags:
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
InitXintf16Gpio(); //zq
// MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
// InitFlash();
EALLOW; // PieVectTable.ECAN0INTA = &ECAN0INT_isr; PieVectTable.XINT1 = &xint1_isr; PieVectTable.XINT2 = &xint2_isr; EDIS;
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; PieCtrlRegs.PIEIER9.bit.INTx5=1; // PIE Group 9,can int5接收中断
PieCtrlRegs.PIEIER1.bit.INTx4 = 1; // Enable PIE Gropu 1 INT4 xint1 PieCtrlRegs.PIEIER1.bit.INTx5 = 1; // Enable PIE Gropu 1 INT4 xint2 IER|=0x101; // Enable CPU group INT1 and 9 EINT; //开全局中断
InitECanaGpio();
InitECana();
// ECanConfig();
configGPIO();
DisableDog();
/*set rdempty(gpio 21) as xint1, wrfull(gpio 26) as xint2*/
/* EALLOW;
GpioCtrlRegs.GPAQSEL1.bit.GPIO20 = 2; // XINT1 Qual using 6 samples
GpioCtrlRegs.GPAQSEL2.bit.GPIO26 = 2; // XINT2 Qual using 6 samples
GpioCtrlRegs.GPACTRL.bit.QUALPRD0 = 0x80; // Each sampling window is 128*SYSCLKOUT EDIS;
*/
// GPIO21 is XINT1, GPIO26 is XINT2
EALLOW;
GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 21; // Xint1 is GPI21
GpioIntRegs.GPIOXINT2SEL.bit.GPIOSEL = 26; // XINT2 is GPIO26
EDIS;
// Configure XINT1,2
XIntruptRegs.XINT1CR.bit.POLARITY = 1; // Rising edge interrupt
XIntruptRegs.XINT2CR.bit.POLARITY = 1; // Rising edge interrupt
// disable XINT1 and XINT2 XIntruptRegs.XINT1CR.bit.ENABLE = 0; // disable Xint1
XIntruptRegs.XINT2CR.bit.ENABLE = 0; // disable XINT2
for(i=0;i<100;i++)
{
adc1[i]=0;
}
DSP_START=1;
DELAY(1);
DSP_nrst=1;
DELAY(2);
DSP_nrst=0;
DELAY(2);
DSP_nrst=1;
DELAY(20);// wait for fpga pll initialize
wrreq=1;
// enable XINT1 and XINT2 XIntruptRegs.XINT1CR.bit.ENABLE = 1; // enable Xint1
XIntruptRegs.XINT2CR.bit.ENABLE = 1; // enable XINT2
for(;;)
{
}
}
//===========================================================================
// No more.
//===========================================================================
interrupt void xint1_isr(void)//rdempty
{
rdreq=0;
wrreq=1;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
interrupt void xint2_isr(void)//wrfull{Uint16 i;
wrreq=0;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
for(i=0;i<100;i++)
IntReg[i]=*(ExRamStart+i);
}
void configGPIO(void)
{
EALLOW;
/*LED*/
GpioCtrlRegs.GPAMUX1.bit.GPIO10 = 0; // gpio GpioCtrlRegs.GPADIR.bit.GPIO10 = 1; //output
GpioCtrlRegs.GPAMUX1.bit.GPIO11 = 0; // gpio
GpioCtrlRegs.GPADIR.bit.GPIO11 = 1; //output
/*rdempty , wrempty, wrfull */
GpioCtrlRegs.GPAMUX2.bit.GPIO21 = 0; // gpio
GpioCtrlRegs.GPADIR.bit.GPIO21 = 0; //input GpioCtrlRegs.GPAMUX2.bit.GPIO23 = 0; // gpio
GpioCtrlRegs.GPADIR.bit.GPIO23 = 0; //input
GpioCtrlRegs.GPAMUX2.bit.GPIO26 = 0; // gpio
GpioCtrlRegs.GPADIR.bit.GPIO26 = 0; //input
/*rrreq,wrreq,DSP_nrst,DSP_start */
GpioCtrlRegs.GPAMUX2.bit.GPIO22 = 0; // gpio
GpioCtrlRegs.GPADIR.bit.GPIO22 = 1; //output
GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 0; // gpio
GpioCtrlRegs.GPADIR.bit.GPIO24 = 1; //output
GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 0; // gpio
GpioCtrlRegs.GPADIR.bit.GPIO25 = 1; //output
GpioCtrlRegs.GPAMUX2.bit.GPIO27 = 0; // gpio
GpioCtrlRegs.GPADIR.bit.GPIO27 = 1; //output
EDIS;
}
void DELAY(Uint16 TIM)
{
DELAY_US(TIM);
ServiceDog();
}
Eric Ma:
1,初始化的时候,先关看门狗试试。
2. 你这程序应该是跑在RAM吧?看你把memcpy和initflash注释掉,如果跑在flash,memcpy等要调用。
3. 你单步跑一下,看刚好是哪句代码导致跑飞。
ERIC
TI中文支持网

