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.

[参考译文] 编译器/TMDXRM57LHDK:SDRAM EMIF DMA 访问

Guru**** 2481985 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/693856/compiler-tmdxrm57lhdk-sdram-emif-dma-access

器件型号:TMDXRM57LHDK
主题中讨论的其他器件:HALCOGEN

工具/软件:TI C/C++编译器

您好!

我正在使用 RM57L 硬件开发套件。 我尝试将 DMA 写入 SDRAM 16位接口、但当我使用代码时、我看到地址线路上没有数据传输、而且没有流量、只有 Wen 在切换(使用数字分析器)。 在 main 中使用此函数:

EMIF_SDRAMInit();
/*-在系统 RAM 中创建数据块,以...开始 *
loadDataPattern (D_size、&TXDATA_RAM[0]、0xFFFFFFFF);// 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;/* transfer type *
G_dmaCTRLPKT1.ADDMODERD = ADDR_INC1;/*地址模式读取*
G_dmaCTRLPKT1.ADDMODEWR = ADDR_INC1;/*地址模式写入*
G_dmaCTRLPKT1.AUTOINIT = AUTOINIT_OFF;/*自动初始化*/


G_dmaCTRLPKT2.Sadd =(uint32)(0x80001000);//(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;/* transfer type *
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();

在 sys_link 中、我使用该地址

引导程序(X):origin=0x00000000 length=0x00000020
FLASH0 (RX):origin=0x00000020 length=0x001FFFE0
FLASH1 (RX):origin=0x00200000 length=0x00200000
堆栈(RW):origin=0x08000000 length=0x00001500
RAM (RW):origin=0x08001500 length=0x0007BB00
SHAREDRAM (RW):origin=0x0807D000 length=0x00003000

/*用户代码开始(3)*/
SDRAM (rwx):origin=0x8000000 length=0200000000

谢谢你

Marcel

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

    尊敬的 Marcel:

    它似乎是 EMIF 初始化的问题。 您能否包含 EMIF_SDRAMInit()函数以及 I/O 多路复用的配置?

    此致、
    Sunil

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

    默认情况下、缓存处于启用状态。 SRAM 的 MPU 设置为回写式。 如果使用回写、则有时会在缓存中存储最新数据。 请在写通或禁用缓存的情况下进行测试。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 QJ、

    我尝试过这样的方法   

    RAM  (RW):origin=0x08001500 length=0x0007BB00

    SHAREDRAM (RW):origin=0x0807D000 length=0x00003000

    SDRAM (RW):origin=0x8000000 length=0200000000

    但它不起作用。

    我还在写通中为 DMA RAM 设置了区域。

    您还可以在数字分析器中看到、只有 WN 切换数据线路、地址线路为低电平。

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

    您好 QJ,

    我的调查结果稍微更深入一点。  loadDataPattern 例程错误。 但是、请我不了解  RDSIZE 和  WRSIZE、 FRCNT 和 ELCNT 如何使用 EMIF 16位数据接口进行配置?

    BR

    Marcel  

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

    Marcel、您好!

    您的 DMA 配置正确。 阻止数据传输到 SDRAM 的唯一方法是高速缓存或不正确的 EMIF 设置(pinmux、时序)。

    1.禁用高速缓存(HALCoGen MPU 面板)

    2.使用附加的 pinmux 和 EMIF 配置文件

    3.使用包含的 main.c 在没有启用 DMA 的情况下执行读/写测试

    void main (void)

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

      无符号短整型* SDRAM =(无符号短整型*) 0x8000000;

      无符号短读回[3];

      {

        *(SDRAM + 0)=(无符号短整型) 0xA5A5;

        *(SDRAM + 1)=(无符号短整型) 0xb5b5;

        *(SDRAM + 2)=(无符号短整型) 0xc5c5;

      }

      readback [0]=*(SDRAM + 0);

      readback [1]=*(SDRAM + 1);

      readback [2]=*(SDRAM + 2);

    e2e.ti.com/.../7120.HL_5F00_emif.ce2e.ti.com/.../5758.HL_5F00_pinmux.c