This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

PROCESSOR-SDK-OMAPL138: omapl138 USB dev不能适别的问题

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的大佬们麻烦你们帮忙分析一下原因!

   谢谢了!

  • 请问是测试 USB_DevMsc_lcdkOMAPL138_armExampleProject 的吗?是否有做改动?

  • 是这个工程,刚开始没有做任何改动是不行的,现在只做了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);
    }

    }

  • 我帮您升级到了英文论坛,会有相关专家给您提供支持。

    e2e.ti.com/.../processor-sdk-omapl138-usb-dev-can-t-be-recognized

  • 现在问题解决了,谢谢您(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 reg
    HWREGB(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. 附上两个寄存器的说明: