阅读:1298回复: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 09:07
1,靠delay来等待寄存器读写完成很麻烦,你的5409应该有寄存器设置来使dsp在读写数据的时候自动等待,以满足1581 80ns的读写周期
2,清中断寄存器的时候是写1来清除某一位 3,初始化的时候要写模式寄存器(mode)、中断配置寄存器、中断使能寄存器和地址寄存器(要使能默认的地址0),其中在中断配置寄存器中中断的触发模式是可以设置的,要配置成和你的5409匹配的 在复位中断里上述寄存器设置要重新设置一下。 |
|
地板#
发布于: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 15:25
1,对于某个中断你只能清楚该位,不能把所有的都清了呀!只能处理什么中断清什么中断。
2,你初始化的时候没有使能默认的地址0,把中断配置寄存器(那个0x02)设置成0x62或者0x60试试, 3,你设置那个模式寄存器0x8C什么意思?,在设置softcnt之前之需要使能全局中断即可,即应该是0x08,设置softcnt时是0x09 4,你设置中断使能寄存器的方式好奇怪,就算你的数据总线是32位的,那16位的数据也应该是低16位呀,怎么跑到高16位上来? |
|
5楼#
发布于: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那个地址,我如果这样做,是不是就可以完成对中断是能寄存器的配置了,反正我的程序都是移植的,太多不规范的地方了,如果您有时间要是能给我看看就太好了!!! 再次感谢,这次不能给分了,我一会重开一个,给您分,多谢 |
|
6楼#
发布于:2004-07-16 09:14
1,你这样做是不是只清除掉了DSP中的中断标志位?其实按通常情况DSP中的中断位应该是自动清除的,你需要清楚的是ISP1581的中断标志位!也就是寄存器xx18和xx1a里的相应位,通常我们只用到低16位,可以对xx1a不予理会。清楚的方法是对该位写1
2, 7 to 6 CDBGMOD[1:0] Control 0 Debug Mode: values 5 to 4 DDBGMODIN[1:0] Data Debug Mode IN: 3 to 2 DDBGMODOUT[1:0] Data Debug Mode OUT: 1 INTLVL Interrupt Level: selects the signaling mode on output INT (0 = level, 1 = pulsed). In pulsed mode an interrupt produces a 60 ns pulse. Bus reset value: unchanged.//设置中断的触发模式,0电平触发,1脉冲触发,产生一个持续时间60ns的脉冲 0 INTPOL Interrupt Polarity: selects signal polarity on output INT (0 = active LOW, 1 = active HIGH). Bus reset value: unchanged.//设置中断的极性,0低电平有效,1高电平有效 Table 11: Debug mode settings Value CDBGMOD DDBGMODIN DDBGMODOUT 00H 对所有的ACK和NAK以及OUT中的NYET都产生中断 01H 对所有的ACK和OUT中的NYET产生中断 1XH 对所有的ACK和第一个NAK以及OUT中的NYET产生中断 对于CONTROl中断,我们只对ACK产生中断(如果对NAK也产生中断,中断会很频繁,可能导致枚举失败) 对于IN中断,我们对所有的ACK和第一个NAK产生中断,这样一旦主机发送读数据请求,设备端就会产生第一个NAK中断,这比D12要好一些,这样我们就可以通过中断来判断什么时候发送数据了。但是这个第一个NAK指的是前一个ACK后的第一个NAK,因此如果你是对中断计数的话,每一个ACK后面都会有一个NAK中断没,这一点要注意。 对于OUT中断,我们只对ACK产生中断。否则会导致设备误动作。 |
|