Part Number:PROCESSOR-SDK-OMAPL138
大佬们:帮忙分析一下
根据之前帖的描述,在USB中断里面加一些调试信息会出现死机的现象。现在找到原因是串口调试用的是中断输出方式,只要串口调试改成查询方式就可以正常在USB中断进行打印输出 了。
但现在出现的问题是USB中断一直没有产生USB 端点0的中断,即没有跑如下代码:
/* Handle end point 0 interrupts. */
if(musb->epIrqStatus & USB_INTEP_0)
{
debug_printf("USB_INTEP_0 \n");
debug_printf(".\n");
musb->ulUSBEP0IntCount++;
usbMusbDcdEp0EvntHandler(musb);
}
只产生了USB reset的中断,好像产生了4次, 即如下代码:
/* Received a reset from the host. */
if(ulStatus & USB_INTCTRL_RESET)
{
debug_printf(".\n");
musb->ulUSBRstCount++;
usbMusbDcdRstEvntHandler(musb);
return 0;
}
现在找到原因是没有产生USB 端点 0的中断, 所以就出USB设备无法适别,没有枚举过程
各们TI的大佬们麻烦你们帮忙分析一下原因!
谢谢了!
Nancy Wang:
请问是测试 USB_DevMsc_lcdkOMAPL138_armExampleProject 的吗?是否有做改动?
,
EricPengYong:
是这个工程,刚开始没有做任何改动是不行的,现在只做了while(1)循环下加了Task_sleep函数如下改动还是不行
Void taskFxn(UArg a0, UArg a1){ USB_Params usb_dev_params; USB_Handle usb_handle;
consolePrintf("\nRTOS USB Dev MSC example!!\n");
/* Initialize the RAMDisk */ RAMDISKUtilsInit((uint8_t *)gRamDisk, sizeof(gRamDisk)); formatRamDisk();
usb_dev_params.usbMode = USB_DEVICE_MSC_MODE; usb_dev_params.instanceNo = USB_DEV_INSTANCE; /* USB port # */ usb_dev_params.usbClassData = (void*)&g_sMSCDevice; usb_handle = USB_open(usb_dev_params.instanceNo, &usb_dev_params);
if (usb_handle == 0) { consolePrintf("Failed to open USB driver\n"); while(1); }
usbdIntrConfig(usb_handle, &usb_dev_params);
consolePrintf("Done configuring USB and its interrupt. Example is ready!\n");
while(1) { /* Main while loop. All USB dev events are handled in interrupt context */// System_printf("test——>1\n"); Task_sleep(100);// System_printf("test——>2\n"); Task_sleep(100); }
}
,
Nancy Wang:
我帮您升级到了英文论坛,会有相关专家给您提供支持。
e2e.ti.com/…/processor-sdk-omapl138-usb-dev-can-t-be-recognized
,
EricPengYong:
现在问题解决了,谢谢您(Nancy Wang)一直关注和提供帮助!
现将解决的问题分享给大家,希望能帮助到有需要的朋友们。
1. 在初始化的时候将USB 的两个寄存器设置一下:
// Interrupt Enable Register for INTRUSB (INTRUSBE)
HWREGB(0x01E00000u+0x40B) = 0xf7; // INTRUSBE reg
Power Management Register (POWER) Field Descriptions
HWREGB(0x01E00000u+0x401) = 0x41; // POWER reg
只要重新设置一下以上的两个寄存器后,USB端点0也产生了中断了,USB盘符也弹出来了。
2. 这两个寄存器代码实际加的位置在如下函数这里:
void USB_irqConfig_musb(USB_Handle handle, USB_Params* params){#if 1 // 在此位置设置了这两个寄存器的值HWREGB(0x01E00000u+0x40B) = 0xf7; // INTRUSBE regHWREGB(0x01E00000u+0x401) = 0x41; // POWER reg #endif
switch (params->usbMode) { case USB_HOST_MSC_MODE: /*usb_set_wrapper(params->instanceNo); */
break;
case USB_DEVICE_MSC_MODE: case USB_DEVICE_AC_MODE: /* Enable USB Interrupts. */ USBEnableOtgIntr(musbObj[params->instanceNo].uiSubBaseAddr);
USBIntEnableControl(musbObj[params->instanceNo].baseAddr, USB_INTCTRL_RESET | USB_INTCTRL_DISCONNECT | USB_INTCTRL_RESUME | USB_INTCTRL_SUSPEND | USB_INTCTRL_SOF);
USBIntEnableEndpoint(musbObj[params->instanceNo].baseAddr, USB_INTEP_ALL);
#ifdef DMA_MODE if (handle->handleCppiDmaInApp == FALSE) { USBDmaIntEnable(params); }#endif
break;
default: return; } }
3. 自己layout的板子说明:
自己画的板子,使用的是OMAPL132 晶振:19.2Mhz CPU主频为192Mhz
4. 原因分析:
会不会是USB走线的原因引起的,这个还有待后面的一些验证
5. 附上两个寄存器的说明: