代码附在下面。 程序对UsbDevIntSt 进行分支处理,问题是在处理dma的时候不对,
if (ulDevIntState & USBINT_STATUS_DMA) 这句中USBINT_STATUS_DMA 属于 UsbIntSt 寄存器的位, 所以这里的条件就不对了。应该是ulIntState & USBINT_STATUS_DMA 才对,这里的ulIntState 指__USBIntSt (*(volatile unsigned long *)(0x400FC1C0))
是不是我看错了? Usb中断是不是需要清 UsbIntSt的位, Ep, UsbDevIntSt, UsbEotIntSt
手册上没说,zlg清了UsbDevIntSt
void usbDevException (void)
{
UINT32 ulDevIntState = 0;
UINT32 ulDevState = 0;
UINT32 ulDevInt=0;
bEPPflags.bits.in_isr = 1; /* 标识程序进入中断 */
ulDevIntState = (UINT32)__DevIntSt; /* 读设备中断状态寄存器 */
if (ulDevIntState & DEVINT_STATUS_DEVSTAT) {
ulDevState = __usbDevGetDevStatus();
if ((ulDevState & 0x10) != 0) {
__usbDevBusReset(); /* 总线复位处理 */
bEPPflags.bits.bus_reset = 1; /* 标识总线复位 */
}
if ((ulDevState & 0x08) != 0) {
bEPPflags.bits.suspend = 1; /* 标识总线挂起改变 */
}
if ((ulDevState & 0x02) != 0) {
bEPPflags.bits.con_change = 1; /* 标识总线连接改变 */
}
__DevIntClr = DevStatusInterrupt;
goto USB_ISR_EXIT; /* 退出中断服务程序 */
}
if (ulDevIntState & DEVINT_STATUS_EP_FAST) {
__usbDevEpIntHandler();
__DevIntClr = FASTINTERRUPT;
}
if (ulDevIntState & DEVINT_STATUS_EP_SLOW) {
__usbDevEpIntHandler();
__DevIntClr = SLOWINTERRUPT;
}
#if DMA_ENGINE_EN
if (ulDevIntState & USBINT_STATUS_DMA) {
usbDevDMAException();
}
#endif
USB_ISR_EXIT:
bEPPflags.bits.in_isr = 0; /* 标识程序退出中断 */
} |