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.

[参考译文] CCS/TMS570LC4357:在 TMS570LC43x Hercules 开发套件(HDK)中 DMA 软件未触发

Guru**** 2481985 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/698117/ccs-tms570lc4357-dma-sw-not-triggering-in-tms570lc43x-hercules-development-kit-hdk

器件型号:TMS570LC4357

工具/软件:Code Composer Studio

您好!

我们正在尝试使用 TMS570LC43x Hercules 开发套件(HDK)检查 DMA 功能。

使用硬件触发器的 MibSPI 和 SCI DMA 传输正在工作。 但使用软件触发器的 DMA 传输不起作用。

我们需要验证软件触发 DMA 和 DMA 链接功能。

我们用于测试该功能的代码已附加。

请帮帮我。

Thankse2e.ti.com/.../1222.dmaregister.txt

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好 Bijo、

    TMS570LC43x 器件的 DAM 具有两个主端口: Porta 和 PortB (每个64位宽)。 应使用提及要用于每个地址区域的端口的表来选择端口。

    根据我对代码的理解、您需要将数据从 L2 SRAM 的一个位置移动到 L2 SRAM 的另一个位置。  dmaCTRLPKT.PORTASGN 应为0x2而不是0x4。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Wang、

    感谢您的回复。 我们将 PORTASGN 更新为0x2、但仍然不会发生 DMA 传输。

    我要附加更新的代码和 DMA 寄存器值。

    您是否有任何示例代码来检查 DMA 链接功能? 我们主要尝试测试 DMA 链功能。

    谢谢。  

    e2e.ti.com/.../3527.dmreg.txt

    e2e.ti.com/.../0247.HL_5F00_sys_5F00_main.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好

    您能不能检查为什么会发生这种情况吗?链 DMA 是否有任何示例代码?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Wang、
    请提供 DMA 链接示例。

    谢谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、Bijo、

    CHCTRL 中的链位字段是下一个要触发的通道:1是 DMA_CH0、2是 DMA_CH1。 在您的设置中、应在通道8之后触发通道9。

    我将为您制定一个示例项目
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好 Bijo、

    以下代码经过测试、没有任何问题。  

    int main (空)

    /*用户代码开始(3)*/
    uint32 src0[transfer_size]={0x11111111、0x22222222、0x333333、0x444444、0x555555、 0x66666666、0x77777777、0x8888888888};
    uint32 src1[transfer_size]={0x99999999、0xaaaaaaaaaa、0xbbbbbbbb、0xcccccc、0xdddddddd、 0xeeeeee、0xffffffff、0x12345678};
    uint32 src2[transfer_size]={0x11223344、0x55667788、0x99aabbcc、0xddeeff00、0x12345678、 0x13579bdf、0x2468ace0、0x87654321};

    uint32 dest0[transfer_size]={0};
    uint32 dest1[transfer_size]={0};
    uint32 dest2[transfer_size]={0};

    /*启用 IRQ 中断*/
    _enable_IRQ ();
    dmaEnable();

    /*-配置 DMA 控制数据包*/
    G_dmaCTRLPKT.Sadd =(uint32_t) src0;/*源地址*
    G_dmaCTRLPKT.DADD =(uint32_t) dest0;/*目标地址;TG0的起始地址*/
    G_dmaCTRLPKT.CHCTRL = DMA_CH1 + 1;/*通道控制*
    G_dmaCTRLPKT.FRCNT = F_COUNT;/*帧计数*/
    G_dmaCTRLPKT.ELCNT = E_COUNT;/*元素计数*
    G_dmaCTRLPKT.ELDOFFSET = 0;/*元素目标偏移量*
    G_dmaCTRLPKT.ELSOFFSET = 0;/*元素目标偏移量*
    G_dmaCTRLPKT.FRDOFFSET = 0;/*帧目标偏移量*
    G_dmaCTRLPKT.FRSOFFSET = 0;/*帧目标偏移量*
    G_dmaCTRLPKT.PORTASGN = PORTA_READ_PORTA_WRITE;
    G_dmaCTRLPKT.RDSIZE = ACCESS_32_BIT;/*读取大小*
    G_dmaCTRLPKT.WRSIZE = ACCESS_32_BIT;/*写入大小*
    G_dmaCTRLPKT.tType = frame_transfer;/* transfer type *
    G_dmaCTRLPKT.ADDMODERD = ADDR_INC1;/*地址模式读取*
    G_dmaCTRLPKT.ADDMODEWR = ADDR_INC1;/*地址模式写入*
    G_dmaCTRLPKT.AUTOINIT = AUTOINIT_OFF;/*自动初始化*/

    //为接收设置 DMA 控制数据包
    dmaSetCtrlPacket (DMA_CH0、g_dmaCTRLPKT);

    /*-配置 DMA 控制数据包*/
    G_dmaCTRLPKT.Sadd =(uint32_t) src1;//源地址*
    G_dmaCTRLPKT.DADD =(uint32_t) dest1;/*目标地址;TG0的起始地址*/
    G_dmaCTRLPKT.CHCTRL = DMA_CH2 + 1;/*通道控制*
    G_dmaCTRLPKT.FRCNT = F_COUNT;/*帧计数*/
    G_dmaCTRLPKT.ELCNT = E_COUNT;/*元素计数*
    G_dmaCTRLPKT.ELDOFFSET = 0;/*元素目标偏移量*
    G_dmaCTRLPKT.ELSOFFSET = 0;/*元素目标偏移量*
    G_dmaCTRLPKT.FRDOFFSET = 0;/*帧目标偏移量*
    G_dmaCTRLPKT.FRSOFFSET = 0;/*帧目标偏移量*
    G_dmaCTRLPKT.PORTASGN = PORTA_READ_PORTA_WRITE;
    G_dmaCTRLPKT.RDSIZE = ACCESS_32_BIT;/*读取大小*
    G_dmaCTRLPKT.WRSIZE = ACCESS_32_BIT;/*写入大小*
    G_dmaCTRLPKT.tType = frame_transfer;/* transfer type *
    G_dmaCTRLPKT.ADDMODERD = ADDR_INC1;/*地址模式读取*
    G_dmaCTRLPKT.ADDMODEWR = ADDR_INC1;/*地址模式写入*
    G_dmaCTRLPKT.AUTOINIT = AUTOINIT_OFF;/*自动初始化*/

    //为接收设置 DMA 控制数据包
    dmaSetCtrlPacket (DMA_CH1、g_dmaCTRLPKT);

    /*-配置 DMA 控制数据包*/
    G_dmaCTRLPKT.Sadd =(uint32_t) src2;/*源地址*
    G_dmaCTRLPKT.DADD =(uint32_t) dest2;/*目标地址;TG0的起始地址*/
    G_dmaCTRLPKT.CHCTRL = 0;/*通道控制*/
    G_dmaCTRLPKT.FRCNT = F_COUNT;/*帧计数*/
    G_dmaCTRLPKT.ELCNT = E_COUNT;/*元素计数*
    G_dmaCTRLPKT.ELDOFFSET = 0;/*元素目标偏移量*
    G_dmaCTRLPKT.ELSOFFSET = 0;/*元素目标偏移量*
    G_dmaCTRLPKT.FRDOFFSET = 0;/*帧目标偏移量*
    G_dmaCTRLPKT.FRSOFFSET = 0;/*帧目标偏移量*
    G_dmaCTRLPKT.PORTASGN = PORTA_READ_PORTA_WRITE;
    G_dmaCTRLPKT.RDSIZE = ACCESS_32_BIT;/*读取大小*
    G_dmaCTRLPKT.WRSIZE = ACCESS_32_BIT;/*写入大小*
    G_dmaCTRLPKT.tType = frame_transfer;/* transfer type *
    G_dmaCTRLPKT.ADDMODERD = ADDR_INC1;/*地址模式读取*
    G_dmaCTRLPKT.ADDMODEWR = ADDR_INC1;/*地址模式写入*
    G_dmaCTRLPKT.AUTOINIT = AUTOINIT_OFF;/*自动初始化*/

    //为接收设置 DMA 控制数据包
    dmaSetCtrlPacket (dma_ch2、g_dmaCTRLPKT);

    dmaSetChEnable (DMA_CH0、DMA_SW);//启用 DMA 通道*
    dmaSetChEnable (DMA_CH1、DMA_HW);

    dmaSetChEnable (DMA_CH2、DMA_HW);

    while ((dmaREG->HWCHENAS & 0x07)!= 0x0);

    while (1);/*循环永远*/

    /*用户代码结束*/

    返回0;