Part Number:TMS320C6748
大家好:
我现在在调试USB CPPI DMA的驱动,主要实现的目标是进行超过4M,甚至更多数据的通讯,主要使用的是CDC设备总线和CPPI DMA,DMA使用的模式是Linux CDC模式,数据手册中有介绍RNDIS和Linux CDC进行数据通讯是一样的,唯一的不同点是Linux CDC模式进行数据通讯时数据长度没有满足64字节的倍数会发送一个字节为1,数据是0x00的数据包给PC端。
我现在遇到的问题是如果数据量超过4M后使用DMA发送回出现死机的现象,主要是卡在函数enableCoreTxDMA函数里面的while((HWREGH(usbInstance->usbBaseAddress + ulRegister) & 0x2) == 0x02);判断条件一直不能满足,导致会卡在里面,没有分析明白原因是什么,有调试过这方面的大神指点下,可能造成的原因是什么???
祝好!!!!!
Shine:
方便把相关代码贴出来吗?
,
L qh:
初始化CDC设备总线函数
void tpl_usb_cdc_init(void)
{
CacheEnableMAR((unsigned int)0xC0001000, (unsigned int)0x08000000);
CacheEnableMAR(L1DCFG_L1DMODE_32K | L1PCFG_L1PMODE_32K | L2CFG_L2MODE_256K);
USBBufferInit((tUSBBuffer *)&g_sRxBuffer);
USBDCDInit(USB_INSTANCE, (tUSBDCDCDevice *)*g_sCDCDevice);
Cppi41DmaInit(USB_INSTANCE, epInfo, NUMBER_OF_ENDPOINTS);
}
上面的函数时注册CDC设备总线的初始化函数,里面有DMA初始化操作,注册的DMA模式为Linux CDC,这里不贴出此部分配置。
下面的内容主要是在USB中断中处理的一些操作流程,只有部分代码内容:
for(j = 0; j < 16;j ++)
{
dataBuf = (unsigned char *)cppiDmaAllocnBuffer(2048);//申请DMA缓存
for(i = 0; i < 2048*1024; i++)
{
dataBuf [i] = (i + 1)%256;
}
doDmaTxTransfer(USB_INSTANCE, dataBuf , 2048*1024, g_sCDCDevice.psPrivateCDCSerData->ucBulkINEndpoint);
enableCoreTxDMA(USB_INSTANCE, g_sCDCDevice.psPrivateCDCSerData->ucBulkINEndpoint);//打开DMA通道
delay(0xFFFFFFFF);//加入延时让DMA数据发送完成
cppiDmaFreenBuffer((unsigned int *)dataBuf);//释放DMA缓存
disableCoreTxDMA(USB_INSTANCE, g_sCDCDevice.psPrivateCDCSerData->ucBulkINEndpoint);//关闭DMA通道
dmaTxCompletion(USB_INSTANCE, g_sCDCDevice.psPrivateCDCSerData->ucBulkINEndpoint);//队列发送完成,退出中断
}
上面的代码是实现的部分程序,主要是使用DMA发送超过4M的数据,目前在测试中发现使用DMA发送超过2M的数据就会出现崩溃的现象,如果使用循环的方式进行发送超过4M的数据,例如8M的数据缓存时,就会出现上述描述的死机现象!!!!
祝好!!!!
,
Shine:
请关注下面的帖子。https://www.ti2k.com/wp-content/uploads/ti2k/DeyiSupport_DSP_3784189
,
L qh:
您好:
我看了这个帖子,和我所遇到的问题是一样的,但是没有明确指出具体是什么原因导致?我想请问下是否有USB方面的专家可以咨询这个。
祝好!!!
,
Shine:
这是我把您的问题升级到e2e上,有专门产品线的工程师解答。
,
L qh:
您好:
谢谢您的帮助,希望可以将这个问题解决掉!!!
祝好!