TMS320F28377D: 28377D的DMA问题,

Part Number: TMS320F28377D


尊敬的TI工程师们:

        你们好!

        最近,我在使用28377D的DMA功能时,遇到了一个问题,我的芯片外扩了16bit的sram,挂载在cs3上,现在我想把cla中的计算的变量(大概10个float型)利用dma功能实时存储到外部的sram中,采样周期为20kHz。我将10个float型变量写成结构体数据包,放在在gs ram中,构建了结构体大数组(相关代码见附件),映射在外部的cs3中。现在遇到的问题有:

         1:首先,在配置dma中,在debug时,发现数据错位,例如我将Wang_ClatoCpu.DataPack.LogVpn(数组在gs ram中,dma无法访问ls ram) 赋值为1.123,但是在Wang_ExtRamBuf中,却是Log_iL_C为1.123,且后续位置会变。但是我进行单步调试时,却没有这个问题。

         2:其次,我做此工作的目的是想看cla内部的变量在上电过程中的时候,数值是否符合我的预期,除了上述的方法,是否还有其他较为成熟的方案。
         希望得到你们的建议!
                                                                                                                                                         祝好!

c21a4e02af654c9f18d40a21ce316640.png

e11e5981ca409e50f35f624ffc301568.pngWang_Emif.c Wang_DMA.c Wang_DMA.h Wang_Emif.h 

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

  • 您好

    您是否试图使用一个DMA通道将所有数据从Wang_ExtRamBuf直接复制到Wang_ClaToPu,并使用相同的格式、数据位置等?

    你能分享一下你正在使用的以下值吗:

    DMA_CFG_BURST_SIZE
    DMA_STEP_INC
    DMA_CFG_TRANSFER_SIZE
    DMA_SRC_TRANSFER_STEP
    DMA_DST_TRANSFER_STEP

  • 您好:

    我帖子的下方分享了我的源代码,下面再单独列出

    #define DMA_LOG_POINTS 20000

    // 如果 SRAM 只有 1MB (512k Words),则只能录约 25000 点
    //#define WANG_LOG_DEPTH 25000
    // 假设外部 RAM 很大,仍然录 20000 点,总大小 = 20000 * 10 * 2 words = 400,000 words (800KB)

    #define SENSOR_DATA_COUNT 10 // 结构体中 float 的数量
    #define LOG_DURATION_SEC 1 // 采样时长 (秒)
    #define SAMPLING_FREQ_HZ 20000// 采样频率

    #define WORDS_PER_FLOAT 2 // per float two words;

    #define DMA_BURST_TOTAL_WORDS (SENSOR_DATA_COUNT * WORDS_PER_FLOAT)// 单次采样需要搬运的总 Word 数

    #define DMA_TOTAL_SAMPLES (LOG_DURATION_SEC * SAMPLING_FREQ_HZ)// 总共需要记录的样本点数 (总 Transfer 次数)

    // 3. DMA 寄存器数值配置 (Register Values)
    // ------------------------------------------
    // [Burst Size] 寄存器值 = 实际搬运个数 - 1 19
    // 对应 DMACH1BurstConfig 的第一个参数
    #define DMA_CFG_BURST_SIZE (DMA_BURST_TOTAL_WORDS - 1)

    // [Transfer Size] 寄存器值 = 实际 Transfer 次数 - 1
    // 对应 DMACH1TransferConfig 的第一个参数
    #define DMA_CFG_TRANSFER_SIZE (DMA_TOTAL_SAMPLES - 1)

    // [Address Steps] 地址步进配置
    // Burst 内部步进:每搬一个字,地址 +1
    #define DMA_STEP_INC 1

    // Source Transfer Step (源地址回跳)
    // 解释:Burst结束时地址增加了 DMA_CFG_BURST_SIZE (即19),
    // 我们需要减去这个偏移量,让指针回到结构体头部。
    #define DMA_SRC_TRANSFER_STEP (-((int16)DMA_CFG_BURST_SIZE))

    // Dest Transfer Step (目的地址跳转)
    // 解释:Burst结束时地址增加了 19,我们需要它指向下一个空位(+1),
    // 实际上这里填 1,效果是让地址停留在 Burst 结束后的位置的下一位。
    // 这里的逻辑是:(End_Addr) + Step.
    // 如果 Step=1,就是紧接着写。
    #define DMA_DST_TRANSFER_STEP 1 //1

    #define DMA_TRIGGER_SOURCE 0