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.

[参考译文] TMS320F2.8384万D:攻击了SCI中断帧不匹配

Guru**** 2387080 points
Other Parts Discussed in Thread: C2000WARE, SFRA
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1089489/tms320f28384d-sci-interrupt-frame-mismatch-gets-struck

部件号:TMS320F2.8384万D
主题中讨论的其他部件: C2000WARESFRA

尊敬的团队:

我们有使用TMS320F2.8384万D的定制板,我们通过 使用FIFO RX ISR的SCIA_BASE从外部HMI接收数据。

如果帧匹配 ,则它工作正常。否则,如果帧不匹配 程序被删除,我们将重新启动主板。

例如

正常工作:

这是0到16的数组中的帧

10.02015亿 0万 000 0亿 0万 1.8亿

20.02015亿 0万 000 0亿 0万 1.8亿

不工作(程序卡住)

0亿 0万 0亿 0亿 0万 0亿

000

FF

123.

请在下面查找代码片段。

void initSCIAFIFO ()
 {

          中断注册(INT_SCIA_RX,SCiaRXFIFO);

          Sci_setConfig (SCIA_BASE,DEVICE_LSPCLK_FREQ,11.52万,(SCI_CONFIG_WLEN_8 |)
                                                                 sci_config_stop_one |
                                                                 sci_config_par_none);
          sci_enableModule (scia_base);
          Sci_resetChannels (SCIA_BASE);
          sci_enableFIFO (scia_base);
          中断启用(INT_SCIA_RX);
          Sci_enableInterrupt (SCIA_BASE,SCI_INT_RXFF);
          SCI_DisableInterrupt (SCIA_BASE,SCI_INT_RXERR);
          SCI_setFIFO InterruptLevel (SCIA_BASE,SCI_FIFO,TX1,SCI_FIFO,RX1);
          sci_performSoftwareReset(SCIA_base);
          SCI_resetRxFIFO (SCIA_BASE);
          interrupT_clearACKGroup(interrupT_ACK_group9);

 }


