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.

[参考译文] TMS320F28374D:TMS320F2837xD DMA 不会复制数据、但会发生地址增量

Guru**** 2431450 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1046551/tms320f28374d-tms320f2837xd-dma-does-not-copy-the-data-although-address-increment-happens

器件型号:TMS320F28374D
主题中讨论的其他器件:C2000WARE

大家好,我正在尝试使 DMA 正常工作,首先我要尝试从一个阵列传输到另一个阵列。 我可以看到 SRC_ADDR_ACTIVE 和 DST_ADDR_ACTIVE 递增、但我看不到这些值发生了变化。  

如果以下代码中有任何问题、有人可以帮助我吗

下面是代码  

初始化:

===========================

DMASSource =(volatile UINT16 *) dutyCyclPercentSine;
DMADest =(易失性 UINT16 *)结果;


EALLOW;


DMACTRL.bit.hardreset = 1;
_asm (" NOP");

DmaRegs.DEBUGCTRL.bit.FREE = 1;


DmaRegs.CH1.SRC_ADDR_SHADDASH =(uint32) DMASSOURCE;
DmaRegs.CH1.SRC_beg_ADDR_SHADDASH =(uint32) DMASource;
DmaRegs.CH1.dst_ADDR_SHADDow =(uint32) DMADest;
DmaRegs.CH1.dst_beg_ADDR_SHADD=(uint32) DMADest;


//通道1
DmaRegs.ch1.burse_size.all = 0;
DmaRegs.CH1.SRC_BURST_STEP = 1;
DmaRegs.CH1.dst_burst_step = 1;

DMARegs.CH1.TRANSF_SIZE = 9;
DMARegs.CH1.SRC_TRANSFER_STEP = 1;
DmaRegs.CH1.dst_transfer_step = 1;


DmaClaSrcSelRegs.DMACHSRCSEL1.bit.CH1 = 0;

DMARegs.CH1.MODE.BIT.PERINTSEL = 1;

DMaRegs.CH1.MODE.BIT.PERINTE = 1;
DMaRegs.CH1.MODE.BIT.CHINTE = 0;
DmaRegs.CH1.MODE.bit.OneShot = 0;
DMaRegs.CH1.MODE.BIT.Continous = 0;
DMARegs.CH1.MODE.BIT.DATASIZE = 0;
DMaRegs.CH1.MODE.BIT.CHINTMODE = 0;
DMaRegs.CH1.MODE.BIT.CHINTE = 0;

CpuSysRegs.SECMSEL.bit.PF2SEL = 1;
CpuSysRegs.SECMSEL.bit.PF1SEL = 1;


DmaRegs.ch1.control.bit.run = 1;

EDIS;

===========================

在 main.c 中  

INT 计数= 0;
while (1)

count++;
if (count == 0xFFFF)

EALLOW;
DmaRegs.ch1.control.bit.PERINTFRC = 1;
// EPwm1Regs.CMPA.bit.CMPA = 1500;
EDIS;
计数= 0;
// RunSPWM();

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

    UMA、

    请将"连续"更改为"1"、然后查看是否修复了问题。  当 Continuous = 0时、您必须在传输之间写入 RUN 位以重新 ARM DMA。  连续= 1将使 DMA 保持布防状态。

    如果启用了 DMA ISR、则每次传输后都会触发、但我认为您的代码中还没有使用 ISR。

    最棒的

    Matthew

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

    尊敬的 Mathew:  

    感谢您的回复。 我尝试将 连续更改为"1"。  但它不起作用。  

    我缺少的任何其他东西。

    -Usmasankar K

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

    UMA、

    您能否确认为 DMA 结果所选择的地址范围/存储器类型?  DMA 只能访问 GSx (0xC000 - 0x1BFFF)存储器。  

    最棒的
    Matthew

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

    尊敬的 Mathew:

    我正在尝试访问下面的内存区域  

    00082425 0000000d spwm_hal.obj (.cinit:_dutyCyclPercentSine)
    00082432 0000000d spwm_hal.obj (.cinit:_result)

    如何确保将它们放置在 GS RAM 中?  

    最后,我还需要通过 DMA 向 EPwm1Regs 写入数据,所以您说不可能写入 (0xC000 - 0x1BFFF)区域以外的地址 。  

    EPwm1Regs ePWM_regs 0x0000_4000 0x0000_40FF

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

    UMA、

    我应该再澄清一点、就 DMA 可以访问的 RAM 而言、我提到的 GSx 是正确的。  DMA 还可以访问包括 ePWM 在内的某些外设、以便地址范围正常。

    因此、对于作为源的变量 dutyCyclPercentSine、您需要将其放置在 GSx RAM 中。  有几种方法可以执行此操作、您可以将.data 段全局分配给 GSx。  或者、您可以使用#pragma DATA_SECTION (X、X)将该变量仅分配给 GSx RAM。

    C2000Ware C:\ti\c2000\C2000Ware_4_00_00_00\driverlib\f2837xd\examples\CPU1\dma\ 中的 DMA 示例显示了如何使用上述 pragma DATA_SECTION 指令放置段。

    最棒的

    Matthew

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

    谢谢 Mathew、

    关键点是将阵列放置在 GS0RAM、现在我能够使用 DMA 传输数据。

    Umasankar k