阅读:1307回复:6
这么晚上来,请教问题(ISP1581)高手请回答
我用的是ISP1581+5409,我是按照周立功的程序移植的,
上电后连接SOFTC,能够收到BUSRESET中断,在中断中void Int_Ext_0() { asm(" STM #0FFh,IFR"); //清除中断标识寄存器 D14_Cntrl_Reg.D14_INT.VALUE; //读取ISP1581中断寄存器 USB_Int_Flag.VALUE |=D14_Cntrl_Reg.D14_INT.VALUE; //回写ISP1581中断寄存器 D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE; //总线复位处理 if(USB_Int_Flag.BITS.RESET) { //清除总线复位中断位 USB_Int_Flag.BITS.RESET = 0; delay(10); //设置总线复位标志 Kernel_Flag.BITS.Bus_Reset = 1; delay(10); PIO_Count = 64; //切换到全速模式 Kernel_Flag.BITS.HS_FS_State = FULL_SPEED; //初始化ISP1581 Init_D14(); //设置softconnect D14_Cntrl_Reg.D14_MODE.BITS.SOFTCT = 1; delay(10); } } 中断中就做了这么多,然后就在也收不到中断了,有的时候看到DSP的IFR寄存器中还有中断产生,但是就怎么也不禁中断了,中断也是使能的,我看好像有些同行和我有些类是的问题,高手帮帮忙啊 还有就是我在设置ISP1581的某些寄存器时,比如 D14_Cntrl_Reg.D14_MODE.VALUE |= 0x8C; delay(15); 好像不加后面的delay(15)就不可以,是不是因为需要80ns的寻址周期啊?另外5409的编程需要注意什么问题啊?比如16位寻址的问题 问了这么多,20分太少了,我一定放分100,绝不食言 |
|
沙发#
发布于:2004-07-14 23:49
自己顶一下,高手们快来啊
|
|
板凳#
发布于:2004-07-15 15:04
1,靠delay来等待寄存器读写完成很麻烦,你的5409应该有寄存器设置来使dsp在读写数据的时候自动等待,以满足1581 80ns的读写周期 jinghuiren说得很对,1,5409有一个软件等待寄存器,我只是大概的设置了一下,使用delay是不太好,这点我马上改进 2,清除终端这个语句,我用的是asm(" STM #0FFh,IFR"); //清除中断标识寄存器,的确是写1来清除所有中断,您看看是不是对德阿, 3,初始化1581的寄存器好像我也成功了,不然也不会受到复位中断,是不是? 最后一句,您说的在复位中断中需要重新设置这些寄存器,我也作了,不知道这么设置对不对? void Init_D14(void) { //初始化ISP1581寄存器 Init_D14_SFR(); //初始化ISP1581端点 Init_Endpoint(); //初始化ISP1581工作标志寄存器 USB_Device.BITS.State = USB_Default; Device_Config_Value = 0; USB_Device.BITS.Alter_Interface = 0; USB_Device.BITS.Big_Endian = On; Kernel_Flag.BITS.Tx_Done = 0; } void Init_D14_SFR(void) { //enable Global Interrupt enable //enable soft connect and other feature //enable wakeup on chip select //disable soft connect //设置模式:时钟始终有效,全局中断使能,片选唤醒 D14_Cntrl_Reg.D14_MODE.VALUE |= 0x8C; //设置全部中断为模式1,电平触发,低电平有效 D14_Cntrl_Reg.D14_INT_CONFIG.VALUE = 0x02; //设置中断使能寄存器 //使用端点0和端点2 D14_Cntrl_Reg.D14_INT_ENABLE.VALUE = 0x39fd0000; } |
|
地板#
发布于:2004-07-15 16:22
1,对于某个中断你只能清楚该位,不能把所有的都清了呀!只能处理什么中断清什么中断。 这么快就回答了,您真负责,以前有问题没有习惯问,真该大家讨论阿, 1。您说得对,可以改成asm(" STM #01H,IFR ")因为我没有用到别的中断,所以图省事,得改 2,这这个寄存器,我只对后两位理解,我在实际中按照ZLG设置的为0X52,您帮我解释一下这个寄存器 3,这个我也是按照周立功的程序的,有的抄袭了,您说得也对, 4,至于这个是因为, typedef union INT_ENABLE { struct INT_ENABLE_BITS //符合DSP寻址要求 { u16 IEP2TX : 1; u16 IEP2RX : 1; u16 IEP1TX : 1; u16 IEP1RX : 1; u16 IEP0TX : 1; u16 IEP0RX : 1; u16 RESERVED2 : 1; u16 IEP0SETUP : 1; u16 RESERVED3 : 1; u16 IEDMA : 1; u16 IEHS_STA : 1; u16 IERESM : 1; u16 IESUSP : 1; u16 IEPSOF : 1; u16 IESOF : 1; u16 IERST : 1; //低位的 u16 RESERVED1 : 6; u16 IEP7TX : 1; u16 IEP7RX : 1; u16 IEP6TX : 1; u16 IEP6RX : 1; u16 IEP5TX : 1; u16 IEP5RX : 1; u16 IEP4TX : 1; u16 IEP4RX : 1; u16 IEP3TX : 1; u16 IEP3RX : 1; }BITS; u32 VALUE; }INT_ENABLE; 我是这样建立的结构,是一个32位的,然后将这个结构分配到DSP外部的0X8014H地址初,那么就是说低位的在14H,高位在15H ,我在软件仿真的时候事了一下,如果负值0x39fd0000的话,那么就是39FD在14H那个地址,0000在15H那个地址,我如果这样做,是不是就可以完成对中断是能寄存器的配置了,反正我的程序都是移植的,太多不规范的地方了,如果您有时间要是能给我看看就太好了!!! 再次感谢,这次不能给分了,我一会重开一个,给您分,多谢 |
|