在使用EDMA的手动模式触发EDMA进行数据传输的过程中,在程序中写入其值但是对应的内存地址里面的数值仍然为00000000,这是因为什么呢?不是手动模式触发的时候,直接操作ESR的相应位不就可以了吗?
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.
在使用EDMA的手动模式触发EDMA进行数据传输的过程中,在程序中写入其值但是对应的内存地址里面的数值仍然为00000000,这是因为什么呢?不是手动模式触发的时候,直接操作ESR的相应位不就可以了吗?
附件中的代码参考看一下。
那为啥无法进行传输呀,我把我的相关代码贴出来,请您麻烦给看一下,
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;
请您简单看看,可能是哪里出的问题,非常感谢你的回答