TI中文支持网
TI专业的中文技术问题搜集分享网站

TMS320F28069U USB usb_dev_bulk 程序 通量测试问题

您好,
我在实验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中断执行时间过长就导致中断消失是否合理。

赞(0)
未经允许不得转载:TI中文支持网 » TMS320F28069U USB usb_dev_bulk 程序 通量测试问题
分享到: 更多 (0)