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/RM57L843:EMIF 异步接口的 DMA 访问

Guru**** 2478765 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/680446/ccs-rm57l843-dma-access-for-emif-async-interface

器件型号:RM57L843

工具/软件:Code Composer Studio

您好!

我想对 EMIF 接口进行 DMA 访问。 我已将异步 DRAM 16位连接到 EMIF 引脚。 我不知道如何对 EMIF 引脚进行 DMA 访问。 您是否有用于 EMIF 异步访问的应用手册或示例代码?

BR

Marcel

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

    尊敬的 Marcel:

    我找不到使用 DMA 从外部 SRAM 复制数据的示例工程。

        DMA_CONFIG.Sadd =(uint32_t) 0x60000000;

    DMA_CONFIG.DADD =(uint32_t) 0x08002000;

    DMA_CONFIG.CHCTRL = 0;               

    DMA_CONFIG.FRCNT = 1;

    DMA_CONFIG.ELCNT = transfer_size;

    DMA_CONFIG.ELDOFFSET = 0;

    DMA_CONFIG.ELSOFFSET = 0;

    DMA_CONFIG.FRDOFFSET = 0;

    DMA_CONFIG.FRSOFFSET = 0;

    DMA_CONFIG.PORTASGN = PORTA_READ_PORTA_WRITE;

    DMA_CONFIG.RDSIZE  = ACCESS_32_BIT;

    DMA_CONFIG.WRSIZE  = ACCESS_32_BIT;

    dma_config.tType  = frame_transfer;

    dma_config.ADDMODERD = ADDR_INC1;

    DMA_CONFIG.ADDMODEWR = ADDR_INC1;

    DMA_CONFIG.AUTOINIT = AUTOINIT_ON;

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

    您好!

    谢谢你。 这只是配置、对吧? 如何像在正常模式下一样进行读取和写入? 我在哪个文件中有该代码?

    BR

    Marcel

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

    以下代码可用于将数据从 MCU RAM 移动到 EMIF SDRAM、并从 SDRAM 移动到 RAM。

    /*包含文件*/

    #include "hL_sys_common.h"

    /*用户代码开始(1)*/
    #include "HL_EMIF.h"
    #include "HL_SYS_DMA.h"
    #include "hL_sys_core.h"


    /*示例数据模式配置*/
    #define E_COUNT 64 /*元素计数*/
    #define F_COUNT 16 /*帧计数*/
    #define D_SIZE e_count * F_count


    void loadDataPattern (uint32 psize、uint32* pptr、uint32模式);


    #pragma SET_DATA_SECTION (".sharedRAM")
    uint32 TXDATA_RAM[D_SIZE]; 系统 RAM 中的/*发送缓冲器*/
    uint32 RXDATA_RAM[D_SIZE]={0};//系统 RAM 中的接收缓冲区
    G_dmaCTRL g_dmaCTRLPKT1、g_dmaCTRLPKT2;/* DMA 控制数据包配置堆栈*

    #pragma SET_DATA_SECTION ()

    /*用户代码结束*/

    /**@fn void main (void)
    *@应用程序主函数简介
    *@请注意、默认情况下、此函数为空。
    *
    *此函数在启动后调用。
    *用户可以使用此函数来实现应用程序。
    *

    /*用户代码开始(2)*/
    /*用户代码结束*/

    int main (空)

    /*用户代码开始(3)*/
    /*启用 IRQ 中断*/
    uint16 i;
    unsigned int * Addr32 =(unsigned int *) 0x80001000;//08076000;
    for (i=0;i<64;i++)
    *地址32++= I+0xEFEFAB00;

    _enable_IRQ_interrupt_();

    EMIF_SDRAMInit();
    /*-在系统 RAM 中创建数据块,以...开始 *
    loadDataPattern (D_size、&TXDATA_RAM[0]、0x5A5A5A5A);

    /*-配置 DMA 控制数据包*/
    G_dmaCTRLPKT1.Sadd =(uint32) TXDATA_RAM;//源地址 *
    G_dmaCTRLPKT1.DADD =(uint32)(0x8000000);//(0x08078000);//目标地址;SDRAM *
    G_dmaCTRLPKT1.CHCTTRL = 0; /*通道控制 *
    G_dmaCTRLPKT1.FRCNT = F_COUNT; /*帧计数 *
    G_dmaCTRLPKT1.ELCNT = E_COUNT; /*元素计数 *
    G_dmaCTRLPKT1.ELDOFFSET = 0; /*元素目标偏移量*/
    G_dmaCTRLPKT1.ELSOFFSET = 0; /*元素目标偏移量*/
    G_dmaCTRLPKT1.FRDOFFSET = 0; /*帧目的偏移量*/
    G_dmaCTRLPKT1.FRSOFFSET = 0; /*帧目的偏移量*/
    G_dmaCTRLPKT1.PORTASGN = PORTA_READ_PORTA_WRITE;
    G_dmaCTRLPKT1.RDSIZE = ACCESS_32_BIT; /*读取大小 *
    G_dmaCTRLPKT1.WRSIZE = ACCESS_32_BIT; /*写入大小 *
    G_dmaCTRLPKT1.tType = frame_transfer;/*传输类型 *
    G_dmaCTRLPKT1.ADDMODERD = ADDR_INC1; 读取/*地址模式 *
    G_dmaCTRLPKT1.ADDMODEWR = ADDR_INC1; /*地址模式写入 *
    G_dmaCTRLPKT1.AUTOINIT = AUTOINIT_OFF; /*自动初始化 *


    G_dmaCTRLPKT2.Sadd =(uint32)(0x80001000);//0x08076000);//源地址*/
    G_dmaCTRLPKT2.DADD =(UINT32) RXDATA_RAM; /*目标地址 *
    G_dmaCTRLPKT2.CHCTTRL = 0; /*通道控制 *
    G_dmaCTRLPKT2.FRCNT = F_COUNT; /*帧计数 *
    G_dmaCTRLPKT2.ELCNT = E_COUNT; /*元素计数 *
    G_dmaCTRLPKT2.ELDOFFSET = 0; /*元素目标偏移量*/
    G_dmaCTRLPKT2.ELSOFFSET = 0; /*元素目标偏移量*/
    G_dmaCTRLPKT2.FRDOFFSET = 0; /*帧目的偏移量*/
    G_dmaCTRLPKT2.FRSOFFSET = 0; /*帧目的偏移量*/
    G_dmaCTRLPKT2.PORTASGN = PORTA_READ_PORTA_WRITE;
    G_dmaCTRLPKT2.RDSIZE = ACCESS_32_BIT; /*读取大小 *
    G_dmaCTRLPKT2.WRSIZE = ACCESS_32_BIT; /*写入大小 *
    G_dmaCTRLPKT2.tType = frame_transfer;/*传输类型 *
    G_dmaCTRLPKT2.ADDMODERD = ADDR_INC1; 读取/*地址模式 *
    G_dmaCTRLPKT2.ADDMODEWR = ADDR_INC1; /*地址模式写入 *
    G_dmaCTRLPKT2.AUTOINIT = AUTOINIT_OFF; /*自动初始化 *

    /*-设置 DMA 控制数据包*/
    dmaSetCtrlPacket (dma_ch1、g_dmaCTRLPKT1);//TX
    dmaSetCtrlPacket (dma_CH0、g_dmaCTRLPKT2);//rx

    /*-将 DMA 通道设置为在硬件请求时触发*/
    dmaSetChEnable (DMA_CH1、DMA_SW);
    dmaSetChEnable (DMA_CH0、DMA_SW);

    /*传输完成后为接收启用块传输完成中断*/
    dmaEnableInterrupt (DMA_CH0、BTC、DMA_INTA);


    dmaEnable();

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

    /*用户代码结束*/

    返回0;



    /*用户代码开始(4)*/

    /** void loadDataPattern (uint32 psize、uint16* pptr)
    *
    *将随机数据块加载到系统 RAM 中
    *
    * ptr >系统 RAM 地址
    * psize > chunkl size
    *
    *
    void loadDataPattern (uint32 psize、uint32* pptr、uint32模式)

    int i;
    for (i=0;<psize;i++))

    *(pptr++)=图形+ I;



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

    感谢 QJ、这是非常有益的信息。 但魔法发生在哪里呢? 数据传输发生在何处? dmaEnable 之后是否没有缺失? 此致 Marcel