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.

[参考译文] LAUNCHXL-F28377S:将所有 eCap 与 SWSYNC 同步

Guru**** 2487425 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/647283/launchxl-f28377s-synchronize-all-ecaps-with-swsync

器件型号:LAUNCHXL-F28377S

大家好、

我尝试测量一些输入信号的时间差。 因此、我想使用 F28377S 的 ECAP 外设。 在论坛中浏览了几个主题后、我找不到我的应用程序的问题。

我按如下所示配置所有滤波器:

void eCaps_init (void)
{
gpioInit();
EALLOW;

SYSCTL_setSyncInputConfig (SYSCTL_SYNC_IN_ECAP1、SYSCTL_SYNC_IN_SRC_EPWM10SYNCOUT);
SYSCTL_setSyncInputConfig (SYSCTL_SYNC_IN_ECAP4、SYSCTL_SYNC_IN_SRC_ECAP1SYNCOUT);

for (unsigned I = 0;I < DIM (ECAP_BASes);+I)
{
singleEcapInit (ECAP_BASESS[i]);
}

irqInit();
EDIS;
} 
静态空 singleEcapInit (uint32_t base)
{
eCAP_disableInterrupt (base、all_eCAP_Events);
ECAP_clearInterrupt (base、all_ECAP_Events);

eCAP_stopCounter (base);
eCAP_disableTimeStampCapture (基本);

eCAP_setPhaseShiftCount (base、0U);
eCAP_enableLoadCounter (base);
ECAP_setSyncOutMode (base、ECAP_SYNC_OUT_SYNCI);

ECAP_setCaptureMode (base、ECAP_Continuous_capture_mode、ECAP_EVENT_4);

ECAP_setEventPolarity (base、ECAP_EVENT_1、ECAP_EVNT_FALLING_EDGE);
eCAP_setEventPolarity (base、eCAP_EVENT_2、eCAP_EVNT_RISTING);
ECAP_setEventPolarity (base、ECAP_EVENT_3、ECAP_EVNT_FALLING_EDGE);
eCAP_setEventPolarity (base、eCAP_EVENT_4、eCAP_EVNT_RISTING);

eCAP_disableCounterResetOnEvent (base、eCAP_EVENT_1);
eCAP_disableCounterResetOnEvent (base、eCAP_EVENT_2);
eCAP_disableCounterResetOnEvent (base、eCAP_EVENT_3);
eCAP_disableCounterResetOnEvent (base、eCAP_EVENT_4);

eCAP_enableCaptureMode (base);
eCAP_enableTimeStampCapture (基本);
ECAP_enableInterrupt (base、USE_ECAP_IRQ);

eCAP_startCounter (base);
} 

计数器按预期运行、但当我想通过设置 ECap1Regs.ECCTL2.SWSYNC 来同步 eCap 时、ECAP 1复位。

如果我对 ECap2Regs.ECCTL2.SWSYNC 执行相同的操作、则仅 eCAP2复位(而不是 eCAP3)->由于我可以复位 eCAP2、我假设 SYNCI_EN 正常、故障是来自 eCAP1的信号没有在 SYNCO_SEL 中配置的提升板?
来自 SWSYNC 的 Technical_Reference_Manual:写入1会强制当前模块和任何模块的 TSCTR 影子加载下游、前提是 SYNCO_SEL 位为0、0。

我对所有 eCap 都具有以下配置(如 CCS 内的"Registers"视图所示):

CTRPHS   0x00000000   计数器相位偏移值寄存器[存储器映射]
ECCTL1   0x0111   捕捉控制寄存器1 [存储器映射]
ECCTL2   0x0036   捕捉控制寄存器2 [存储器映射]
ECEINT   0x003E   捕捉中断使能寄存器[存储器映射]

对于同步、我假设以下位是最相互交错的位(也取自调试视图):

SYNCO_SEL   00   同步输出模式
SYNCI_EN   1   计数器同步选择

我获得中断、就像我希望它们与其他任何东西一起使用一样。 只有同步失败。

