TMS320C5515: CSL_USB_MSC_dmaExample例程下载到开发板上无法运行

Part Number: TMS320C5515

我将通过hex55.exe生成的CSL_USB_MSC_dmaExample_Out.bin文件通programmer_c5515evm_ccs4程序下载到以tms320c5515芯片为处理器的控制板上的IIC EEprom上程序无法按照逻辑运行,但是debug调试却可以正常运行。我还尝试了CSL_UART_IntExample例程,将这个例程的bin文件下载进去便可以正常运行。这是什么原因呢?下面是我尝试的两个例程链接
https://github.com/xuk5682-gif/USBMSC_DMAexample-UART_Intexample.git

image.png

  • 您好,收到了您的案例,调查需要些时间,感您的耐心等待。

  •  我按照这个方法试了一下,但我还是没有成功。我的代码如下:

    void HWI_unused(void)
    {
    /* minimal ISR stub: return immediately */
    asm(" NOP");
    return;
    }
    void early_hardware_and_interrupt_init(void)
    {
    /* 1) Configure ICR (address 0x0001) and execute IDLE to make configuration take effect */
    *(volatile ioport Uint16 *)0x0001 = 0x020E;
    asm(" idle");

    /* 2) Register HWI using BIOS API (Hwi_create). This preserves dispatcher behavior
    * equivalent to useDispatcher=1 in the .tcf configuration.
    */
    {

    /* Use DSP/BIOS HWI API to plug handlers and set per-HWI attributes
    * to match the .tcf configuration (ier0/ier1 masks).
    */
    HWI_Attrs attrs;

    /* INT5 (vector 5) : mmcsd0_isr, IER0 mask 0x0020 */
    attrs = HWI_ATTRS;
    attrs.ier0mask = 0x0020;
    attrs.ier1mask = 0x0000;
    HWI_dispatchPlug(5, (Fxn)mmcsd0_isr, &attrs);

    /* INT7 (vector 7) : mmcsd0_isr, IER0 mask 0x0080 */
    attrs = HWI_ATTRS;
    attrs.ier0mask = 0x0080;
    attrs.ier1mask = 0x0000;
    HWI_dispatchPlug(7, (Fxn)mmcsd0_isr, &attrs);

    /* INT8 (vector 8) : dma_isr, IER0 mask 0x0100 */
    attrs = HWI_ATTRS;
    attrs.ier0mask = 0x0100;
    attrs.ier1mask = 0x0000;
    HWI_dispatchPlug(8, (Fxn)dma_isr, &attrs);

    /* INT9 (vector 9) : mmcsd0_isr, IER0 mask 0x0020 */
    attrs = HWI_ATTRS;
    attrs.ier0mask = 0x0020;
    attrs.ier1mask = 0x0000;
    HWI_dispatchPlug(9, (Fxn)mmcsd0_isr, &attrs);

    /* INT12: unused stub (keep default attrs) */
    attrs = HWI_ATTRS;
    HWI_dispatchPlug(12, (Fxn)HWI_unused, &attrs);

    /* INT20 (vector 20) : USB ISR, IER1 mask 0x0010 */
    attrs = HWI_ATTRS;
    attrs.ier0mask = 0x0000;
    attrs.ier1mask = 0x0010;
    HWI_dispatchPlug(20, (Fxn)USBisr, &attrs);

    }
    /* 3) Clear IFR groups (clear pending flags) */
    CSL_CPU_REGS->IFR1 = 0x0;


    /* 4) Enable required IER bits (example: enable USB CPU interrupt) */
    CSL_FINST(CSL_CPU_REGS->IER1, CPU_IER1_RCV3, ENABLE);
    CSL_FINST(CSL_CPU_REGS->IER1, CPU_IER1_XMT3, ENABLE);
    CSL_FINST(CSL_CPU_REGS->IER1, CPU_IER1_USB, ENABLE);

    /* Note: enable additional IER bits for MMC/SD/DMA if required.
    * If using BIOS, consider using BIOS HWI_create instead of direct vector writes.
    */
    }我把他们封装进了一个函数里,并在main.c的开头使用。
    我对tcf文件做了一些更改:
    1.删除掉了TSK_MUSBMainTask 和 TSK_MUSBMSCTask 任务创建,因为我想动态创建usb任务。

    2.按照上述帖子中的更改方式,注释掉了中断的设置。因此结果如下:

    utils.loadPlatform("ti.platforms.evm5505");

    /* The following DSP/BIOS Features are enabled. */
    bios.enableRealTimeAnalysis(prog);
    bios.enableTskManager(prog);

    bios.GBL.MEMORYMODEL = "LARGE";
    bios.MEM.NOMEMORYHEAPS = 0;
    bios.MEM.ARGSSEG = prog.get("SARAM");
    bios.MEM.STACKSEG = prog.get("SARAM");
    bios.MEM.BSSSEG = prog.get("SARAM");
    bios.MEM.CONSTSEG = prog.get("SARAM");
    bios.MEM.DATASEG = prog.get("SARAM");
    bios.MEM.CIOSEG = prog.get("SARAM");
    bios.MEM.instance("SARAM").createHeap = 1;
    bios.MEM.BIOSOBJSEG = prog.get("SARAM");
    bios.MEM.MALLOCSEG = prog.get("SARAM");
    bios.MEM.SYSDATASEG = prog.get("SARAM");
    bios.MEM.OBJSEG = prog.get("SARAM");

    bios.PRD.USECLK = 0;
    bios.CLK.ENABLECLK = 0;
    bios.GBL.MODIFYCLKMD = 0;

    /* --- 已删除 TSK_MUSBMainTask 和 TSK_MUSBMSCTask 任务创建 --- */

    bios.TSK.create("mainTsk");
    bios.TSK.instance("mainTsk").order = 1;
    bios.TSK.instance("mainTsk").priority = 7;
    bios.TSK.instance("mainTsk").priority = 1;
    bios.TSK.instance("mainTsk").stackSize = 2048;
    bios.TSK.instance("mainTsk").stackSize = 4096;
    bios.TSK.instance("mainTsk").stackMemSeg = prog.get("SARAM");
    bios.TSK.instance("TSK_idle").order = 1;
    bios.TSK.instance("mainTsk").order = 2;
    bios.TSK.instance("mainTsk").priority = 10;

    /* 恢复 USB 相关通信对象定义,确保 Linker 不报错 */
    bios.SEM.create("SEM_MUSBMainTaskExited");
    bios.SEM.create("SEM_AbortTransferDone");
    bios.SEM.create("SEM_ConnectDeviceDone");
    bios.SEM.create("SEM_ResetDeviceDone");
    bios.SEM.create("SEM_MUSBDMARxComplete");
    bios.SEM.create("SEM_MUSBDMATxComplete");
    bios.SEM.OBJMEMSEG = prog.get("SARAM");
    bios.SEM.create("SEM_ClearEndpointStalltDone");
    bios.MBX.create("MBX_musb");
    bios.MBX.instance("MBX_musb").messageSize = 2;
    bios.MBX.instance("MBX_musb").length = 16;
    bios.MBX.instance("MBX_musb").elementSeg = prog.get("SARAM");
    bios.MBX.create("MBX_msc");
    bios.MBX.instance("MBX_msc").elementSeg = prog.get("SARAM");
    bios.MBX.instance("MBX_msc").messageSize = 2;
    bios.MBX.instance("MBX_msc").length = 16;
    bios.SEM.create("SEM_MUSBMSCTaskExited");
    bios.SEM.create("SEM_DisconnectDeviceDone");
    //bios.HWI.instance("HWI_INT20").fxn = prog.extern("USBisr");
    //bios.HWI.instance("HWI_INT20").useDispatcher = 1;
    bios.MEM.STACKSIZE = 0x0800;
    bios.MEM.SYSSTACKSIZE = 0x0200;
    bios.TSK.OBJMEMSEG = prog.get("SARAM");
    bios.TSK.STACKSEG = prog.get("SARAM");
    bios.TSK.STACKSIZE = 2048;
    bios.TSK.SYSSTACKSIZE = 2048;
    bios.TSK.instance("TSK_idle").stackMemSeg = prog.get("SARAM");
    bios.TSK.STACKSIZE = 1024;
    bios.TSK.SYSSTACKSIZE = 256;
    bios.TSK.instance("TSK_idle").stackMemSeg = prog.get("DARAM");
    bios.TSK.instance("TSK_idle").stackMemSeg = prog.get("SARAM");
    bios.MEM.STACKSIZE = 0x1000;
    bios.MEM.SYSSTACKSIZE = 0x0400;
    bios.MEM.ARGSSIZE = 0x0040;
    bios.MEM.instance("SARAM").heapSize = 0x8000;
    bios.MEM.instance("SARAM").heapSize = 0x3f80;
    bios.MEM.STACKSIZE = 0x0800;
    bios.MEM.SYSSTACKSIZE = 0x0200;
    bios.SEM.create("SEM_I2cDevBusy");
    bios.SEM.instance("SEM_I2cDevBusy").count = 1;
    bios.MEM.instance("SARAM").len = 0x0001;
    bios.MEM.instance("VECT").base = 0x027e00;
    bios.MEM.instance("SARAM").len = 0x1fe00;
    bios.SEM.create("SEM_RTCAlarmOff");
    bios.SEM.create("SEM_mmcsd_dmaTransferDone");
    //bios.HWI.instance("HWI_INT5").fxn = prog.extern("mmcsd0_isr");
    //bios.HWI.instance("HWI_INT5").useDispatcher = 1;
    //bios.HWI.instance("HWI_INT7").fxn = prog.extern("mmcsd0_isr");
    //bios.HWI.instance("HWI_INT7").useDispatcher = 1;
    //bios.HWI.instance("HWI_INT8").fxn = prog.extern("dma_isr");
    //bios.HWI.instance("HWI_INT8").useDispatcher = 1;
    bios.SEM.instance("SEM_mmcsd_dmaTransferDone").comment = "semaphore posted after mmcsd dma transfer is complete";
    bios.TSK.instance("mainTsk").priority = 15;
    bios.TSK.instance("mainTsk").stackSize = 8192;
    bios.TSK.instance("mainTsk").sysStackSize = 512;
    bios.TSK.instance("mainTsk").sysStackSize = 1024;
    bios.TSK.instance("mainTsk").stackSize = 4096;
    bios.TSK.instance("mainTsk").sysStackSize = 256;
    bios.MEM.STACKSIZE = 0x1000;
    bios.MEM.STACKSIZE = 0x0800;
    bios.MEM.SYSSTACKSIZE = 0x0400;
    bios.TSK.instance("mainTsk").sysStackSize = 4096;
    bios.MEM.STACKSIZE = 0x4096;
    bios.TSK.instance("mainTsk").stackSize = 5120;
    bios.TSK.instance("mainTsk").stackSize = 8192;
    bios.TSK.instance("mainTsk").stackSize = 4096;
    bios.MEM.ARGSSEG = prog.get("DARAM");
    bios.MEM.GBLINITSEG = prog.get("DARAM");
    bios.MEM.TRCDATASEG = prog.get("DARAM");
    bios.MEM.SYSDATASEG = prog.get("DARAM");
    bios.MEM.OBJSEG = prog.get("DARAM");
    bios.MEM.STACKSEG = prog.get("DARAM");
    bios.MEM.BIOSSEG = prog.get("DARAM");
    bios.MEM.SYSINITSEG = prog.get("DARAM");
    bios.MEM.HWISEG = prog.get("DARAM");
    bios.MEM.instance("DARAM").createHeap = 1;
    bios.TSK.instance("mainTsk").stackMemSeg = prog.get("DARAM");
    bios.TSK.STACKSEG = prog.get("DARAM");
    bios.TSK.instance("TSK_idle").stackMemSeg = prog.get("DARAM");
    bios.TSK.instance("mainTsk").stackMemSeg = prog.get("SARAM");
    bios.TSK.instance("TSK_idle").stackMemSeg = prog.get("SARAM");
    bios.MEM.STACKSEG = prog.get("SARAM");
    bios.MEM.CINITSEG = prog.get("DARAM");
    bios.MEM.CONSTSEG = prog.get("SARAM");
    bios.MEM.CIOSEG = prog.get("SARAM");
    bios.MEM.SWITCHSEG = prog.get("DARAM");
    bios.SEM.OBJMEMSEG = prog.get("DARAM");
    bios.MBX.instance("MBX_msc").elementSeg = prog.get("DARAM");
    bios.MBX.instance("MBX_musb").elementSeg = prog.get("DARAM");
    bios.TSK.OBJMEMSEG = prog.get("DARAM");
    bios.TSK.instance("mainTsk").stackMemSeg = prog.get("DARAM");
    bios.TSK.instance("mainTsk").stackMemSeg = prog.get("SARAM");
    bios.MEM.instance("SARAM").heapSize = 0x3f00;
    bios.MEM.instance("SARAM").heapSize = 0x3f80;
    bios.MEM.CIOSEG = prog.get("DARAM");
    bios.MEM.PINITSEG = prog.get("DARAM");
    bios.MEM.BIOSOBJSEG = prog.get("DARAM");
    bios.MEM.MALLOCSEG = prog.get("DARAM");
    bios.MEM.instance("SARAM").heapSize = 0x396a;
    bios.MEM.instance("SARAM").heapSize = 0x3f80;
    bios.MEM.REUSECODESPACE = 0;
    //bios.HWI.instance("HWI_INT12").fxn = prog.extern("HWI_unused", "asm");
    //bios.HWI.instance("HWI_INT12").useDispatcher = 0;
    //bios.HWI.instance("HWI_INT9").fxn = prog.extern("mmcsd0_isr");
    //bios.HWI.instance("HWI_INT9").useDispatcher = 1;
    bios.MEM.STACKSIZE = 0x0400;
    bios.MEM.SYSSTACKSIZE = 0x0200;
    bios.MEM.TEXTSEG = prog.get("SARAM");

    // !GRAPHICAL_CONFIG_TOOL_SCRIPT_INSERT_POINT!
    prog.gen();
    main函数开头如下所示: 。我还是没有成功,您能帮我看看该如何配置吗?

  • 您好,    

        建议您测试一下 SPRC133 驱动程序或库 | 德州仪器 TI.com.cn最新版本中的示例。

  • c55_csl_3.08.01,我使用的是这个版本的驱动程序,我觉得我用的是最新的

  • e2echina.ti.com/.../evm5515-csl_usb_msc_dmaexample_out-bin 我按照整个链接中的帖子进行尝试,代码如下:

    void early_hardware_and_interrupt_init(void)
    {


    /* 2) Register HWI using BIOS API (Hwi_create). This preserves dispatcher behavior
    * equivalent to useDispatcher=1 in the .tcf configuration.
    */
    {
    // /* Use DSP/BIOS HWI API to plug handlers and set per-HWI attributes
    // * to match the .tcf configuration (ier0/ier1 masks).
    // */
    HWI_Attrs attrs;
    //
    // /* INT5 (vector 5) : mmcsd0_isr, IER0 mask 0x0020 */
    // attrs = HWI_ATTRS;
    // attrs.ier0mask = 0x0020;
    // attrs.ier1mask = 0x0000;
    // HWI_dispatchPlug(5, (Fxn)mmcsd0_isr, &attrs);
    //
    // /* INT7 (vector 7) : mmcsd0_isr, IER0 mask 0x0080 */
    // attrs = HWI_ATTRS;
    // attrs.ier0mask = 0x0080;
    // attrs.ier1mask = 0x0000;
    // HWI_dispatchPlug(7, (Fxn)mmcsd0_isr, &attrs);
    //
    // /* INT8 (vector 8) : dma_isr, IER0 mask 0x0100 */
    // attrs = HWI_ATTRS;
    // attrs.ier0mask = 0x0100;
    // attrs.ier1mask = 0x0000;
    // HWI_dispatchPlug(8, (Fxn)dma_isr, &attrs);
    //
    // /* INT9 (vector 9) : mmcsd0_isr, IER0 mask 0x0020 */
    // attrs = HWI_ATTRS;
    // attrs.ier0mask = 0x0020;
    // attrs.ier1mask = 0x0000;
    // HWI_dispatchPlug(9, (Fxn)mmcsd0_isr, &attrs);
    //
    // /* INT12: unused stub (keep default attrs) */
    // attrs = HWI_ATTRS;
    // HWI_dispatchPlug(12, (Fxn)HWI_unused, &attrs);
    //
    /* INT20 (vector 20) : USB ISR, IER1 mask 0x0010 */
    attrs = HWI_ATTRS;
    attrs.ier0mask = 0x0000;
    attrs.ier1mask = 0x0010;
    HWI_dispatchPlug(20, (Fxn)USBisr, &attrs);
    /* Map MMCSD/PROG events to mmcsd0_isr */
    IRQ_plug(PROG0_EVENT, mmcsd0_isr);
    IRQ_plug(PROG1_EVENT, mmcsd0_isr);
    IRQ_plug(PROG2_EVENT, mmcsd0_isr);

    /* Map DMA event to dma_isr (if used) */
    IRQ_plug(DMA_EVENT, dma_isr);

    // /* Map USB event to USBisr */
    // IRQ_plug(USB_EVENT, USBisr);

    /* Clear any pending flags for these events (safe to do here) */
    IRQ_clear(PROG0_EVENT);
    IRQ_clear(PROG1_EVENT);
    IRQ_clear(PROG2_EVENT);
    IRQ_clear(DMA_EVENT);
    // IRQ_clear(USB_EVENT);


    }
    // /* 3) Clear IFR groups (clear pending flags) */
    // CSL_CPU_REGS->IFR1 = 0x0;

    }
    在CSL_Status configDmaforMmcSd(void)  函数中使能了dma。



    main函数如下:



    用hex55生成bin文件以及下载方式如下所示:

    但是依然没有启动成功,

    下载成功后,重新上电重启,代码无任何运行,指示灯也不灭。

  • 另外  usb中断的使能方式不知道为啥不能用// IRQ_plug(USB_EVENT, USBisr);
    // IRQ_clear(USB_EVENT);
    // IRQ_enable(USB_EVENT); 这几个函数使能,我用他们使能debug调试无法启动usb,总是显示设备无法识别,只有用
    HWI_Attrs attrs;
    attrs = HWI_ATTRS;
    attrs.ier0mask = 0x0000;
    attrs.ier1mask = 0x0010;
    HWI_dispatchPlug(20, (Fxn)USBisr, &attrs);这种方式,才能使pc识别usb并打开文件,这是什么原因?

  • 可否有这方面的专家帮我解答一下问题?

  • 那能否回答一下这个问题:另外  usb中断的使能方式不知道为啥不能用// IRQ_plug(USB_EVENT, USBisr);
    // IRQ_clear(USB_EVENT);
    // IRQ_enable(USB_EVENT); 这几个函数使能,我用他们使能debug调试无法启动usb,总是显示设备无法识别,只有用
    HWI_Attrs attrs;
    attrs = HWI_ATTRS;
    attrs.ier0mask = 0x0000;
    attrs.ier1mask = 0x0010;
    HWI_dispatchPlug(20, (Fxn)USBisr, &attrs);这种方式,才能使pc识别usb并打开文件,这是什么原因?