阅读:1681回复:7
熟悉USBN9604的请进啊!
我用的是FPGA+USBN9604,参考着NS的源码写好初始化过程之后,发现只收到ALT中断,而且ALT中断里全部是RESET和WKUP事件,这样的话枚举根本无法进行下去。下面是我的初始化和对RESET和WKUP事件的处理过程,帮忙看看吧!
初始化: //设置MCNTRL //INT_H_P | VGE->MCNTRL 设置中断高电平有效及电压 //屏蔽所有USB中断 //0->MAMSK 设置屏蔽所有USB中断 //开放FIFO0 OUT的NAK中断 //NAK_OUT0->NAKMSK 设置开放FIFO0 OUT的NAK中断 //开放FIFO0 tx中断和tx FIFO1中断 //TX_FIFO0|TX_FIFO1->TXMSK 设置开放FIFO0 tx中断和tx FIFO1中断 //开放FIFO0 rx中断和rx FIFO1中断 //RX_FIFO0|RX_FIFO1->RXMSK 设置开放FIFO0 rx中断和rx FIFO1中断 //开放ALT中断中的SD3和RESET //ALT_SD3|ALT_RESET->ALTMSK 设置开放SD3和RESET中断 //开放总中断、RX_EV、NAK、TX_EV和ALT中断 //INTR_E|RX_EV|NAK|TX_EV|ALT->MAMSK 设置开放上述中断 reset_usb(); //写入NodeOperational状态 //NodeOperational->NFSR设置状态 //ATTACH_NODE 其中reset_usb(): //开放USB设备初始地址 //AD_EN->FAR 设置开放地址 FLUSHTX0 //ep0 FLUSHTX1 //ep1 FLUSHRX0 //ep0 FLUSHRX1 //ep2 //开放RX0接收 //RX_EN->RXC0寄存器 ALT_RESET: CLEAR_STALL_EP0; GOTO_STATE(RST_ST); write_usb(FAR,AD_EN+0); write_usb(EPC0, 0x00); SET_USB_DEVICE_ADDRESS; USB_DEVICE_ADDRESS_ENABLE; FLUSHTX0; FLUSHTX1; FLUSHRX0; FLUSHRX1; ENABLE_RX0; GOTO_STATE(OPR_ST); ALT_WKUP: 清除WKUP里的PNDUC和PNDUSB |
|
沙发#
发布于:2004-05-31 16:00
自己顶,以防沉了
|
|
板凳#
发布于:2004-06-01 11:40
下面是我的程序中用到的程序,你参考看看,下面的程序是成功的。
WriteUsb(uALTMSK, uALT_SD3|uALT_RESET);/*该语句在usbn9603_init中,用于打开alt中断的屏蔽,我只开了sd3和reset,建议你不要开wakeup中断*/ 下面的函数是ALT中断的处理程序,和你的稍有不同,看看对你有没有帮助: void USBN9603_alt_event_handler(void) { char altev_value = 0; char altev_mask = 0x01; // char test = 0; // test = ReadUsb(uALTMSK); altev_value = ReadUsb(uALTEV); // Uart_Printf(\"in alt event\\n\",0); while(altev_value) { switch(altev_value & altev_mask) { case uALT_RESET: //Uart_Printf(\"in alt reset \\n\",0); WriteUsb(uEPC0, ReadUsb(uEPC0)&~uSTALL); WriteUsb(uNFSR, uRST_ST); //go to reset stat WriteUsb(uFAR, uAD_EN + 0); //set default address //enable epc0 only WriteUsb(uEPC0, 0x00); //reset usb reset_usb(); usb_device_reset(); //go to normal stat //WriteUsb(uALTMSK, uALT_SD3|uALT_RESET); WriteUsb(uNFSR, uOPER_ST); break; case uALT_SD3: case uALT_SD5: //Uart_Printf(\"in alt sd3\\n\",0); WriteUsb(uALTMSK, uALT_SD3|uALT_RESET|uALT_RESUME); WriteUsb(uNFSR, uSUS_ST); break; case uALT_RESUME: //Uart_Printf(\"in alt resume\\n\",0); WriteUsb(uALTMSK, uALT_SD3|uALT_RESET); WriteUsb(uNFSR, uOPER_ST); WriteUsb(uRXC0,uRX_EN); break; case uALT_EOP: // Uart_Printf(\"in alt eop\\n\",0); break; case uALT_WKUP: // Uart_Printf(\"in alt wkup \\n\",0); // WriteUsb(uWKUP,ReadUsb(uWKUP)&0xfc); break; default: // Uart_Printf(\"in alt default\\n\",0); break; } //end switch altev_value &= ~altev_mask; altev_mask = altev_mask << 1; } //end while; }//end alt |
|
地板#
发布于:2004-06-01 13:55
你贴的就是NS的demo程序吧,我的程序就是参考着NS的demo来的,只不过我没有把ALT中断里的RESUME和SD3/SD5处理过程贴上来,因为我收到的ALT中断里只有RESET和WKUP事件,而且我在初始化ALT的时候只开放了RESET和SD3事件,WKUP事件我没有打开,但是还是收到了。唯一不同的是usb_device_reset();这个函数看起来不是对9604的寄存器操作的,所以我就没有做,这应该没什么影响吧。
|
|
地下室#
发布于:2004-06-02 21:26
顶啊顶,千万不要沉了,已经在这个问题上卡了很久了...
|
|
5楼#
发布于:2004-06-03 14:35
高手们帮忙啊!
|
|
6楼#
发布于:2004-07-14 14:37
我可以更你讨论一下,不过我的情况和你不同。
|
|
7楼#
发布于:2004-10-20 16:59
请问楼上的各位大侠,我以前做的是D12的上层Demo软件,我现在想用USBN9604,该怎样写Demo.两者差别大吗?哪里能找到USBN9604的上层例程,多谢
|
|