您好,
我在实验F28069U的USB usb_dev_bulk程序,使用我自己做的板子。
当我使用MWare文件夹中 \MWare\tools\usb_bulk_example的程序实验时,工作正常,但是它的收发速率很低。
于是我修改了一下usb_bulk_example PC端程序,增加了收发数据的速度,想看一下通量,程序见附件。
结果发现程序运行不到1秒,板子的固件程序的USB端点中断已经进不去了,
即 f2806x_USB0DeviceIntHandler(void)不进端点中断,RxHandler就无法被调用,收发就停止了。
我发现此时main函数和SysTickIntHandler(void)还工作。
我修改了一下28069 USB的收发函数,采用轮训的方式,在main函数的while中加入了下面的轮训语句,结果PC又可以收发数据了,而且速度也还可以。
我还是想用中断来实现,使用TI给的框架,但我找不到USB端点中断进不去的原因。请求帮助。
我也希望TI能给一个更加实用的,高速率的usb device bulk程序例子,别使用USB.lib, 减少多余的代码,只保留DEV Bulk基本的代码。
MWare框架的USB.lib有点庞大,有点象MFC,找BUG有点麻烦。
整个main函数如下
////////////////
int uu = 0;
int rr = 0;
int
main(void)
{
unsigned long ulTxCount;
unsigned long ulRxCount;
//
// Set the clocking to run from the PLL
//
SysCtrlInit();
//
// Initialize interrupt controller and vector table
//
InitPieCtrl();
InitPieVectTable();
//
// Setup UART GPIOS and enable the UART.
//
EALLOW;
GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1;
GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0;
GpioCtrlRegs.GPAQSEL2.bit.GPIO28 = 3;
GpioCtrlRegs.GPADIR.bit.GPIO28 = 0;
GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1;
GpioCtrlRegs.GPAPUD.bit.GPIO29 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO29 = 1;
EDIS;
UARTStdioInit(0);
UARTprintf("\033[2JBulk device application\n");
//
// Not configured initially.
//
g_bUSBConfigured = false;
//
// Enable the system tick.
//
SysTickPeriodSet(SysCtlClockGet() / SYSTICKS_PER_SECOND);
SysTickIntEnable();
SysTickEnable();
//
// Register Interrupt Handlers
//
IntRegister(INT_TINT0, SysTickIntHandler);
IntRegister(INT_USB0, f2806x_USB0DeviceIntHandler);
IntMasterEnable();
//
// Initialize the transmit and receive buffers.
//
USBBufferInit(&g_sTxBuffer);
USBBufferInit(&g_sRxBuffer);
//
// Pass our device information to the USB library and place the device
// on the bus.
//
USBDBulkInit(0, &g_sBulkDevice);
//
// Wait for initial configuration to complete.
//
UARTprintf("Waiting for host…\n");
//
// Clear our local byte counters.
//
ulRxCount = 0;
ulTxCount = 0;
//
// Main application loop.
//
while(1)
{
//我加入的轮训语句起点,主要想确认是USB硬核死了还是软件出了问题,结果发现硬核没死,
//我跟踪进入USB.lib看是否是卡在什么地方,发现是USB端点中断没有发生。
//我是新手,没有更多的经验查下去。我知道轮训也能办到,但用中断更理想。。
//我最终的目的是弄一个USB转Can的板子,有高的收发速度。但USB部分没有搞定。谢谢。
if(uu)
{
unsigned long ulEPStatus;
ulEPStatus = USBEndpointStatus(g_sBulkDevice.psPrivateBulkData->ulUSBBase,g_sBulkDevice.psPrivateBulkData->ucOUTEndpoint);
if(ulEPStatus & USB_DEV_RX_PKT_RDY)
USBDevEndpointDataAck(g_sBulkDevice.psPrivateBulkData->ulUSBBase,g_sBulkDevice.psPrivateBulkData->ucOUTEndpoint,
true);
}
if(rr)
{
long iRetcode = USBEndpointDataPut(g_sBulkDevice.psPrivateBulkData->ulUSBBase,
g_sBulkDevice.psPrivateBulkData->ucINEndpoint,g_pucUSBTxBuffer,64);
if(iRetcode == 0)
iRetcode = USBEndpointDataSend(g_sBulkDevice.psPrivateBulkData->ulUSBBase,
g_sBulkDevice.psPrivateBulkData->ucINEndpoint, USB_TRANS_IN);
}
//我加入的轮训语句终点
//
// See if any data has been transferred.
//
if(0)//((ulTxCount != g_ulTxCount) || (ulRxCount != g_ulRxCount))
{
//
// Take a snapshot of the latest transmit and receive counts.
//
ulTxCount = g_ulTxCount;
ulRxCount = g_ulRxCount;
//
// Update the display of bytes transferred.
//
UARTprintf("\rTx: %d Rx: %d", ulTxCount, ulRxCount);
}
}
}
yong yao:
没有使用外部晶体,使用内部时钟。USB频率是120M,芯片的频率是30M。
您好,
我在实验F28069U的USB usb_dev_bulk程序,使用我自己做的板子。
当我使用MWare文件夹中 \MWare\tools\usb_bulk_example的程序实验时,工作正常,但是它的收发速率很低。
于是我修改了一下usb_bulk_example PC端程序,增加了收发数据的速度,想看一下通量,程序见附件。
结果发现程序运行不到1秒,板子的固件程序的USB端点中断已经进不去了,
即 f2806x_USB0DeviceIntHandler(void)不进端点中断,RxHandler就无法被调用,收发就停止了。
我发现此时main函数和SysTickIntHandler(void)还工作。
我修改了一下28069 USB的收发函数,采用轮训的方式,在main函数的while中加入了下面的轮训语句,结果PC又可以收发数据了,而且速度也还可以。
我还是想用中断来实现,使用TI给的框架,但我找不到USB端点中断进不去的原因。请求帮助。
我也希望TI能给一个更加实用的,高速率的usb device bulk程序例子,别使用USB.lib, 减少多余的代码,只保留DEV Bulk基本的代码。
MWare框架的USB.lib有点庞大,有点象MFC,找BUG有点麻烦。
整个main函数如下
////////////////
int uu = 0;
int rr = 0;
int
main(void)
{
unsigned long ulTxCount;
unsigned long ulRxCount;
//
// Set the clocking to run from the PLL
//
SysCtrlInit();
//
// Initialize interrupt controller and vector table
//
InitPieCtrl();
InitPieVectTable();
//
// Setup UART GPIOS and enable the UART.
//
EALLOW;
GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1;
GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0;
GpioCtrlRegs.GPAQSEL2.bit.GPIO28 = 3;
GpioCtrlRegs.GPADIR.bit.GPIO28 = 0;
GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1;
GpioCtrlRegs.GPAPUD.bit.GPIO29 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO29 = 1;
EDIS;
UARTStdioInit(0);
UARTprintf("\033[2JBulk device application\n");
//
// Not configured initially.
//
g_bUSBConfigured = false;
//
// Enable the system tick.
//
SysTickPeriodSet(SysCtlClockGet() / SYSTICKS_PER_SECOND);
SysTickIntEnable();
SysTickEnable();
//
// Register Interrupt Handlers
//
IntRegister(INT_TINT0, SysTickIntHandler);
IntRegister(INT_USB0, f2806x_USB0DeviceIntHandler);
IntMasterEnable();
//
// Initialize the transmit and receive buffers.
//
USBBufferInit(&g_sTxBuffer);
USBBufferInit(&g_sRxBuffer);
//
// Pass our device information to the USB library and place the device
// on the bus.
//
USBDBulkInit(0, &g_sBulkDevice);
//
// Wait for initial configuration to complete.
//
UARTprintf("Waiting for host…\n");
//
// Clear our local byte counters.
//
ulRxCount = 0;
ulTxCount = 0;
//
// Main application loop.
//
while(1)
{
//我加入的轮训语句起点,主要想确认是USB硬核死了还是软件出了问题,结果发现硬核没死,
//我跟踪进入USB.lib看是否是卡在什么地方,发现是USB端点中断没有发生。
//我是新手,没有更多的经验查下去。我知道轮训也能办到,但用中断更理想。。
//我最终的目的是弄一个USB转Can的板子,有高的收发速度。但USB部分没有搞定。谢谢。
if(uu)
{
unsigned long ulEPStatus;
ulEPStatus = USBEndpointStatus(g_sBulkDevice.psPrivateBulkData->ulUSBBase,g_sBulkDevice.psPrivateBulkData->ucOUTEndpoint);
if(ulEPStatus & USB_DEV_RX_PKT_RDY)
USBDevEndpointDataAck(g_sBulkDevice.psPrivateBulkData->ulUSBBase,g_sBulkDevice.psPrivateBulkData->ucOUTEndpoint,
true);
}
if(rr)
{
long iRetcode = USBEndpointDataPut(g_sBulkDevice.psPrivateBulkData->ulUSBBase,
g_sBulkDevice.psPrivateBulkData->ucINEndpoint,g_pucUSBTxBuffer,64);
if(iRetcode == 0)
iRetcode = USBEndpointDataSend(g_sBulkDevice.psPrivateBulkData->ulUSBBase,
g_sBulkDevice.psPrivateBulkData->ucINEndpoint, USB_TRANS_IN);
}
//我加入的轮训语句终点
//
// See if any data has been transferred.
//
if(0)//((ulTxCount != g_ulTxCount) || (ulRxCount != g_ulRxCount))
{
//
// Take a snapshot of the latest transmit and receive counts.
//
ulTxCount = g_ulTxCount;
ulRxCount = g_ulRxCount;
//
// Update the display of bytes transferred.
//
UARTprintf("\rTx: %d Rx: %d", ulTxCount, ulRxCount);
}
}
}
yong yao:
回复 yong yao:
跟踪发现,如果在USB中断中的停留时间超过几百个CLK,USB的中断就全没了。当数通量大了之后,RxHandler中的代码浪费了时间,接近1000个clk,出现中断消失。不知道更进一步的原因。
不知道USB中断执行时间过长就导致中断消失是否合理。