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.

[参考译文] TMS320F28388D:DMA 访问暂停问题。

Guru**** 2524550 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1065297/tms320f28388d-dma-access-halt-issue

器件型号:TMS320F28388D

你(们)好  

目前、我遇到了 DMA 访问问题、

存储器访问期间始终会有200ns 的暂停时间、

我的程序从 EMIF CS2读取数据、并将数据写入内部 GS0。

下面显示的波形是信号 CS2。

那么、芯片设计是否能够在运行期间消除暂停?

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

    我要分享的更多信息:

    我的任务是使用 DMA CH1继续从外部 EMIF CS2读取512 16位数据、并将512 16位数据写入内部配置的 GS0 RAM。

    在代码中、禁用所有 INT、停止所有未使用的 DMA 通道。 GS0仅配置为 DMA 写入数据、外部 EMIF CS2仅配置 DMA 读取。 CPU 仅使用内部 RAM 和 ROM 进行操作。

    详细的 DMA 配置 如下所示。

    / /

    ramgs0:>RAMGS0,type=NOINIT
    ramgdma:> EMIF1_CS2n,type=NOINIT

    / /

    / /

    #pragma DATA_SECTION (sData、"ramgs0");//将 TX 数据映射到存储器
    #pragma DATA_SECTION (RDATA、"ramgdma");//将 RX 数据映射到存储器
    uint16_t sData[512];//发送数据缓冲区
    uint16_t RDATA[512];//接收数据缓冲器
    #define BURST 32 //将8写入寄存器以获得8的突发大小
    #define 传输16 //[(MEM_buffer_size/(burst)]

    / /


    dma_initController();
    DEVICE_DELAY_US (50000);
    const void * destAddr;
    const void *srcAddr;
    srcAddr =(const void *) RDATA;
    destAddr =(const void *) sData;

    //
    //配置 DMA CH6
    //
    dma_configAddresses (dma_ch1_base、destAddr、srcAddr);
    dma_configBurst (dma_ch1_base、burst、1、1);
    dma_configTransfer (dma_ch1_base、transfer、1、1);
    DMA_CONFIGMode (DMA_CH1_BASE、DMA_TRIGGER_SOFTWARE、DMA_CFG_OneShot_ENABLE);//DMA_CFG_OneShot_enable//DMA_CFG_OneShot_disable
    DMA_setEmulationMode (dma_emulation_free_run);//dma_emulation_stop//dma_emulation_free_run
    // dma_configWrap (dma_ch1_base、10、1、10、1);
    DMA_setPriorityMode (0);
    DMA_stopChannel (DMA_CH2_base);
    DMA_stopChannel (DMA_CH3_base);
    DMA_stopChannel (DMA_CH4_base);
    DMA_stopChannel (DMA_CH5_base);
    DMA_stopChannel (DMA_CH6_BASE);

    // dma_setInterruptMode (dma_ch1_base、dma_int_at_end);
    DMA_enableTrigger (DMA_CH1_base);

    示波器显示所有512数据都应传输完成、但在访问期间、每个数据都有大约200ns 的多次暂停。

    我意识到数据表中 DMA 状态图中有类型或停止点、但我已经尝试设置处理器的多个寄存器。 不奏效

    具有3个暂停的图片是从 CS2读取数据并写入 GS0

    6个暂停的画面是从 GS0读取数据并写入 CS2。

    感谢您的任何支持。

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

    您好!

    停止不应在 DMA 中由自身启动。 您能否尝试在 代码(EMIF 设置代码)中将 SDRAM_CR 寄存器中的 PD 位设置为"1"、并查看这是否会产生任何影响。

    此致、

    Vivek Singh

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

    谢谢 Vivek

    我在 EMIF1上使用 SRAM 设置、您能告诉我有关 PD 位的更多信息吗? 它的含义是什么?

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

    应关闭 SDRAM 逻辑电源。 只需尝试查看是否发出任何导致 DMA 访问停止的刷新命令。

    此致、

    Vivek Singh

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

    你(们)好、Vivek

    非常感谢您、在我使用命令"EMIF_enableSyncPowerDown (EMIF1_base);"之后、不再有停止。

    那么、根本原因是什么? 在我的程序中、我只启动 EMIF 上的 SRAM 控制寄存器。 或与 SDRAM 相关的寄存器保持默认值。

    因此、我想 EMIF 控制器应该对 HALT 进行三角处理。

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

    我刚刚从数据表中看到这个说明"即使未使用 SDRAM 接口、EMIF 也会刷新 SDRAM。 如果用户正在使用
    只有 ASRAM 接口、然后 SDRAM 刷新将影响 ASRAM 性能。 为避免这种情况、
    用户必须在 SDRAM_CR 寄存器(EMif1Regs.SDRAM_CR.bit.PD=1)中设置 PD=1。 该位可以
    只有在没有挂起的 EMIF 访问时才会被更新。"

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

    是的、正确。 问题得到解决。

    此致、

    Vivek Singh