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.

F28335 ECAP的所有寄存器的值全都不能配置!!!



F28335,在初始化的时候 什么RPWM 什么ADC等等,这些寄存器值的配置完全正确;就是说我给寄存器配多少,它就是多少

但是,当我给F28335的ECAP寄存器配置的时候,ECAP所有的寄存器全部配置不了; 无论是否加了EALLOW等,ECAP的寄存器死活就配置不了,基本上全部为0,一直是0,死活都不给配置!!!!!!!!

是不是有可能DSP坏了???????

任何一个ECAP的寄存器都配置不了,全都是默认值,怎么改都改不了??

请问 这是为什么呢》》???

  • 看看ECAP的外设时钟打开没有。具体在InitSysCtrl()里void InitPeripheralClocks(void)有没有这么几句话

       SysCtrlRegs.PCLKCR1.bit.ECAP3ENCLK = 1;  // eCAP3
       SysCtrlRegs.PCLKCR1.bit.ECAP4ENCLK = 1;  // eCAP4
       SysCtrlRegs.PCLKCR1.bit.ECAP5ENCLK = 1;  // eCAP5
       SysCtrlRegs.PCLKCR1.bit.ECAP6ENCLK = 1;  // eCAP6
       SysCtrlRegs.PCLKCR1.bit.ECAP1ENCLK = 1;  // eCAP1
       SysCtrlRegs.PCLKCR1.bit.ECAP2ENCLK = 1;  // eCAP2

  • 如果怀疑DSP坏了,可以下载个ECAP的例程试试。。比对下,您的程序与例程的初始化部分的区别是什么

  • 你好。

    关于C2000系列的芯片,如果有寄存器配置不上的问题,可能是由如下几个原因:

    (1)外设的CLOCK没有打开。每一个外设都对应一个CLK的使能信号,如果CLK不打开的话,配置该外设所有的寄存器都无效;针对该问题,请确认SysCtrlRegs.PCLKCR1.bit.ECAPxENCLK是否有配置成使能状态;

    (2)所有的EALLOW保护的寄存器在配置之前,要先进入EALLOW状态,配置完毕之后,要EDIS。对于ECAP来说,没有寄存器是EALLOW保护的,所以,基本上不用考虑这个问题;

    (3)有的寄存器是无能写入的,或者是写1清零的那种,对于这种寄存器,即使对寄存器赋值,也不会改变寄存器的内容。

    不知道你是如何得知寄存器不能配置的,但是针对你的情况,我觉得很有可能是你的ECAP的CLK没有打开导致的。

    另外,下面附着我在应用中使用的ECAP1的配置代码,用于产生交流市电过零中断,以此来计算市电的频率:

    void sInitECap(void)
    {
       ECap1Regs.ECEINT.all = 0x0000;             // Disable all capture interrupts
       ECap1Regs.ECCLR.all = 0xFFFF;              // Clear all CAP interrupt flags
       ECap1Regs.ECCTL1.bit.CAPLDEN = 0;          // Disable CAP1-CAP4 register loads
       ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0;        // Make sure the counter is stopped
      
       // Configure peripheral registers
       ECap1Regs.ECCTL1.bit.PRESCALE = 0;    //BYPASS THE prescaler
       ECap1Regs.ECCTL2.bit.CAP_APWM = 0;  //capture mode
       ECap1Regs.ECCTL2.bit.CONT_ONESHT = 1; // Oneshot mode

       ECap1Regs.ECCTL1.bit.CAP1POL = 1;          // Falling edge
       ECap1Regs.ECCTL1.bit.CAP2POL = 1;          // Falling edge
       ECap1Regs.ECCTL1.bit.CAP3POL = 1;          // Falling edge
       ECap1Regs.ECCTL1.bit.CAP4POL = 1;          // Falling edge
      
       ECap1Regs.ECCTL1.bit.CTRRST1 = 0;          // Don't reset the counter
       ECap1Regs.ECCTL1.bit.CTRRST2 = 0;          // Don't reset the counter       
       ECap1Regs.ECCTL1.bit.CTRRST3 = 0;          // Don't reset the counter      
       ECap1Regs.ECCTL1.bit.CTRRST4 = 0;          // Don't reset the counter
             
       ECap1Regs.ECCTL2.bit.SYNCI_EN = 0;         // Disable sync in
       ECap1Regs.ECCTL2.bit.SYNCO_SEL = 0;        // Pass through
      
       ECap1Regs.ECCTL1.bit.CAPLDEN = 1;          // Enable capture loads
       ECap1Regs.ECCTL2.bit.STOP_WRAP = 1;
       ECap1Regs.ECCTL2.bit.REARM = 1;
      
       ECap1Regs.ECEINT.bit.CEVT1 = 1;            // CAP1 trigger the interrupt
       

       ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1;        // Start Counter
     
    }