LM3S9B92在之前的方案中MCU主频为50MHz,USB工作正常,新方案中MCU主频改为25Mhz,在拔插U盘时会出现死机的现象。
开始怀疑是驱动库的问题,将Stellaris升级为9107版本(之前版本为6075),程序无法编译,IDE为IAR5.5.
请帮忙看看是由什么造成的这种现象?有没有什么好的解决方法?
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;
}
}
}
}