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.

c6747,EDMA3中断问题

hi,

    附件中是我从官网上下下来的范例,我使用了dsp/bios进行了相关设置,把范例根据我的需求进行了修改,但是他无法进入edma3中断,事实上,它运行到audio_run函数中的sem_pend后就没有反应了,我想是因为edma3.c文件中的edma3Irr()函数没有运行。我的问题有两个:

     1.在原来的例程中,我没有发现它调用了edma3ccIsr()函数,这个函数仅在dsp/bios中的中断设置(中断8)中出现过,我不明白他的调用流程,他从什么时候进入了这个函数。我应该怎么做

     2.在范例中还存在未被调用的函数,如edmadisablechannel等,如果删掉他们会怎么样?

希望可以得到答案,谢谢各位大神!

c6747_audio_edma_v4.zip
  • 抱歉,题目中的描述不够准确,是edma3cclsr()函数没有运行

  • 请问做了什么修改?在修改前,例程能运行吧?

    HWI8中断发生时,会去执行edma3ccIsr中断处理函数,如果edma3ccIsr没有执行,说明中断没有发生或者发生了没有响应,可以查看一下IPR, IER, IFR,GIE等中断寄存器是否置1了?

    可以参考一下下面的网站关于DSP/BIOS中配置中断。
    http://processors.wiki.ti.com/index.php/Setting_up_interrupts_in_DSP_BIOS

  • 非常非常感谢您的回复。在DSP/BIOS中,中断我是按照例程的设置来设置的。在我上传的这个例子中,其实我也没有运行成功,因为一些硬件问题以及CCS6上面没有仿真器来进行仿真,此外,它似乎没有进行PLL及PSC的相关设置,所以是运行不起来的。

    我还有几个问题,希望得到您的解答:

    1.在乒乓传输中,什么时候edma3会产生中断,看起来它是连续不断的传输的,比如说源地址是mcasp0的数据端口,目的地址是dst_ping_L,dst_pong_L,dst_ping_R,dst_pong_R等等

    2.我想要验证一下乒乓传输是否能顺利运行,目前我的做法是给dst_ping等4个数组,src_ping等四个数组赋值,然后观察数组值的变化,这样的做法是否可行?事实上,现在mcasp数据端口的值是读不到dst_ping_L等四个数组里的。

    希望您可以回复我,再一次感谢您。

  • 请看一下TRM手册里16.3.4.4 Ping-Pong Buffering章节。传输完一个Ping buffer或者pong bufer,在PaRAM里需要link到下一个pong  buffer或者Ping buffer。中断是在传输完一个ping或者pong buffer时产生。
    http://www.ti.com/lit/ug/spruh91d/spruh91d.pdf

  • 谢谢,经过我的调试,今天我连mcasp初始化都做不到了,它停在启动高频时钟的模块,无法将时钟退出复位状态。但是昨天它是可以的,我并没有做什么改动啊。

  • 请问软硬件都没改动么?是自己的板子还是EVM板?能跑其他的程序吗?还是就mcasp口用不了?

  • 其他的程序能跑,我后来把很多log_printf注释掉了,然后这个mcasp又能顺利度过初始化阶段了,但是我还是有问题。

    1.为什么log_printf给程序带来了这个影响,您能解释一下吗?

    2.我当时卡在了

    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; // HS Clk
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );

    这个循环里出不来,事实上即使是现在它似乎也没有改变XGBLCTL的值,但是程序仍旧运行下去了,您是否能告知原因?

    谢谢!

  • 我真的不明白,为什么不可以,我的psc和PLL的程序都是直接从可用的程序里截下来的,并且已经配置过了,应该不会出错的,涉及到这部分的寄存器我也一一对过比较过,没有问题,为什么mcasp停在while循环不能初始化,我真的不明白。。。

  • log_printf会占用内存,消耗CPU,如果代码中有太多打印的话,会影响程序的实时性。

  • 请问一下,mcasp初始化之后,XSTAT和RSTAT的数据就溢出了,这是正常情况吗?我想应该不是,但是我是严格按照初始化顺序进行的初始化。

    这种情况与mcasp时钟的配置有关吗?我应该怎么进行修改?

    我已经放弃用dsp/bios这个部分了,因为我发现在ccs6上似乎只能装sys/bios,但是我装了之后迷之打不开。

  • 我发现了初始化时产生数据下溢是因为我采用了双通道的输入输出,在数据手册中找到这样一句话:

    When transmitting, the DMA/CPU must write data to each serializer configured as "active" and "transmit"
    within each time slot. Failure to do so results in a buffer underrun condition (Section 3.6.2). Similarly, when
    receiving, data must be read from each serializer configured as "active" and "receive" within each time
    slot. Failure to do results in a buffer overrun condition (Section 3.6.3).

    请问一下我应该怎么做才能使得,DMA write data to each serializer ..within each time slot?

    下面是我的MCASP配置

    mcasp->regs->GBLCTL = 0; // Reset
    mcasp->regs->RGBLCTL = 0; // Reset RX
    mcasp->regs->XGBLCTL = 0; // Reset TX
    mcasp->regs->PWRDEMU = 1; // Free-running

    // RX
    mcasp->regs->RMASK = 0xffffffff; // No padding used
    mcasp->regs->RFMT = 0
    | (0x2<<16) //2延时
    | (1 <<15) //先接收MSB
    | (0x0<<13) //pad extra bits with 0
    | (0x0<<8) //pad with bite 0 value
    | (0xf<<4) //接收slot的长度为32位
    | (0 <<3) //读取的XRBUF源于DMA,忽略外围引脚接口
    | (0 <<0); //不进行向右旋转;
    // MSB 16bit, 2-delay, pad 0, DMA

    mcasp->regs->AFSRCTL = 0
    | (0x2<<7) //2个时隙TDM模式,
    | (1<<4) //接收帧长一个字,
    | (1<<1) //内部产生发送帧同步信号,
    | (0<<0); //AFSX的上升沿代表一个帧的开始

    mcasp->regs->ACLKRCTL = 0x000000A4; // Rising INTERNAL CLK,(from tx side), 5分频,1010 0100
    mcasp->regs->AHCLKRCTL = 0x00008000; // INT CLK (from tx side) 1000 0000 0000 0000
    mcasp->regs->RTDM = 0x00000003; // Slots 0, 1
    mcasp->regs->RINTCTL = 0x00000000; // Not used
    mcasp->regs->RCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
    mcasp->regs->REVTCTL = 0;

    // TX
    mcasp->regs->XMASK = 0xffffffff; // No padding used
    mcasp->regs->XFMT = 0
    | (0x2<<16) //2延时
    | (1 <<15) //先接收MSB
    | (0x0<<13) //pad extra bits with 0
    | (0x0<<8) //pad with bite 0 value
    | (0xf<<4) //接收slot的长度为32位
    | (0 <<3) //读取的XRBUF源于DMA,忽略外围引脚接口
    | (0 <<0); //不进行向右旋转;
    // MSB 16bit, 2-delay, pad 0, DMA
    mcasp->regs->AFSXCTL = 0
    | (0x2<<7) //2个时隙TDM模式,
    | (1<<4) //接收帧长一个字,
    | (1<<1) //内部产生发送帧同步信号,
    | (0<<0); //AFSX的上升沿代表一个帧的开始

    mcasp->regs->ACLKXCTL = 0x00000064; // ASYNC, Rising INTERNAL CLK, div-by-5 0110 0100
    mcasp->regs->AHCLKXCTL = 0x00008000; // INT CLK
    mcasp->regs->XTDM = 0x00000003; // Slots 0, 1
    mcasp->regs->XINTCTL = 0x00000000; // Not used
    mcasp->regs->XCLKCHK = 0x00FF0008; // 255-MAX 0-MIN, div-by-256
    mcasp->regs->XEVTCTL = 0;

    mcasp->regs->SRCTL0 = 0x000E; // MCASP0.AXR0[0] --> DIN
    mcasp->regs->SRCTL1 = 0x000E; // MCASP0.AXR0[1] --> DIN
    mcasp->regs->SRCTL2 = 0x000D; // MCASP0.AXR0[2] <-- DOUT
    mcasp->regs->SRCTL3 = 0x000D; // MCASP0.AXR0[3] <-- DOUT

    mcasp->regs->PFUNC = 0; // All MCASPs
    mcasp->regs->PDIR = 0xB400000C; // All inputs except ACLKR0, ACLKX0, AFSR0, AFSX0, AXR[2],AXR[3]

    mcasp->regs->DITCTL = 0x00000000; // Not used
    mcasp->regs->DLBCTL = 0x00000000; // Not used
    mcasp->regs->AMUTE = 0x00000000; // Not used

    // Starting sections of the McASP
    mcasp->regs->XGBLCTL |= GBLCTL_XHCLKRST_ON; // HS Clk
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XHCLKRST_ON ) != GBLCTL_XHCLKRST_ON );

    mcasp->regs->RGBLCTL |= GBLCTL_RHCLKRST_ON; // HS Clk
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RHCLKRST_ON ) != GBLCTL_RHCLKRST_ON );

    mcasp->regs->XGBLCTL |= GBLCTL_XCLKRST_ON; // Clk
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XCLKRST_ON ) != GBLCTL_XCLKRST_ON );
    mcasp->regs->RGBLCTL |= GBLCTL_RCLKRST_ON; // Clk
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RCLKRST_ON ) != GBLCTL_RCLKRST_ON );

    /* setup_edma_pingpong_rcv(mcasp_rcv_register, rcv_ping_L, rcv_pong_L,
    rcv_ping_R, rcv_pong_R,
    BYTES_PER_SAMPLE, SAMPLES_PER_BUF);

    setup_edma_pingpong_xmt(xmt_ping_L, xmt_pong_L,
    xmt_ping_R, xmt_pong_R, mcasp_xmt_register,
    BYTES_PER_SAMPLE, SAMPLES_PER_BUF);
    */

    // LOG_printf(&trace, "[audio TSK]: set up EDMA fine!");

    // EdmaEnableChannel(EDMA_MCASPRXCH, 0);
    // EdmaEnableChannel(EDMA_MCASPTXCH, 0);

    // LOG_printf(&trace, "[audio TSK]: EDMA channel enabled!");

    // EdmaIntEnable(EDMA_RCV_PING_TCC);
    // EdmaIntEnable(EDMA_RCV_PONG_TCC);
    // EdmaIntEnable(EDMA_XMT_PING_TCC);
    // EdmaIntEnable(EDMA_XMT_PONG_TCC);


    mcasp->regs->XSTAT = 0x0000ffff; // Clear all
    mcasp->regs->RSTAT = 0x0000ffff; // Clear all

    mcasp->regs->XGBLCTL |= GBLCTL_XSRCLR_ON; // Serialize
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSRCLR_ON ) != GBLCTL_XSRCLR_ON );
    mcasp->regs->RGBLCTL |= GBLCTL_RSRCLR_ON; // Serialize
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSRCLR_ON ) != GBLCTL_RSRCLR_ON );

    // Write a 0, so that no underrun occurs after releasing the state machine
    mcasp->regs->XBUF2 = 0;
    mcasp->regs->XBUF3 = 0;
    mcasp->regs->RBUF0 = 0;
    mcasp->regs->RBUF1 = 0;


    mcasp->regs->XGBLCTL |= GBLCTL_XSMRST_ON; // State Machine
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XSMRST_ON ) != GBLCTL_XSMRST_ON );
    mcasp->regs->RGBLCTL |= GBLCTL_RSMRST_ON; // State Machine
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RSMRST_ON ) != GBLCTL_RSMRST_ON );

    mcasp->regs->XGBLCTL |= GBLCTL_XFRST_ON; // Frame Sync
    while ( ( mcasp->regs->XGBLCTL & GBLCTL_XFRST_ON ) != GBLCTL_XFRST_ON );
    mcasp->regs->RGBLCTL |= GBLCTL_RFRST_ON; // Frame Sync
    while ( ( mcasp->regs->RGBLCTL & GBLCTL_RFRST_ON ) != GBLCTL_RFRST_ON );
    // LOG_printf(&trace, "[MCASP]: mcasp finished...");

    // if(mcasp->regs->RSTAT & 00000001==1)
    // mcasp->regs->RSTAT = 0x0000ffff;

    }

    //------------------------------------------------------------------------------
    // End of File mcasp.c
    //------------------------------------------------------------------------------

  • 终于不溢出了!哈哈!

    在mcasp里的配置是一方面,另一方面是edma3的传输,在mcasp初始化后第一个帧同步事件发生数据就开始传输了,一次需要传输完所有的引脚上的数据,如果数据格式是32位的话,那么在edma3中的acnt应该设置为8个字节!

    哈哈!

    虽然还没有调试好,我还没想好怎么测试这些配置,但是终于不!溢!出!了!