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.

[参考译文] TMS320F28386D:I'm 测试 DMA (直接存储器存取)。

Guru**** 2455560 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1457230/tms320f28386d-i-m-testing-dma-direct-memory-access

器件型号:TMS320F28386D

工具与软件:

您好、专家

我要测试 DMA 块。  

我使用3个 DMA 通道。

我的源地址相同。 (名称为"fsiRxDataBuf");

我 可以从 fsiRxDataBuf 获取 CPU1_FSI_PACKETS_RX。

但 CPU1_FSI_PACKETS_RX2和 CPU1_FSI_PACKETS_RX3缓冲器无效。

我需要选择我的 dest 缓冲区。  

我是否可以使用 DMA 更改最小缓冲区?

感谢您的阅读。

TypeNumFSI = frameDataRX[0]和0x0F00;

Switch (TypeNumFSI){
情况0x0000:  
dma_startChannel (dma_ch1_base);
DMA_forcestrigger (DMA_CH1_base);
休息;

案例0x0100:  
dma_startChannel (dma_ch2_base);
DMA_forcestrigger (DMA_CH2_base);
休息;

案例0x0200:  
dma_startChannel (DMA_CH3_BASE);
DMA_forcestrigger (DMA_CH3_BASE);
休息;
}

我的初始代码为:

void initDMA1 (void)

DMA_ConfigParams transfParams;
const void *destAddr;
const void * srcAddr;
srcAddr =(const void *) fsiRxDataBuf;
destAddr =(const void *) CPU1_FSI_PACKETS_RX;


//
//配置 DMA CH1
//
transfParams.transferTrigger = DMA_TRIGGER_SOFTWARE;
transfParams.interruptMode = DMA_INT_AT_END;
transfParams.enableInterrupt = 1;
transfParams.configSize = DMA_CFG_SIZE_16BIT;
transfParams.transferMode = DMA_CFG_Oneshot_disable;
transfParams.reinitMode = DMA_CFG_CONTINUOUS_DISABLE;
transfParams.burstSize = 8;
transfParams.transferSize = 6;//48/8
transfParams.srcWrapSize = 0xFFFF;
transfParams.destWrapSize = 0xFFFF;
transfParams.destAddr =(uint32_t) destAddr;
transfParams.srcAddr =(uint32_t) srcAddr;
transfParams.srcBurstStep = 1;
transfParams.destBurstStep = 1;
transfParams.srcTransferStep = 1;
transfParams.destTransferStep = 1;
transfParams.srcWrapStep = 0;
transfParams.destWrapStep = 0;

DMA_configChannel (DMA_CH1_BASE、&transfParams);
}

void initDMA2 (void)

DMA_ConfigParams transfParams;
const void *destAddr;
const void * srcAddr;
srcAddr =(const void *) fsiRxDataBuf;
destAddr =(const void *) CPU1_FSI_PACKETS_RX2;


//
//配置 DMA CH2
//
transfParams.transferTrigger = DMA_TRIGGER_SOFTWARE;
transfParams.interruptMode = DMA_INT_AT_END;
transfParams.enableInterrupt = 1;
transfParams.configSize = DMA_CFG_SIZE_16BIT;
transfParams.transferMode = DMA_CFG_Oneshot_disable;
transfParams.reinitMode = DMA_CFG_CONTINUOUS_DISABLE;
transfParams.burstSize = 8;
transfParams.transferSize = 6;//48/8
transfParams.srcWrapSize = 0xFFFF;
transfParams.destWrapSize = 0xFFFF;
transfParams.destAddr =(uint32_t) destAddr;
transfParams.srcAddr =(uint32_t) srcAddr;
transfParams.srcBurstStep = 1;
transfParams.destBurstStep = 1;
transfParams.srcTransferStep = 1;
transfParams.destTransferStep = 1;
transfParams.srcWrapStep = 0;
transfParams.destWrapStep = 0;

DMA_configChannel (DMA_CH2_base、&transfParams);
}

void initDMA3 (void)

DMA_ConfigParams transfParams;
const void *destAddr;
const void * srcAddr;
srcAddr =(const void *) fsiRxDataBuf;
destAddr =(const void *) CPU1_FSI_PACKETS_RX3;


//
//配置 DMA CH3
//
transfParams.transferTrigger = DMA_TRIGGER_SOFTWARE;
transfParams.interruptMode = DMA_INT_AT_END;
transfParams.enableInterrupt = 1;
transfParams.configSize = DMA_CFG_SIZE_16BIT;
transfParams.transferMode = DMA_CFG_Oneshot_disable;
transfParams.reinitMode = DMA_CFG_CONTINUOUS_DISABLE;
transfParams.burstSize = 8;
transfParams.transferSize = 6;//48/8
transfParams.srcWrapSize = 0xFFFF;
transfParams.destWrapSize = 0xFFFF;
transfParams.destAddr =(uint32_t) destAddr;
transfParams.srcAddr =(uint32_t) srcAddr;
transfParams.srcBurstStep = 1;
transfParams.destBurstStep = 1;
transfParams.srcTransferStep = 1;
transfParams.destTransferStep = 1;
transfParams.srcWrapStep = 0;
transfParams.destWrapStep = 0;

DMA_configChannel (DMA_CH3_BASE、&transfParams);
}

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

    嗨、Hahmin:

    如果您跨不同通道的设置除目标地址外都是相同的、则只需使用一个 DMA 通道、并在需要时通过调用 dma_configAddresses()来更改目标地址。  在传输期间可以安全地更新 dst_ADDR_SHADEP 和 DEST_BIG_ADDR_SHADOW 寄存器 、并且 在下一次传输开始时更新的地址将加载到 dst_ADDR_ACTIVE 和 DEST_BIG_ADDR_ACTIVE 寄存器中。 我仍然建议在 DMA 传输结束 ISR 内调用 dma_configAddresses()函数、以避免出现任何同步问题。

    此致、

    Delaney