This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS320C6748: 关于TMS320C6748 USB驱动开启CPPI DMA发送数据超过4M数据出现死机的现象!!!!!!

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);判断条件一直不能满足,导致会卡在里面,没有分析明白原因是什么,有调试过这方面的大神指点下,可能造成的原因是什么???

祝好!!!!!

  • 方便把相关代码贴出来吗?

  • 初始化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的数据缓存时,就会出现上述描述的死机现象!!!!

    祝好!!!!

  • 请关注下面的帖子。
    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1023707/tms320c6748-linux-cdc-mdoe-can-t-send-data-larger-than-4m/3784189#3784189


  • 您好:

    我看了这个帖子,和我所遇到的问题是一样的,但是没有明确指出具体是什么原因导致?我想请问下是否有USB方面的专家可以咨询这个。

    祝好!!!

  • 这是我把您的问题升级到e2e上,有专门产品线的工程师解答。

  • 您好: 

           谢谢您的帮助,希望可以将这个问题解决掉!!!

    祝好!