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.
你好,在C6655手册中提到EDMA有三种触发方式,分别为event-triggered,mannualy-trigggered,chained-triggered。
但是在TI的测试驱动库edma.c的驱动接口函数中没有Chained-triggered驱动方式的配置:
/**
* \brief Start EDMA transfer on the specified channel.
*
* There are multiple ways to trigger an EDMA3 transfer. The triggering mode
* option allows choosing from the available triggering modes: Event,
* Manual or QDMA.
*
* In event triggered, a peripheral or an externally generated event triggers
* the transfer. This API clears the Event and Event Miss Register and then
* enables the DMA channel by writing to the EESR.
*
* In manual triggered mode, CPU manually triggers a transfer by writing a 1
* in the Event Set Register ESR. This API writes to the ESR to start the
* transfer.
*
* In QDMA triggered mode, a QDMA transfer is triggered when a CPU (or other
* EDMA3 programmer) writes to the trigger word of the QDMA channel PaRAM set
* (auto-triggered) or when the EDMA3CC performs a link update on a PaRAM set
* that has been mapped to a QDMA channel (link triggered). This API enables
* the QDMA channel by writing to the QEESR register.
*
* \param baseAdd Memory address of the EDMA instance used.\n
*
* \param chNum Channel being used to enable transfer.\n
*
* \param trigMode Mode of triggering start of transfer (Manual,
* QDMA or Event).\n
*
* trigMode can have values:
* EDMA3_TRIG_MODE_MANUAL\n
* EDMA3_TRIG_MODE_QDMA\n
* EDMA3_TRIG_MODE_EVENT\n
*
* \return retVal TRUE or FALSE depending on the param passed.\n
*
*/
unsigned int EDMA3EnableTransfer(unsigned int baseAdd,
unsigned int chNum,
unsigned int trigMode)
{
unsigned int retVal = FALSE;
switch (trigMode)
{
case EDMA3_TRIG_MODE_MANUAL :
if (chNum < SOC_EDMA3_NUM_DMACH)
{
EDMA3SetEvt(baseAdd, chNum);
retVal = TRUE;
}
break;
case EDMA3_TRIG_MODE_QDMA :
if (chNum < SOC_EDMA3_NUM_QDMACH)
{
EDMA3EnableQdmaEvt(baseAdd, chNum);
retVal = TRUE;
}
break;
case EDMA3_TRIG_MODE_EVENT :
if (chNum < SOC_EDMA3_NUM_DMACH)
{
/*clear SECR & EMCR to clean any previous NULL request */
EDMA3ClrMissEvt(baseAdd, chNum);
/* Set EESR to enable event */
EDMA3EnableDmaEvt(baseAdd, chNum);
retVal = TRUE;
}
break;
default :
retVal = FALSE;
break;
}
return retVal;
}
可以看到上面只有EDMA的Manully-triggered和Event-triggered,第三种是QDMA的EVENT-QDMA触发方式,并没有EDMA的Chained-triggered触发方式,请问是什么原因?
如何使用Chained-triggered触发方式实现每一次传输完成后实现EDMA的link-transfer?(不是QDMA的link-tranfer)
我现在需要实现的是,在完成当前channel的配置后,将下一个PaRAM set中的配置copy到当前channel mapping param set中,并在当前传输完成后自动触发下一个配置的传输(TCC指定的channel传输),即每个传输之后会自动加载下一个param set,并自动开始传输。
主要有以下几个问题:
1、是不是只要配置好当前channel和下一个PaRAM set的配置,并把当前channel link到下一个PaRAM set,另外配置好OPT中的ITCCHEN和TCCHEN以及相应channel num的TCC就可以了?
2、这种配置好后,在最开始的是不是还是需要手动方式触发传输,EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, chNum, EDMA3_TRIG_MODE_MANUAL);
之后每一次传输完成后就可以自动加载param set并完成传输?
3、另外我想请问一下Transfer complete和Intermediate transfer completion如何理解,他们的区别是什么?
4、另外对于这种chain-trigger,如果我将PaRAM set 链接到自身后,可以实现连续自动传输,这种连续自动传输的停止是不是可以通过在传输完成中断函数中手动EDMA3DisableTransfer(SOC_EDMA30CC_0_REGS, chNum, EDMA3_TRIG_MODE_MANUAL);以及Disable OPT中的ITCCHEN和TCCHEN两种方式实现?