TI中文支持网
TI专业的中文技术问题搜集分享网站

TMS320C6747: EDMA手动触发模式配置

Part Number:TMS320C6747

在使用EDMA的手动模式触发EDMA进行数据传输的过程中,在程序中写入其值但是对应的内存地址里面的数值仍然为00000000,这是因为什么呢?不是手动模式触发的时候,直接操作ESR的相应位不就可以了吗?

jie wang:

ESR的值在内存界面也更改不了

,

Nancy Wang:

附件中的代码参考看一下。

edma_c674x_c6748_lcdkC6748.zip

,

jie wang:

您好,其中EDMAtest的文件显示找不到,我找了源文件也没有请您再发一次

,

Nancy Wang:

下载starterware,里面有源码,但starterware这部分内容支持有限。

software-dl.ti.com/…/index_FDS.html

,

jie wang:

想问一下,可以将EDMA手动触发ESR放在外部中断服务函数里面嘛?

,

Nancy Wang:

不能,没有对应的外部触发事件。

,

jie wang:

可能姐姐不理解我的意思,我的意思是外部中断使用别的中断事件进行触发,只是在外部中断服务函数中,将EDMA的手动传输渠道打开操作ESR寄存器

,

Nancy Wang:

是可以的。

,

jie wang:

那为啥无法进行传输呀,我把我的相关代码贴出来,请您麻烦给看一下,

1.我先配置了EDMA的相关初始化,主要包括事件错误清除,队列设置,等等,由于使用的是手动触发模式,我就没配置触发事件到通道的映射

void COhwDMAInit(void){ // General EDMA Initial

/* Step 1: EDMA initialization */ QUEPRI = 0x10; //芯片级设置?

QWMTHRA =(16<<8u)|(16 & 0xFF); //设置了最大 SAMPPRXY_TC0 = 0x101; /* Clear the Event miss Registers */ EMCR = 0xFFFFFFFF; //事件丢失寄存器清除 EMCRH = 0xFFFFFFFF; // QEMCR = 0xFFFFFFFF;

/* Clear CCERR register */ CCERRCLR = 0xFFFFFFFF;

/* FOR TYPE EDMA*/ /* Enable the DMA (0 – 64) channels in the DRAE and DRAEH register */ DRAE0 = 0xFFFFFFFF; DRAE1 = 0xFFFFFFFF; DRAEH0 =0xFFFFFFFF; DRAEH1 =0xFFFFFFFF;

/* Step 2: Programming DMA Channel (and Param set) */

/* All events are one to one mapped with the channels  事件触发时使用 */// DCHMAP0 = 0x0;// DCHMAP1 = 1 << 5;// DCHMAP2 = 2 << 5;// DCHMAP3 = 3 << 5;// DCHMAP4 = 4 << 5; DMAQNUM0=0x0; //全部放在队列0中进行

COhwDMA_Disable();

return;}

2.关于参数集的设置,使用了AB传输模式,起始地址为0x60000000(EMIFA的cs2位置),目标地址为0x008117C4 选择了参数集4

void COhwDMA_rxConfig(){ // Paramter entry 4,5,6,7 is used to receive deamnd data

/*———————————————————————-*/ /* Initialize EDMA for Receive Samples for RX0 */ *(volatile uint32_t *) (EVENT4_PARAMS + EDMA_PARAMS_OPT ) = 0x0010000C; //| (1<<12) ; 选择AB传输 防链接 *(volatile uint32_t *) (EVENT4_PARAMS + EDMA_PARAMS_SRC ) = (uint32_t)COexSqInputPtr; // Src = not known yet *(volatile uint32_t *) (EVENT4_PARAMS + EDMA_PARAMS_CNT ) = (0x002A0000 | (uint32_t)(CO_AL_DN_MESSAGE_BYTESIZE )); // in bytes *(volatile uint32_t *) (EVENT4_PARAMS + EDMA_PARAMS_DST ) = (uint32_t)&COexEmInPktBuf.dn; // Dst *(volatile uint32_t *) (EVENT4_PARAMS + EDMA_PARAMS_IDX ) = ((uint32_t)(CO_AL_DN_MESSAGE_BYTESIZE ) << 4u |(uint32_t)(CO_AL_DN_MESSAGE_BYTESIZE * 2 ) ); *(volatile uint32_t *) (EVENT4_PARAMS + EDMA_PARAMS_LNK ) = 0x0000FFFF; // null *(volatile uint32_t *) (EVENT4_PARAMS + EDMA_PARAMS_CIDX) = 0; *(volatile uint32_t *) (EVENT4_PARAMS + EDMA_PARAMS_CCNT) = 0x00000001; // Important!!! triger_target = 1;

以上两个部分在主函数中调用

void main( void ){

Uint8 i; CSR=0; C6747_init(); Scurve_Init(pSPlanPara);

KICK0R = 0x83e70b13; // Kick0 register + data (unlock) KICK1R = 0x95a4f1e0; // Kick1 register + data (unlock) COhwDMAInit(); COhwDMA_rxConfig(); COhwDMA_txConfig();

3.随后在外部中断中手动触发传输

void interrupt Ex2INT(){

KICK0R = 0x83e70b13; // Kick0 register + data (unlock) KICK1R = 0x95a4f1e0; // Kick1 register + data (unlock) SAMPPRXY_TC0 = 0x101; SER = 0x10; ESR = 0x00000010;

请您简单看看,可能是哪里出的问题,非常感谢你的回答

,

Nancy Wang:

有单步调试过吗?是手动触发不成功导致的无法传输?

,

jie wang:

单步调试过,我边调试边看着相应内存地址的值,其他的值都能写入到相应内存,只有ESR SER没有反应,依旧是零,我目前没有别的思路,已经将kick0和kick1写保护打开,报考源内存等级也已经改为了管理员模式,还是无法改ESR和SER的值,因此怀疑是手动触发没有成功

,

Nancy Wang:

我先将此贴关闭,该问题会在您新发布的帖子中讨论。

e2echina.ti.com/…/tms320c6747-edma-esr

赞(0)
未经允许不得转载:TI中文支持网 » TMS320C6747: EDMA手动触发模式配置
分享到: 更多 (0)