为了按我的打算使用 SYNC_OUT、我还需要注意其他事项吗?

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

    您可以按照以下顺序同步所有6个 eCAP、以捕获时间戳。

    ECap1Regs.ECCTL2.bit.SYNCI_EN = 1;//启用同步输入*/
    ECap1Regs.ECCTL2.bit.SYNCO_SEL = 0;/*直通*/

    ECap2Regs.ECCTL2.bit.SYNCI_EN = 1;//启用同步输入*/
    ECap2Regs.ECCTL2.bit.SYNCO_SEL = 0;/*直通*/

    ECap3Regs.ECCTL2.bit.SYNCI_EN = 1;//启用同步输入*/
    ECap3Regs.ECCTL2.bit.SYNCO_SEL = 0;/*直通*/

    ECap4Regs.ECCTL2.bit.SYNCI_EN = 1;//启用同步输入*/
    ECap4Regs.ECCTL2.bit.SYNCO_SEL = 0;/*直通*/

    ECap5Regs.ECCTL2.bit.SYNCI_EN = 1;//启用同步输入*/
    ECap5Regs.ECCTL2.bit.SYNCO_SEL = 0;/*直通*/

    ECap6Regs.ECCTL2.bit.SYNCI_EN = 1;//启用同步输入*/
    ECap6Regs.ECCTL2.bit.SYNCO_SEL = 0;/*直通*/

    EALLOW;
    SyncSockRegs.SYNCSELECT.bit.ECAP4SYNCIN = 4U;
    EDIS;

    /*同步所有 ECAP */
    EALLOW;
    ECap1Regs.ECCTL2.SWSYNC = 1U;
    EDIS;

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

    感谢您的回复。

    我尝试了如下操作(我提取了代码进行字符串操作和等待):

    InitECapure (ECap1Regs);
    InitECap2Regs (ECap2Regs);
    
    ECap1Regs.ECCTL2.bit.SYNCI_EN = 1;//启用同步 in*/ECap1Regs.ECTL2.bit.SYNCO_SEL
    = 0;//通过 SYNC2RECO/SYNC2EN.SYNECL2.EN.SYNECL2.SYECL2.SYNC_EN=0*
    
    
    
    
    
    
    
    
    ;SYNECL4.SYNECL4.SYNECL2.SYNECL2.SYNC_EN.SYNECL2.SYNECL2.SYNC_EN.EN.EN.EN.EN.SYNECL2.SYNECTREN.EN.EN.EN.SYNECTREN.EN.EN.EN.EN.EN.EN.SYNECTREN.EN.SY
    
    EALLOW;
    ECap1Regs.ECCTL2.bit.SWSYNC = 1U;
    EDIS;
    
    const uint32_t ecap1tsctr = ECap1Regs.TSCTR;
    const uint32_t ecap2tsctr = ECap2Regs.TSCTR;
    
    printf ("ECAP1:%X"、ecap1tsctr);
    printf ("ECAP2:%X"、ecap2tsctr);
    
    delay();
    }
    

    并接收以下内容:

    eCAP1:1.
    ECAP2:32A
    eCAP1:1.
    ECAP2:2987C45
    eCAP1:1.
    ECAP2:53DA2C6
    eCAP1:1.
    ECAP2:7E2C949
    eCAP1:1.
    (笑声)

    eCAP1会按我的需要重置,但 ECAP2不会重置:(

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

    您好、Alexander、

    您能否向我发送完整代码(以及之前使用的所有初始化函数)? 我可以在最后尝试一下、看看发生了什么。  

    此致、

    Nirav

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


    #include "F28x_Project.h" static void InitECapture (volatile ECAP_regs & ECAP); static void output_init (void); static char * u32_TO_hex (uint32_t dat、char * pout); static void output_put_put(const char * pData); void main (void main (void) {void)} InitSysCtrl(); InitGpio(); EALLOW; GpioCtrlRegs.GPADIR.bit.GPIO12=1; EDIS; output_init(); //关闭 LED GpioDataRegs.GPADAT.bit.GPIO12=1; InitECap1Gpio(14); GPIO_SetupPinOptions (14、GPIO_INPUT、GPIO_异 步); InitECap2Gpio(15); GPIO_SetupPinOptions (15、GPIO_INPUT、GPIO_异 步); InitECapture (ECap1Regs); InitECapture (ECap2Regs); ECap1Regs.ECCTL2.bit.SYNCI_EN = 1;//启用同步输入*/ ECap1Regs.ECCTL2.bit.SYNCO_SEL = 0;/*直通*/ ECap2Regs.ECCTL2.bit.SYNCI_EN = 1;//启用同步输入*/ ECap2Regs.ECCTL2.bit.SYNCO_SEL = 0;/*直通*/ ECap3Regs.ECCTL2.bit.SYNCI_EN = 1;//启用同步输入*/ ECap3Regs.ECCTL2.bit.SYNCO_SEL = 0;/*直通*/ ECap4Regs.ECCTL2.bit.SYNCI_EN = 1;//启用同步输入*/ ECap4Regs.ECCTL2.bit.SYNCO_SEL = 0;/*直通*/ ECap5Regs.ECCTL2.bit.SYNCI_EN = 1;//启用同步输入*/ ECap5Regs.ECCTL2.bit.SYNCO_SEL = 0;/*直通*/ ECap6Regs.ECCTL2.bit.SYNCI_EN = 1;//启用同步输入*/ ECap6Regs.ECCTL2.bit.SYNCO_SEL = 0;/*直通*/ EALLOW; SyncSockRegs.SYNCSELECT.bit.ECAP4SYNCIN = 4U; EDIS; 字符输出[100]; while (1) { EALLOW; ECap1Regs.ECCTL2.bit.SWSYNC = 1U; EDIS; const uint32_t ecap1tsctr = ECap1Regs.TSCTR; const uint32_t ecap2tsctr = ECap2Regs.TSCTR; output_puts ("ECAP1:"); char * p = u32_TO_hex (ecap1tsctr、输出); *p ='\0'; output_puts (output); output_puts ("\n"); output_puts ("ECAP2:"); p = u32_TO_hex (ecap2tsctr、输出); *p ='\0'; output_puts (output); output_puts ("\n"); //打开 LED GpioDataRegs.GPADAT.bit.GPIO12=0; //延迟一位。 for (uint32_t delay = 0;delay < 2000000;delay++){} //关闭 LED GpioDataRegs.GPADAT.bit.GPIO12=1; //延迟一位。 for (uint32_t delay = 0;delay < 2000000;delay++){} } } // InitECapture -初始化 ECAP1配置 静态空 InitECapture (volatile ECAP_regs & ECAP) { eCAP.ECEINT.ALL = 0x0000; //禁用所有捕获__interrupts eCAP.ECCLR.ALL = 0xFFFF; //清除所有 CAP _interrupt 标志 eCAP.ECCTL1.bit.CAPLDEN = 0; //禁用 CAP1-CAP4寄存器加载 eCAP.ECCTL2.bit.TSCTRSTOP = 0; //确保计数器已停止 // //配置外设寄存器 eCAP.ECCTL2.bit.CONT_ONESHT = 0;//单次触发 eCAP.ECCTL2.bit.STOP_Wrap = 3; //在4个事件时停止 eCAP.ECCTL1.bit.CAP1POL=1; //下降沿 eCAP.ECCTL1.bit.CAP2POL=0; //上升沿 eCAP.ECCTL1.bit.CAP3POL=1; //下降沿 eCAP.ECCTL1.bit.CAP4POL=0; //上升沿 eCAP.ECCTL1.bit.CTRST1 = 0; //差动运算 eCAP.ECCTL1.bit.CTRST2 = 0; //差动运算 eCAP.ECCTL1.bit.CTRST3 = 0; //差动运算 eCAP.ECCTL1.bit.CTRST4 = 0; //差动运算 eCAP.ECCTL2.bit.SYNCI_EN = 1; //启用同步输入 eCAP.ECCTL2.bit.SYNCO_SEL = 0; //直通 eCAP.ECCTL1.bit.CAPLDEN = 1; //启用捕捉单元 eCAP.ECCTL2.bit.TSCTRSTOP = 1; //开始计数器 eCAP.ECCTL2.bit.rearm = 1; // ARM 单次触发 eCAP.ECCTL1.bit.CAPLDEN = 1; //启用 CAP1-CAP4寄存器加载 } 静态 char * u32_to_hex (uint32_t dat、char * pout) { 静态 const char nibble_to_hex[16]={'0'、'1'、'2'、'3'、'4'、 '5'、'6'、 '7'、'8'、'9'、'A'、'B'、 'C'、'D'、'E'、'F'}; bool isWritten = false; uint32_t cur_nibble = dat >>(32 - 4); if (cur_半 字节) { *pout =半字节到十六进制[cur_半 字节]; ++pout; isWritten = true; } for (int i =(32 - 8);i >=0;i -= 4) { CUR_nibble =(dat >> I)& 0xF; if (cur_nibble || isWritten) { *pout =半字节到十六进制[cur_半 字节]; ++pout; isWritten = true; } } /*如果尚未写入任何内容,我们将写入0 */ if (!isWritten) { *pout ='0'; ++pout; } 返回 pout; } 静态 void output_init (void) { GPIO_SetupPinMux (84、GPIO_MUX_CPU1、5); GPIO_SetupPinOptions (84、GPIO_INPUT、GPIO_PushPull); GPIO_SetupPinMux (85、GPIO_MUX_CPU1、5); GPIO_SetupPinOptions (85、GPIO_OUTPUT、GPIO_异 步); /*初始化 SCI FIFO */ SciaRegs.SCIFFTX.ALL = 0xE040; SciaRegs.SCIFFRX.ALL = 0x2044; SciaRegs.SCIFFCT.all = 0x0; SciaRegs.SCICCR.all = 0x0007;// 1停止位,无回路 //无奇偶校验,8个字符位, //异步模式,空闲线协议 SciaRegs.SCICTL1.all = 0x0003;//启用 TX、RX、内部 SCICLK、 //禁用 RX ERR、睡眠、TXWAKE SciaRegs.SCICTL2.all = 0x0003; SciaRegs.SCICTL2.bit.TXINTENA=0; SciaRegs.SCICTL2.bit.RXBKINTENA=1; // 9600波特 SciaRegs.SCIHBAUD.ALL = 0x0002; SciaRegs.SCILBAUD.ALL = 0x008B; SciaRegs.SCICCR.bit.LOOPBKENA=0;//禁用回路 SciaRegs.SCICTL1.ALL = 0x0023; //从复位中撤回 SCI } 静态空 output_puts (const char * pData) { while (*pData) { while (SciaRegs.SCIFFTX.bit.TXFFST!= 0){} SciaRegs.SCITXBUF.all =*pData; ++pData; } }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    一旦我将 InputXbarRegs.INPUT5SELECT 更改为一些未使用的引脚 I PULLECT、同步就会从 eCAP1传播到 eCAP2。 即使 SyncSockRegs.SYNCSELETC0.bit.ECAP1SYNCIN 设置为0 (PWM1同步输出)。

    最令我吃惊的是、eCAP1会按预期复位、但不会将同步信号传播到 eCAP2...