LM3S9B92 USB问题



LM3S9B92在之前的方案中MCU主频为50MHz,USB工作正常,新方案中MCU主频改为25Mhz,在拔插U盘时会出现死机的现象。

开始怀疑是驱动库的问题,将Stellaris升级为9107版本(之前版本为6075),程序无法编译,IDE为IAR5.5.

请帮忙看看是由什么造成的这种现象?有没有什么好的解决方法?

  • 这是两个问题,分别解答如下:

    1. 主频从50M降到25M时插拔U盘时会死机。

    是否是你的9B92工作在USB MSC HOST/OTG模式,访问U盘? U盘拔掉时死机现象是特定出,还是偶尔出,概率有多大?

    当U盘拔掉时,你可以在USB中断和FaultISR中断向量设置断点,观察是否进入了USB中断还是FaultISR中断?如果是进入USB中断,你可以跟一下程序是死在什么地方?如果是FaultISR中断,你需要查明FaultISR的原因。进入FaultISR时,PC指针保存进入之前的位置,你可以查下程序在什么地方进入的FaultISR中断。

    另外提醒:

    USB模块要正常工作,系统频率要保持在20M以上。所以,首先你检查你的系统频率是否有设置错误。在USB工作时必须开始PLL功能,是否你直接使用了外部振荡器作为系统时钟,未使能PLL。

    2. Stellaris 升级为9107版本后不能编译通过。

     编译不能通过的原因是什么?编译不能通过时,编译器都要给出原因的,你可以一条一条对照原因去解决问题.有可能是两个版本的某些头文件换了位置造成的。

     

     

  • 您好:

              咨询下关于LM3S9B96 USB问题

              项目中想通过USB接口将PC上的数据复制到的SD卡中,参考的是例程是USB_DEV_MSC,PC上总是显示无法识别的USB设备,下面是我的初始化代码,其它部分同USB_DEV_MSC代码一样,麻烦帮忙看看,还有什么地方需要修改的

    int
    main(void)
    {
    tRectangle sRect;
    unsigned long ulRetcode;

    //
    // Set the clocking to run directly from the crystal.
    //
    SysCtlLDOSet(SYSCTL_LDO_2_75V);
    SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_OSC  | SYSCTL_OSC_MAIN |
    SYSCTL_XTAL_16MHZ);

    //
    // Set the device pinout appropriately for this board.
    //

    PinoutSet();
    /*
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
    GPIOPinConfigure(GPIO_PA6_USB0EPEN);
    GPIOPinConfigure(GPIO_PA7_USB0PFLT);
    GPIOPinTypeUSBDigital(USB0_BASE,GPIO_PA6_USB0EPEN | GPIO_PA7_USB0PFLT);
    */

    // 打开usb外设
    SysCtlPeripheralEnable(SYSCTL_PERIPH_USB0);
    SysCtlUSBPLLEnable(); // 打开USB主时钟
    USBIntStatusControl(USB0_BASE);
    USBIntStatusEndpoint(USB0_BASE);
    USBIntEnableControl(USB0_BASE,USB_INTCTRL_RESET | USB_INTCTRL_DISCONNECT |
    USB_INTCTRL_RESUME |
    USB_INTCTRL_SUSPEND |
    USB_INTCTRL_SOF);
    USBIntEnableEndpoint(USB0_BASE, USB_INTEP_ALL);
    USBDevDisconnect(USB0_BASE);
    SysCtlDelay(SysCtlClockGet()/30);
    USBDevConnect(USB0_BASE);
    IntEnable(INT_USB0);
    IntMasterEnable();
    //
    // Configure SysTick for a 100Hz interrupt. The FatFs driver wants a 10 ms
    // tick.
    //
    SysTickPeriodSet(SysCtlClockGet() / 100);
    SysTickEnable();
    SysTickIntEnable();

    //
    // Configure and enable uDMA
    //
    SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA);
    SysCtlDelay(10);
    uDMAControlBaseSet(&sDMAControlTable[0]);
    uDMAEnable();


    //
    // Initialize the display driver.
    //
    Kitronix320x240x16_SSD2119Init();

    //
    // Initialize the graphics context.
    //
    GrContextInit(&g_sContext, &g_sKitronix320x240x16_SSD2119);

    //
    // Fill the top 15 rows of the screen with blue to create the banner.
    //
    sRect.sXMin = 0;
    sRect.sYMin = 0;
    sRect.sXMax = GrContextDpyWidthGet(&g_sContext) - 1;
    sRect.sYMax = DISPLAY_BANNER_HEIGHT - 1;
    GrContextForegroundSet(&g_sContext, ClrDarkBlue);
    GrRectFill(&g_sContext, &sRect);

    //
    // Put a white box around the banner.
    //
    GrContextForegroundSet(&g_sContext, ClrWhite);
    GrRectDraw(&g_sContext, &sRect);

    //
    // Put the application name in the middle of the banner.
    //
    GrContextFontSet(&g_sContext, &g_sFontCm20);
    GrStringDrawCentered(&g_sContext, "usb-dev-msc", -1,
    GrContextDpyWidthGet(&g_sContext) / 2, 10, 0);

    //
    // Initialize the idle timeout and reset all flags.
    //
    g_ulIdleTimeout = 0;
    g_ulFlags = 0;

    //
    // Initialize the state to idle.
    //
    g_eMSCState = MSC_DEV_IDLE;

    //
    // Draw the status bar and set it to idle.
    //
    UpdateStatus("Idle", 1);

    //
    // Pass our device information to the USB library and place the device
    // on the bus.
    //
    USBDMSCInit(0, (tUSBDMSCDevice *)&g_sMSCDevice);

    //
    // Determine whether or not an SDCard is installed. If not, print a
    // warning and have the user install one and restart.
    //
    ulRetcode = disk_initialize(0);

    GrContextFontSet(&g_sContext, &g_sFontCmss24);
    if(ulRetcode != RES_OK)
    {

    GrStringDrawCentered(&g_sContext, "No SDCard Found", -1,
    GrContextDpyWidthGet(&g_sContext) / 2,
    (GrContextDpyHeightGet(&g_sContext) / 2) - 20, 0);
    GrContextFontSet(&g_sContext, &g_sFontCm20);
    GrStringDrawCentered(&g_sContext, "Please insert a card and restart.",
    -1, GrContextDpyWidthGet(&g_sContext) / 2,
    (GrContextDpyHeightGet(&g_sContext) / 2), 0);
    GrStringDrawCentered(&g_sContext, "Hot-plugging is not supported.",
    -1, GrContextDpyWidthGet(&g_sContext) / 2,
    (GrContextDpyHeightGet(&g_sContext) / 2) + 20, 0);
    }
    else
    {
    //BuzzerOperate(1000);
    GrStringDrawCentered(&g_sContext, "SDCard Found", -1,
    GrContextDpyWidthGet(&g_sContext) / 2,
    GrContextDpyHeightGet(&g_sContext) / 2, 0);
    }

    //
    // Drop into the main loop.
    //
    while(1)
    {
    switch(g_eMSCState)
    {
    case MSC_DEV_READ:
    {
    //
    // Update the screen if necessary.
    //
    if(g_ulFlags & FLAG_UPDATE_STATUS)
    {
    UpdateStatus("Reading", 0);
    g_ulFlags &= ~FLAG_UPDATE_STATUS;
    }

    //
    // If there is no activity then return to the idle state.
    //
    if(g_ulIdleTimeout == 0)
    {
    UpdateStatus("Idle ", 0);
    g_eMSCState = MSC_DEV_IDLE;
    }

    break;
    }
    case MSC_DEV_WRITE:
    {
    //
    // Update the screen if necessary.
    //
    if(g_ulFlags & FLAG_UPDATE_STATUS)
    {
    UpdateStatus("Writing", 0);
    g_ulFlags &= ~FLAG_UPDATE_STATUS;
    }

    //
    // If there is no activity then return to the idle state.
    //
    if(g_ulIdleTimeout == 0)
    {
    UpdateStatus("Idle ", 0);
    g_eMSCState = MSC_DEV_IDLE;
    }
    break;
    }
    case MSC_DEV_IDLE:
    default:
    {
    break;
    }
    }
    }
    }