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.

TMS320C6747: EDMA手动触发模式配置

Part Number: TMS320C6747

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

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

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

    edma_c674x_c6748_lcdkC6748.zip

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

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

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

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

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

  • 可能姐姐不理解我的意思,我的意思是外部中断使用别的中断事件进行触发,只是在外部中断服务函数中,将EDMA的手动传输渠道打开操作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;

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

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

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

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

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