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.

[参考译文] TMS320F28379D:F28379D DMA 只从 SDFM SDDATA-Registers 读取 0

Guru**** 2874300 points

Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1628417/tms320f28379d-f28379d-dma-reads-only-0-from-sdfm-sddata-registers

部件号: TMS320F28379D
主题: SysConfig 中讨论的其他器件

使用 SysConfig、Driverlib、DMA CH1 和 SDFM2 Filter1

当我通过 VALUE = HWREG (0x00005E96);或 VALUE=HWREG (mySDFM2_BASE + SDFM_O_SDDATA1) 读取寄存器时;我得到正确的数据。 然而、当我尝试通过 DMA 读取完全相同的寄存器时、DMA 只生成零。 当我读取另一个也位于 ramgs0 中的变量时、缓冲区将填充 SDFM 数据加速器中的每个触发器。  

DMA 的配置:
void myDMA0_init(){
    DMA_setEmulationMode(DMA_EMULATION_FREE_RUN);
    DMA_configAddresses(myDMA0_BASE, dma_dfsm_dest_1, test_add);
    DMA_configBurst(myDMA0_BASE, 1U, 0, 0);
    DMA_configTransfer(myDMA0_BASE, 200U, 0, 1);
    DMA_configWrap(myDMA0_BASE, 1U, 0, 200U, -200);
    DMA_configMode(myDMA0_BASE, DMA_TRIGGER_SDFM2FLT1, DMA_CFG_ONESHOT_DISABLE | DMA_CFG_CONTINUOUS_ENABLE | DMA_CFG_SIZE_32BIT);
    DMA_enableTrigger(myDMA0_BASE);
    DMA_startChannel(myDMA0_BASE);
}
SDFM2 的配置:
//****************************************
// mySDFM2 initialization
//****************************************
void mySDFM2_init(void)
{
	//
	// Set modulator clock mode
	//
	SDFM_setupModulatorClock(mySDFM2_BASE, SDFM_FILTER_1, SDFM_MODULATOR_CLK_EQUAL_DATA_RATE);
	SDFM_setupModulatorClock(mySDFM2_BASE, SDFM_FILTER_2, SDFM_MODULATOR_CLK_EQUAL_DATA_RATE);
	SDFM_setupModulatorClock(mySDFM2_BASE, SDFM_FILTER_3, SDFM_MODULATOR_CLK_EQUAL_DATA_RATE);
	//
	// Configure comparator filter settings
	//
	SDFM_configComparator(mySDFM2_BASE, (SDFM_FILTER_1 | SDFM_FILTER_SINC_3 | SDFM_SET_OSR(1)), SDFM_THRESHOLD(30000,0));
	SDFM_configComparator(mySDFM2_BASE, (SDFM_FILTER_2 | SDFM_FILTER_SINC_3 | SDFM_SET_OSR(1)), SDFM_THRESHOLD(30000,0));
	SDFM_configComparator(mySDFM2_BASE, (SDFM_FILTER_3 | SDFM_FILTER_SINC_3 | SDFM_SET_OSR(1)), SDFM_THRESHOLD(30000,0));
	//
	// Configure data filter settings
	//
	SDFM_configDataFilter(mySDFM2_BASE, (SDFM_FILTER_1 | SDFM_FILTER_SINC_3 | SDFM_SET_OSR(256)), (SDFM_FILTER_ENABLE | SDFM_DATA_FORMAT_32_BIT | SDFM_SHIFT_VALUE(10)));	  
	SDFM_configDataFilter(mySDFM2_BASE, (SDFM_FILTER_2 | SDFM_FILTER_SINC_3 | SDFM_SET_OSR(256)), (SDFM_FILTER_ENABLE | SDFM_DATA_FORMAT_16_BIT | SDFM_SHIFT_VALUE(10)));	  
	SDFM_configDataFilter(mySDFM2_BASE, (SDFM_FILTER_3 | SDFM_FILTER_SINC_3 | SDFM_SET_OSR(256)), (SDFM_FILTER_ENABLE | SDFM_DATA_FORMAT_16_BIT | SDFM_SHIFT_VALUE(10)));	  
	//
	// Main Filter Enable
	//
    SDFM_enableMainFilter(mySDFM2_BASE);
	//
	// Configure SDFM interrupt source
	//
	//
	// FILTER1 interrupt settings
	//
	SDFM_enableInterrupt(mySDFM2_BASE, SDFM_FILTER_1, SDFM_DATA_FILTER_ACKNOWLEDGE_INTERRUPT); 
	//
	// FILTER2 interrupt settings
	//
	SDFM_enableInterrupt(mySDFM2_BASE, SDFM_FILTER_2, SDFM_DATA_FILTER_ACKNOWLEDGE_INTERRUPT); 
	//
	// FILTER3 interrupt settings
	//
	SDFM_enableInterrupt(mySDFM2_BASE, SDFM_FILTER_3, SDFM_DATA_FILTER_ACKNOWLEDGE_INTERRUPT); 
	DEVICE_DELAY_US(78U);
	//
	// Main Interrupt Enable
	//
	SDFM_enableMainInterrupt(mySDFM2_BASE);
} 	

main 文件的唯一重要部分:

#pragma DATA_SECTION(dsfm1_C1, "ramgs0");
#pragma DATA_SECTION(test, "ramgs0");
uint16_t test=4;
const void*test_add=(void*)(mySDFM2_BASE+SDFM_O_SDDATA1);
int32_t dsfm1_C1[200];

提前非常感谢。



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

    因此、实际上我不知道我需要给 DMA 控制外设而不是 CLA:

    这一行解决了以下问题:

    SysCtl_selectSecMaster(SYSCTL_SEC_MASTER_DMA, SYSCTL_SEC_MASTER_DMA);

    SDFM 位于外设帧 1 中、因此第一个参数与导入参数无关。

    没有问题