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.

[参考译文] CCS/TMS320C6748:EDMA3

Guru**** 2538930 points
Other Parts Discussed in Thread: ADS4245

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/816331/ccs-tms320c6748-edma3

器件型号:TMS320C6748
主题中讨论的其他器件:ADS4245

工具/软件:Code Composer Studio

我想在两个16位 GPIO 输入数据字上使用 EDMA3。 在阅读完 EDMA3之后、它看起来很简单、但我不确定输入数据的易失性方面是否会阻止使用 EDMA3。  具体而言、两个16位值来自 ADS4245。  目标是将它们传输到存储器。  我的问题是、如果我指定元件尺寸2、EDMA3是否会读取16位数量、以便波动性方面不会干扰正确的读数。  请说明。

谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    其他问题:

    EDMA3是 n 到 n 的传输。  我要尝试实现的是1到 n 传输。  有没有技巧可以做到这一点吗?  具体而言、我希望能够连续读取16位端口16次并传输到连续的16位存储器位置。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Peter、

    是的、通过适当设置计数和索引值、可以使用 EDMA3执行1到 n 传输。

    您可以通过设置 SRCBIDX = 0; DSTBIDX = 2; SRCCIDX=0;DSTCIDX=0和 ACNT=1;BCNT =#transfer 和 CCNT=0 (大小为2)并在 A 同步传输模式下由外设触发传输来实现此目的。

    有关更多详细信息、请参阅 https://training.ti.com/using-c6000-edma3-overview-12-15?cu=1134423 和以下三个视频以及 EDMA3用户指南 SPRUGS5B

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢、但后续问题:

    ACNT = 2对于我的上下文、因为读取的值为16位宽。

    不应该 CCNT = 1?

    请澄清"CCNT=0、大小为2并传输"的含义。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Peter、

    您是否能够根据 Sudhanshu 的指导在 C6748上为您的 GPIO 输入设置 EDMA 传输、或者您是否需要有关此问题的进一步帮助。  

    对于16位传输、将 ACNT=2、CCNT =1和 BCNT 设定为16位字的数量、此时 SRCIDX=0、DSTIDX=2且 bcntreload=0。  CCNT 保留要传输的 aCnt*bcnt 字节的帧数,因此必须按照我的理解将其设置为1而不是0。

    此致、

    Rahul

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢。  我还没有尝试过。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    最后、我们将尝试 QDMA。  不起作用:(

    我的计划如下:

    使用 QDMA 通道0从16位 GPIO 端口读取16次、并将读数保存在一组16位字中。

    在 POR 之后、我按如下方式对其进行设置:

    //参数块

    #define PARAM_START 0x01c04000
    #define PARAM_SET_0 0x4000
    #define param_set_1 (param_set_0 + 32)
    #define param_set_2 (param_set_1 + 32)
    #define RF_IN (SOC_GPIO_0_regs + 0x70)
    #define NO_LINK 0xFFFF

    #define QCHMAP0 0x01c00200
    #define QER 0x01c01080
    #define QEER 0x01c01084
    #define QEECR 0x01c01088
    #define QEESR 0x01c0108c

    #define IER 0x01c01050
    #define IECR 0x01c01058
    #define IESR 0x01c01060
    #define IPR 0x01c01068
    #define ICR 0x01c01070
    #define RFDMA_READY (HWREG (IPR)& 0x00000001)

    struct __attribute__(__packed__) T_Param {
    //在下方保留声明顺序!
    uint32 op;
    uint32 src;
    uint16 acnt;
    uint16位;
    uint32 dst;
    uint16 srcbidx;
    uint16 dstbidx;
    uint16链接;
    uint16 bcntrld;
    uint16 srccidx;
    uint16 dstcidx;
    uint16 ccnt;
    uint16 rsvd;
    };

    int16 rf_readings[16];

    #pragma LOCATION (DATA_PARARAM、PARAM_START)
    struct __attribute__(__packed__) T_param data_param;
    //====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================

    bool QDMA_DONE(){
    返回(RFDMA_READY);

    //====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================

    空 InitQDMA(){


    int i;
    对于(i=0;i<16;i++){
    RF_readings[i]= 0;

    //启用 QDMA 通道0
    HWREG (QEESR)= 0x00000001;
    //清除中断状态
    HWREG (ICR)= 0x00000001;
    //设置中断使能
    HWREG (IESR)= 0x00000001;
    //初始化参数集0
    DATA_PARAM.src = RF_IN;
    DATA_PARAM.acnt = 2;
    DATA_PARAM.bcnt = 16;
    DATA_PARAM.srcbidx = 0;
    data_param.dstbidx = 2;
    DATA_PARAM.bcntrld = 0;
    DATA_PARAM.srccidx = 0;
    DATA_PARAM.dstcidx = 0;
    DATA_PARAM.ccnt = 1;
    DATA_PARAM.DST =(uint32)&Rf_readings;
    data_param.link = no_link;
    //触发字;必须是函数中的最后一条赋值语句
    DATA_PARAM.OPT = 0x00100008;//TCINTEN = 1、STATIC = 1
    然后、在 while (1)循环中、我调用 QDMA_DONE()以检查 IPR 的位0。  如果该位置位、我将处理数据。  然后,调用 InitQDMA()来重复该过程。  它似乎还不起作用。  什么似乎缺失或不正确?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    要进行调试、我正在监控 CCS 中的 QDMA 寄存器、但看不到它们的内容发生变化。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我创建的 QDMA 设置不起作用。  需要帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    有关我遇到的问题的详细信息、请参阅我的回复。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    向前迈进了一步。  在 C6748 DSP 中为 EDMA3启用电源模块后、我能够通过将 QEESR.0设置为1来设置 QEER.0。  当触发字(在我的案例中为 OPT)作为参数中的最后一项写入时、没有发生任何情况。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Peter、

    由于您的问题已在此处得到解决、我将在此关闭您的问题:

    https://e2e.ti.com/support/processors/f/791/p/824566/3053446#3053446

    此致、

    Rahul