//
// sciaRXFIFO - SCIA接收FIFO ISR
//
__interrupt void sciaRXFIFO (void)



   PostTransmission1();
   配方=6 ?SCI_readCharArray(SCIA_base,(uint16_t *)(Display_RX_buf),86): Sci_readCharArray(SCIA_base,(uint16_t *)(Display_RX_buf),16);
   配方=Display_RX_buf[1];

    IF ((Display_RX_buf[0]=SPID[1]&& SPID[1]!=0)||(Display_RX_buf[0]=SPID[2]&&&&SPID[2]!=0)||(Display_RX_buf[0]=SPID[3]&&&SPID[3]&SPID[3]&SPID[2]!=0)|SPID[0)|(RX_buf_0)=SPID[0)|=SPID[0)|=SPID[0)=SPID[0)|(RX_=SPID[0)|=SPID[0)=SPID[0
        {
      check_setting();
        }
   SCI_resetRxFIFO (SCIA_BASE);                                      //清除RxFIFO
   SCI_resetTxFIFO (SCIA_BASE);                                     //清除TxFIFO
   sci_clearOverflowStatus (scia_base);                             //清除溢出状态
   SCI_clearInterruptStatus (SCIA_BASE,SCI_INT_RXFF|SCI_INT_RXERR);//清除中断RX状态
   interrupT_clearACKGroup(interrupT_ACK_group9);                  //清除中断

}

对于不匹配的帧,我们实施了下面的代码来清除中断和基本以及接收器缓冲区变量(Display_RX_buf[1])。例如,如果Display_RX_buf不匹配中的函数代码,我们将清除中断。

但是仍然有问题。 请指导我们解决这个问题。提前感谢您的指导。


   IF ((Display_RX_buf[1]=0 && Display_RX_buf[0]=0)||( Display_RX_buf[0]>=20 && Display_RX_buf[1]>=20))
   {
       SCI_clearInterruptStatus (SCIA_BASE,SCI_INT_RXFF|SCI_INT_RXERR);//清除中断RX状态
       SCI_resetRxFIFO (SCIA_BASE);
       reset_Display_TX_buf();
       SCI_resetTxFIFO (SCIA_BASE);
       sci_clearOverflowStatus (scia_base);                             //清除溢出状态
       interrupT_clearACKGroup(interrupT_ACK_group9);
       reset_Display_RX_buf();
   }

Rgds

Sunil Raj

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

    您好,Sunil,


    感谢您的提问!

    我已针对类似问题编写了常见问题线程,这可能有助于将问题缩小到硬件/软件/配置/等

    https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1031947/faq-my-c2000-sci-is-not-transmitting-and-or-receiving-data-correctly-how-do-i-fix-this</s>2000 2000103.1947万2000

    如果您可以浏览此部分并告诉我哪些问题看起来最相似,并在错误情况下提供屏幕截图,这将使我能够提供最快的支持。

    期待您的回复!

    此致,

    文斯

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

    您好,Vince,

    我们发现了开机时出现的问题,或者 HMI发送FF或00或不同大小的未知原始数据时,在这段时间内会遇到问题。

    主要问题是我们通过调试发现的。  

    如果数组 大小不匹配。"SCI_readCharArray(UINT32_t base, uint16_t * const array, uint16_t length)"

    我们从HMI 数组发送16或86字节大小的数据,从返回12字节。

    假设主板 在网络中接收到11或2或1字节或12字节...处理器被击中...

    这是我们的狙击手代码..

    配方=6 ?SCI_readCharArray(SCIA_base,(uint16_t *)(Display_RX_buf),86): Sci_readCharArray(SCIA_base,(uint16_t *)(Display_RX_buf),5);//

    我们在下面的部分找到了它,请指导我们如何解决阵列大小不匹配问题,

    //*************************************************************************************************
    //
    // SCI_readCharArray
    //
    //*************************************************************************************************
    无效
    SCI_readCharArray (UINT32_t base,uint16_t * const array,uint16_t length)

    //
    //检查参数。
    //
    Assert (SCI_isBaseValid (base));

    uINT16_t i;
    //
    //检查是否启用了FIFO增强功能。
    //
    IF (SCI_isFIFO (BASE))

    //
    // FIFO已启用。
    //用于循环读取(阻止)'length'字符数
    //
    对于(I = 0U;I <长度;I++)

    //
    //等待,直到接收FIFO中有一个字符可用。
    //
    while (SCI_getRxFIFO状态(基础)== SCI_FIFO RX0)

    }

    //
    //从接收缓冲区返回字符。
    //
    array[i]=(uint16_t)
    (HWREGH (BASE + SCI_O_RXBUF)和SCI_RXBUF_SAR_M);
    }
    }
    否则

    //
    //未启用FIFO。
    //用于循环读取(阻止)'length'字符数
    //
    对于(I = 0U;I <长度;I++)

    //
    //等待,直到接收缓冲区中有一个字符可用。
    //
    while (!SCI_isDataAvailableNonFIFO (base))

    }

    //
    //从接收缓冲区返回字符。
    //
    array[i]=(uint16_t)
    (HWREGH (BASE + SCI_O_RXBUF)和SCI_RXBUF_SAR_M);
    }
    }
    }

     

    Rgds

    Sunil

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

    请在Excel工作表中查找错误。


    e2e.ti.com/.../Docklight-serial-software-to-board-rs485.xlsx

     

    Rgds

    Sunil

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

    您好,Vince,

       正如我前面提到的,我们使用 HMI连接两个从属设备。

      我们正在使用  SCI_readCharArray(SCIA_base,(uint16_t *)(Display_RX_buf),16);driverlib API函数 从HMI读取16字节的卡萨达。问题得到结构。我们还在每次发送时将接收状态寄存器RX_WAKE DETECT标志=1确定为。

    1.我们给两个奴隶发了8个地址,我们的问题没有解决

    2.当我们收到一个与 16字节不匹 配的单字节或错误字节时,readchar数组函数等待缓冲区填充。

    3.接下来,当我们发送一个字节的16个字节时,该单字节未覆盖阵列的其余部分将填充16个字节,它将变得不匹配。

    在本例中,我们观察到接收器状态regsister RX_error,frame error,BRK_DT 标记为HIGH。

    请帮助我重新解决此问题,将在下一个回复中发送示波器波形。

    谢谢,此致,

    Ajay S  

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

    您好,Ajay,

    如果您有一个方案,其中可以接收的字节数不确定,则不应在没有FIFO的情况下使用“SCI_readCharArray”。 它将在该循环中挂起,直到收到全部字节数(例如,如果"length"变量设置为100,则在读取100个字节数之前,它不会退出读取)。

    要解决此问题,请参阅C2000Ware驱动程序库中的“sci_ex2_looping_interrups.c”示例,位于:

    C2000Ware_version#\driverlib\f2838x\examples\C28x\sci\sci_ex2_looping_interrups.c</s>2838

    注意FIFO的使用方式,以及FIFO被填满时,中断触发。

    这里的主要问题是如果您的字节数可变(例如16到18字节)。 为此,我建议只使用标准中断(无FIFO),每次有来自新字节的中断时,请执行“SCI_readCharBlockingNonFIFO”。

    此致,

    文斯

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

    您好,Vince,

    正如您在前面的回复中建议的那样,我们有更改代码,代码被删除的问题现在还不会出现,而是从  doclight中删除16或86字节,5字节或3字节或18字节数组。在这种情况下,我清除 了array Display_RX_buf[16],如果我的SPID=!1;


       IF (Display_RX_buf[0]!=SPID)
                      {
                        rxsize=0;

                        // reset_base=1;
                          Memset (Display_RX_buf,0,16);
                          Sci_resetChannels (SCIA_BASE);
                              //如果检测到中断或串行端口超时,请重置SCI
                              //--在使用仿真器运行代码时,某些串行端口需要
                              //
                              sci_performSoftwareReset(SCIA_base);
                              reset_base=0;
                      }}

    如WISE,  如果(MDisplay_RX_buf[0]!=SPID)(reset ),如果id不匹配,则重置所有内容,如WISE 2.55025225亿或50.02015亿 0万 000 ...如果从docklight发送, 需要清除sci缓冲区。在Display_RX_buf..首先在第一组中加载2.55025225亿,然后加载50.02015亿 0万。

    开机HMI期间可能会出现垃圾...我们注意到垃圾正在出现...如何清除所有接收缓冲器SCIA基座...

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

    您好,Ajay,

    感谢您的跟进。 我同意,听起来似乎垃圾数据可能来自HMI开机。 如果可能,您可以使用示波器在通电期间查看HMI TX/RX来验证这一点。

    要从SCI清除缓冲区,需要执行以下操作:

    1.读取SCI缓冲区。

    2.(如果使用FIFO)继续读取缓冲区,直到FIFO为空以清除FIFO。

    3.清除所有标记的SCI错误

    4.(可选)可以执行SCI SW重置,只是为了真正确保重新启动。

    如果对上述步骤有任何疑问,请告诉我。

    此致,

    文斯

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

    您好,Vince,

    现在 ,根据您的建议 SCI_readCharBlockingNonFIFO (SCIA_Base,一切都正常;
    根据您的指导,我们在代码中实施了 数字中断计数,如输入的数组大小,如果与我们所需的数组大小和 ID,函数代码匹配,或者我们清除所有内容。

    我们在同一制造中使用了多个型号HMI,我们在串行软件中分析的一个型号在基于 SCI_readCharBlockingNonFIFO (SCIA_BASE)通电时始终发送“00”,我们清除上面提到的所有内容。

    感谢您的宝贵时间和支持,因此我们解决了问题并关闭了此查询。

    谢谢,此致

    Ajay S

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

    您好,Vince,

    当我们通过HMI与两个从属板(TMS320F2.8384万D)通信时,我们再次面临新的问题。
    每隔一秒我们就会请求从属板状态。

    我们有相同的代码,但地址不同。

    HMI最初与2个从属板通信。 有时只有一块板能正常通信,第二块板是在sci中出现3到4个中断之后...后来它不接受中断。我们注意到计时器计数器正在工作...有问题的从属设备不接受中断...

    假设从2板首先通信,其工作正常更新状态到HMI,然后如果从1板通信第二...在 3到4中断后...通信停止...

    我们正在使用晶体20MHz振荡器和 波特率11.52万。请查找init文件

    void init_int()(无效init_int())

    sci_performSoftwareReset(SCIA_base);


    Sci_setConfig (SCIA_BASE,DEVICE_LSPCLK_FREQ,11.52万,(SCI_CONFIG_WLEN_8 |)
    sci_config_stop_two |
    sci_config_par_none);
    Sci_resetChannels (SCIA_BASE);
    SCI_clearInterruptStatus (SCIA_BASE,SCI_INT_RXRDY_BRKDT);
    sci_enableModule (scia_base);
    sci_performSoftwareReset(SCIA_base);
    SCI_enableInterrupt (SCIA_BASE,SCI_INT_TXRDY | SCI_INT_RXRDY_BRKDT);

    中断启用(INT_SCIA_RX);
    interrupT_clearACKGroup(interrupT_ACK_group9);

    EINT;

    }

    基于我们改变的其他论坛  
    device.h文件-->

    #define device_OSCSRC_FREQ 2000万U

    //
    //定义以传递到sysctl_setclock()。 将按如下方式配置时钟:
    // PLLSYSCLK = 20MHz (XTAL_OSC)* 40 (IMULT)/(2 (REFDIV)* 2 (ODIV)* 1 (SYSDIV))
    //
    #define device_setclock_CFG (sysctl_OSCSRC_XTAL | sysctl_IMULT(40)|\
    sysctl_REFDIV(2)| sysctl_ODIV(2)|\
    sysctl_SYSDIV(1)| sysctl_pll_enable |\
    sysctl_dcc_base_1)

    //
    //基于上述device_setclock _CFG的200MHz SYSCLK频率。 更新
    //如果使用不同的时钟配置,则使用以下代码!
    //
    #define DEVICE_SYSCLK_FREQ ((DEVICE_OSCSRC_FREQ * 40)/(2 * 2 * 1))

    //
    // 50MHz LSPCLK频率基于以上DEVICE_SYSCLK_FREQ和默认值
    // 4的低速外设时钟分频器。 如果是,请更新以下代码
    //使用不同的LSPCLK分压器!
    //
    #define DEVICE_LSPCLK_FREQ (DEVICE_SYSCLK_FREQ / 1)

    //
    //定义以传递到sysctl_setAuxClock()。 将按如下方式配置时钟:
    // AUXPLLCLK = 20MHz (XTAL_OSC)* 50 (IMULT)/(2 (REFDIV)* 4 (ODIV)* 1 (AUXPLLDIV))
    //
    #define DEVICE_AUXSETCL_CFG (sysctl_AUXPLL_OSCSRC_XTAL | sysctl_AUXPLL_IMULT(50)|\
    sysctl_REFDIV (2U)| sysctl_ODIV (4U)|\
    sysctl_AUXPLL_DIV_1 | sysctl_AUXPLL_ENABLE |\
    sysctl_dcc_base_0)

    //
    //基于上述DEVICE_AUXSETCLK_CFG的125MHz AUXCLK频率。 更新
    //如果使用不同的时钟配置,请输入以下代码!
    //
    #define DEVICE_AUXCLK_FREQ (((DEVICE_OSCSRC_FREQ * 50)/(2 * 4 * 1))

    基于我们改变的其他论坛  
    device.c文件-->

    sysctl_setLowSpeedClock(sysctl_LSPCLK_prescale_1);

    如果有任何配置错误,请指导我, 并提及上述问题的解决方案...

    提前感谢您的指导。

    Rgds

    Ajay S

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

    您好,Ajay,

    您能否提供C2000在器件不中断时接收的数据的范围捕获? 基本上,是在问题发生时对RX线进行范围捕获。 这将使调试的移动速度更快(因为我们将能够确定配置的错误)。 您提供的配置可以很好地工作,但只能用于接收的特定类型的数据包。

    此致,

    文斯

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

    您好,Vince,

    现在,通过在输入SCI中断时添加下面的代码并清除所有缓冲区变量来解决问题, 以前,当数字节输入并存储在数组中时,我们进行了软件重置,如果不匹配,我们将清除软件 重置。 但现在,我们进行了一次SCI中断 调用, 我们会立即检查 错误,清除所有内容,请在下面找到..

    UINT16_t scistatusbit = SCI_getRxStatus(SCIA_BAC);
    如果((scistatusbit和SCI_RXSTATUS_ERROR)!= 0)

    scicount=0;
    sci_performSoftwareReset(SCIA_base);
    Memset (Display_RX_buf_temp,0105);
    Memset (Display_RX_buf,0105);
    READ_FLAG=0;
    reset_base=0;
    rxsize=0;
    }

    我们已经测试了HMI 与主板工作之间5小时的通信以及状态更新成功

    但请确认,在初始化过程 中,我们实施了"SCI_enableInterrupt (SCIA_BASE,SCI_INT_RXRDY_BRKDT);"  

    但在sci ISR中,我们清除  SCI_clearInterruptStatus(SCIA_Base,SCI_INT_RXFF);  

     请确认  清除 #define SCI_INT_RXFF是否正确       0x10U //!< RX FIFO级别中断

    __interrupt void sciaRXFIFO (void)

    iamhere123=22;
    PostTransmission1();
    recive_data();
    IF ((Display_RX_buf[0]=SPID[1]&& SPID[1]!=0)||(Display_RX_buf[0]=SPID[2]&&&&SPID[2]!=0)||(Display_RX_buf[0]=SPID[3]&&&SPID[3]&SPID[3]&SPID[2]!=0)|SPID[0)|(RX_buf_0)=SPID[0)|=SPID[0)|=SPID[0)=SPID[0)|(RX_=SPID[0)|=SPID[0)=SPID[0

    check_setting();
    }
    SCI_clearOverflowStatus (SCIA_BASE);
    SCI_clearInterruptStatus (SCIA_BASE,SCI_INT_RXFF);
    interrupT_clearACKGroup(interrupT_ACK_group9);
    }

    Rgds

    Ajay S

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

    您好,Ajay,

    如果我正确理解了您的问题,请告诉我,但是"SCI_clearInterruptStatus(SCIA_BASE,SCI_INT_RXFF)"将清除SCI_INT_RXFF。

    此致,

    文斯

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

    您好,Vince,

    是的,  在初始化过程中,我们没有启用 SCI_enableInterrupt (SCIA_BASE,SCI_INT_RXFF);但在清除  SCI_clearInterruptStatus (SCIA_BASE,SCI_INT_RXFF)时。

    是否正确??

    在初始化代码中,我们启用 SCI_enableInterrupt (SCIA_BASE,SCI_INT_RXRDY_BRKDT);

     但在清除  SCI_clearInterruptStatus(SCIA_base, SCI_INT_RXRDY_BRKDT)时 ,SCI通信 以后无法工作。

    1.请确认我们是否应清除 SCI_INT_RXRDY_BRKDT或仅启用中断 就足够了?? 和  

    2。  对于SCI_readCharBlockingNonFIFO (SCIA_BASE),我们必须启用 SCI_enableInterrupt (SCIA_BASE,SCI_INT_RXFF);或者不启用??

    请查找SCI通信初始化和ISR:-  


    void initSCIAFIFO ()

    sci_performSoftwareReset(SCIA_base);
    中断注册(INT_SCIA_RX,SCiaRXFIFO);
    //波特率115.2008万位数据1位停止无奇偶校验位
    Sci_setConfig (SCIA_BASE,DEVICE_LSPCLK_FREQ,11.52万,(SCI_CONFIG_WLEN_8 |)
    sci_config_stop_two |
    sci_config_par_none);
    Sci_resetChannels (SCIA_BASE);
    SCI_clearInterruptStatus (SCIA_BASE,SCI_INT_RXRDY_BRKDT);
    sci_enableModule (scia_base);
    sci_performSoftwareReset(SCIA_base);
    SCI_enableInterrupt (SCIA_BASE,SCI_INT_RXRDY_BRKDT);

    /*#ifdef自动波特
    //
    //执行自动波特锁。
    // SCI期望'A'或'A'来锁定波特率。
    //
    Sci_lockAutobaud (scia_base);
    #endif*/
    中断启用(INT_SCIA_RX);
    interrupT_clearACKGroup(interrupT_ACK_group9);
    EINT;
    }

    中断ISR:-  

    __interrupt void sciaRXFIFO (void)

    iamhere123=22;
    PostTransmission1();
    recive_data();
    IF ((Display_RX_buf[0]=SPID[1]&& SPID[1]!=0)||(Display_RX_buf[0]=SPID[2]&&&&SPID[2]!=0)||(Display_RX_buf[0]=SPID[3]&&&SPID[3]&SPID[3]&SPID[2]!=0)|SPID[0)|(RX_buf_0)=SPID[0)|=SPID[0)|=SPID[0)=SPID[0)|(RX_=SPID[0)|=SPID[0)=SPID[0

    check_setting();
    }
    SCI_clearOverflowStatus (SCIA_BASE);
    SCI_clearInterruptStatus (SCIA_BASE,SCI_INT_RXFF);
    interrupT_clearACKGroup(interrupT_ACK_group9);
    }

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

    您好,答案如下:

    1.是的,所有中断都应在中断退出时清除。  
    2.不使用FIFO时不需要RXFF中断

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

    您好,Vince,  

    感谢您的宝贵支持和时间。 我们在计时器1秒内清除...例如德州仪器(TI)伺服参考代码sfra GUI界面。 现在一切都很好  

    度过美好的一天和周末  

    Rgds

    Ajay S