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.

关于AM335x的eCAP模块作为捕获使用的例子



如题,是否可以提供am335x的ecap单元作为捕获使用时的例子,谢谢。

  • 找了很多资料,都是ecap作为apwm使用的例子

  • 目前驱动层的架构是完整的,上层实现都是模拟PWM的,如果改为捕获模式,要按照TRM的描述去做改动。

  • 我按照自己的理解,和TRM的描述,感觉所有的配置都设置了,但是问题有两个,我用CAP0_in_pwm_out引脚作为输入,配置mux为

        {"ecap0_in_pwm0_out.ecap0_in_pwm0_out",    OMAP_MUX_MODE0 | AM33XX_SLEWCTRL_FAST | AM33XX_PIN_INPUT},

    实际的测试信号为周期=560us的方波,可以通过示波器测试到信号输出,加到ecap0_in_pwm0_out后,没有发生我希望看到的捕捉和相应的中断;

    另一个问题是,捕捉计数器如果直接初始化为‘0’的话,计数器即使初始化为“free_run”模式,也不是有计数增加,如果初始化为非‘0’,技术会从当前输出开始增加,数值增加到溢出后归零,计数将不会在增加,计数器模式整个过程过没有被设置为停止模式。

    请问是否可以提供给我一个初始化完整的例子,采用中断方式获取捕获周期的例子。谢谢

  • 我在网上搜到了一个驱动,应该是TI其他CPU的,但是功能实现是一样的,你先参考下:

    http://arago-project.org/git/projects/?p=linux-davinci.git;a=commit;h=be6a391fe9ff16bca78f908c7a08fc77e9f0c683

  • 在这个文件的启发下,现在可以实现捕获功能了,谢谢

  • 具体是修改的哪里你可以总结下,因为很多人都在问eCAP捕获的事情,谢谢。

  • 我跟踪了一下,发现主要问题在于ecap的模式设置始终不正确,正确设置为cap模式就可以了。

    系统提供的函数,我重新写了一下,就正确了,不知道是怎么回事。

    void ECAPOperatingModeSelect(unsigned int baseAdd, unsigned int modeSelect)
    {
        unsigned short ecctl2 = HWREGH(baseAdd + ECAP_ECCTL2);
        if(modeSelect)
        {
            ecctl2 &= ~ECAP_ECCTL2_CAP_APWM;
    //         HWREGH(baseAdd + ECAP_ECCTL2) &= ~ECAP_ECCTL2_CAP_APWM;
        }
        else
        {
            ecctl2 |= ECAP_ECCTL2_CAP_APWM;
    //         HWREGH(baseAdd + ECAP_ECCTL2) |=  ECAP_ECCTL2_CAP_APWM;
        }
        HWREGH(baseAdd + ECAP_ECCTL2) =  ecctl2;
    }

  • 请问这是startware下的代码么?

  • void ECAPOperatingModeSelect(unsigned int baseAdd, unsigned int modeSelect)
    {
        if(modeSelect)
        {
             HWREGH(baseAdd + ECAP_ECCTL2) &= ~ECAP_ECCTL2_CAP_APWM;
        }
        else
        {
             HWREGH(baseAdd + ECAP_ECCTL2) |=  ECAP_ECCTL2_CAP_APWM;
        }
    }

    这个是starterware下的代码