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.

DM3730 McBSP发送异常EDMA请求

没有使用TI封装的函数,自己编写驱动。

McBSP1配置为从模式,即clkx和fsx均由FPGA提供。目的是使用EDMA从一个buffer中搬移32bit数据到McBSP1的DXR,通过McBSP1接口发送给FPGA。

实际调试过程中先使用CCS(4.2.0.10018)运行DSP版本,后运行FPGA版本。发现DSP代码load下去刚一运行,McBSP1就给EDMA发送了搬移请求,并且EDMA也响应了该请求,查看内存发现搬移的数据也是正确的。

请问各位高手,如何才能阻止McBSP向EDMA发送这种异常的请求?多谢

  • 你好!

    1.

    没有使用TI封装函数,指的是 DMA驱动么?

    2.

    一般情况下,外部事件触发EDMA传输的话,需要绑定外部事件,从您的描述来看,

    感觉好像绑定了不合适的事件,导致了意料之外的传输。具体查下看看。

  • 感谢您的回复

    1、确实如您所说,我的EDMA寄存器都是自己手动配置的。

    2、按照手册上的描述

    McBSP的EDMA请求和EDMA通道的关系应该如上图所示。

    我已经调试好了EDMA的接收,使用的是McBSP1和EDMA的通道1,使用的方法如下:

    #define     PER_EDMA_TPCC0_BASEADDR                     (0x01C00000)

    typedef struct T_PER_EDMAReg0_Tag
    {
     volatile UINT32 TPCC_PID;
     volatile UINT32 TPCC_CCCFG;/* 0x01C00004 */
     volatile UINT8  ucPadding1[248];
     volatile UINT32 TPCC_DCHMAP[64];/* 0x01C00100 - 0x01C001FF */
     volatile UINT32 TPCC_QCHMAP[8];/* 0x01C00200-0x01C00220 */
     volatile UINT8  ucPadding2[32];
     volatile UINT32 TPCC_DMAQNUM0;/* 0x01C00240 */
     volatile UINT32 TPCC_DMAQNUM1;
     volatile UINT32 TPCC_DMAQNUM2;
     volatile UINT32 TPCC_DMAQNUM3;
     volatile UINT32 TPCC_DMAQNUM4;
     volatile UINT32 TPCC_DMAQNUM5;
     volatile UINT32 TPCC_DMAQNUM6;
     volatile UINT32 TPCC_DMAQNUM7;
     volatile UINT32 TPCC_QDMAQNUM;/* 0x01C00260 */
        volatile UINT8  ucPadding3[28];
        volatile UINT32 TPCC_QUETCMAP;/* 0x01C00280 */
     volatile UINT32 TPCC_QUEPRI;/* 0x01C00284 */
     volatile UINT8  ucPadding4[120];
     volatile UINT32 TPCC_EMR;/* 0x01C00300 */
     volatile UINT32 TPCC_EMRH;
     volatile UINT32 TPCC_EMCR;
     volatile UINT32 TPCC_EMCRH;
     volatile UINT32 TPCC_QEMR;
     volatile UINT32 TPCC_QEMCR;
     volatile UINT32 TPCC_CCERR;
     volatile UINT32 TPCC_CCERRCLR;
     volatile UINT32 TPCC_EEVAL;/* 0x01C00320 */
     volatile UINT8  ucPadding5[28];
     T_TPCC_DRAE atTpccDrae[8];/* 0x01C00340 - 0x01C0037F */
     volatile UINT32 TPCC_QRAE[8];
     volatile UINT8  ucPadding6[96];
     volatile UINT32 TPCC_Q0E[16];
     volatile UINT32 TPCC_Q1E[16];/* 0x01C00440-0x01C0047F */
     volatile UINT8  ucPadding7[384];
     volatile UINT32 TPCC_QSTAT[2];/* 0x01C00600 -0x01C00607 */
     volatile UINT8  ucPadding8[24];
     volatile UINT32 TPCC_QWMTHRA;/* 0x01C00620 */
     volatile UINT32 TPCC_QWMTHRB;/* 0x01C00624 */
     volatile UINT8  ucPadding9[24];
     volatile UINT32 TPCC_CCSTAT;/* 0x01C00640 */
     volatile UINT8  ucPadding10[444];
     volatile UINT32 TPCC_MPFAR;/* 0x01C00800 */
     volatile UINT32 TPCC_MPFSR;
     volatile UINT32 TPCC_MPFCR;
     volatile UINT32 TPCC_MPPAG;
     volatile UINT32 TPCC_MPPA[8];/* 0x01C00810 - 0x01C0082F */
    }T_PER_EDMAReg0; 

    T_PER_EDMAReg0 *gptPEREDMAReg0 = (T_PER_EDMAReg0 *)PER_EDMA_TPCC0_BASEADDR;

    根据手册中的描述,使用如下寄存器进行通道和触发时间的映射

    使用代码如下:

     gptPEREDMAReg0 ->TPCC_DCHMAP[1] |= 0x00000020;//将EDMA通道1与MCBSP1_DMA_RX绑定

    通过测试,上述代码是有效的;

    于是仿照接收的方式,将EDMA通道0与MCBSP1_DMA_TX绑定,使用如下代码:

    gptPEREDMAReg0 ->TPCC_DCHMAP[0] |= 0x00000000;

    请问这样做有什么问题么?谢谢

     

x 出现错误。请重试或与管理员联系。