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.8069万M:SCI中断检测被解释为帧错误

Guru**** 2587345 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/655383/tms320f28069m-sci-break-detection-interpreted-as-framing-error

部件号:TMS320F2.8069万M

您好,

我们代表Daniel Rush发布信息,但Daniel Rush无法将他的查询发布到这个特定论坛。 Daniel将在该帖子上线后收到通知,以便他可以加入并继续讨论。

帖子描述:

当从我的PC发送TX中断信号时,RXST位始终设置为帧错误。 我的中断会在每次中断后重置状态位,但从不设置BKDT标志。 我想使用中断检测来重置处理器。  我已经用逻辑分析器验证了TX-Break信号。


我的外围设备设置如下所示:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    {
    scia = sci_init((void*)scia_base_addr, sizeof(SCI_Obj));
    piHandle = pie_init((void*)pie_base_ADDR, sizeof(pie_Obj));
    sci_enable(scia);
    //协议为11.52万波特,8-N-1。
    scia->SCIHBAUD = BAUD_11.52万>> 8;//设置波特率
    sciA->SCILBAUD = BAUD_11.52万; //设置波特率
    SCI_DisableParity (sciA);
    SCI_setNumStopBits (sciA,SCI_NumStopBits _One);
    SCI_setCharLength (sciA,SCI_CharLength_8_Bits);
    sci_disableLoopBack (sciA);
    
    // FIFO和中断设置
    SCI_enableTxFifo (sciA);
    SCI_enableRxFifo (sciA);
    SCI_enableRxErrorInt(sciA);
    SCI_enableRxInt(sciA);
    SCI_enableTxInt(sci_enableTxInt(sciA);
    
    //启用接口
    SCI_enableRx (sciA);
    SCI_enableTx (sciA);
    
    //启用外设中断
    PIE_enableInt (PiHandle,PIE_GroupNumber_9,PIE_InterruptSource_SCIARX);
    PIE_enableInt (PiHandle,PIE_GroupNumber_9, PIE_InterruptSource_SCIATX);
    }
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Daniel,
    通过以前的实验,我看到了BRKDT的工作。 您将始终收到早于BRKDT的FE。 如果总线被拉低,那么您会想到,它看起来就像另一个设备正在传输所有"低"字符... 直到丢失了停止位,才会出现任何错误(这将触发FE)。

    调查结果:
    当我将SCIRX接地时,我看到RXERROR = BRKDT = FE = 1。 您将RX GPIO强制为低电平多长时间? 您应该需要接收FE,然后在10位后,您应该收到BRKDT。


    注:无法抑制此错误标志。

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

    嗨,Cody,

    我一直在使用minitrem作为串行终端,它允许我打开TX-Break,我可以无限期地将其打开(并验证这只会导致微区的Rx线过低),并出现一系列帧错误,但从未显示BKDT标志。 我曾经想到过一个成帧错误,重置了标志,我会收到一个BKDT标志,但它永远不会被触发。

    谢谢

    丹尼尔·拉什

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

    Daniel,

    请确认我的理解。

    1. 您将RX线设置为低
    2. 您会看到FE。
    3. 您清除了FE和RXERROR标记
    4. 我的猜测是,此时您陷入了一个循环
      1. 清除错误标志,
      2. 接收另一个FE标志
      3. 再次清除并重复

    清除FE/RXERROR标志的唯一方法是重置SCI,这将重置设置BRKDT标志的逻辑。 假设您正在及时处理FE标志(少于10位次数),则您将在检测到BRKDT情况之前重置SCI模块。

    是否在FE上触发中断并重置SCI? 我希望这种情况比BRKDT检测快得多。

    此致,
    科迪  

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

    Cody,

    1. 我发送中断(RX线路低)
    2. 中断已触发
    3. 确认内部
    4. 参见现场系统工程师
    5. 重置SCI
    6. 重新启用SCI
    7. 返回主执行
    8. 在线条仍然较低时的后续中断也是帧错误。

    以下是我的中断的代码片段:

    IF (CHAR_INDEX >= MAX_MESSAGE_LEN){
    char_index =0;
    memset(CMD_buf[write_index],'\0',MAX_MESSAGE_LEN);
    } 否则IF (sciA->SCIRXST & SCI_SCIRXST_BRKDT_Bits){
    //中断检测:检测到中断时重置手柄
    sendDebugMsg("break");
    返回;
    } 否则,如果(sciA->SCIRXST & SCI_SCIRXST_OE_BIT){
    //溢出错误
    // TODO (DJR):这只是丢弃字符可能会在将来更改此设置
    Sci_reset (sci);
    SCI_ENable(scia);
    返回;
    } 否则IF (sciA->SCIRXST & SCI_SCIRXST_FE_Bits){
    //成帧错误
    Sci_reset (sci);
    SCI_ENable(scia);
    // TODO (DJR):这只是丢弃字符可能会在将来更改此设置
    返回;
    } 否则IF (sciA->SCIRXST & SCI_SCIRXST_PE_Bits){
    //奇偶校验错误
    // TODO (DJR):丢弃字符
    Sci_reset (sci);
    sci_enable(scia);
    } 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Daniel,

    FE始终在BRKDT之前发生10位次。 根据代码的编写方式,您可能会在收到BRKDT之前,对每个FE的SCI进行重置。

    要证明这一理论:在FE的else if语句中注释SCI reset和SCI enable行,您应该开始看到BRKDT错误。


    此致,
    科迪  

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

    Cody,

    这也是我的想法之一。 因此,在测试了这个问题之后,它确实会在10位后触发中断检测,但是,SCI_reset的原因是清除错误位,以便可以触发另一个中断,如果不清除这些中断,就会检测到第一个FE错误并进行维修, 然后忽略所有后续中断。 如技术参考中所述,只有设置SW_Reset后,位才会被清除。

    运行调试器时,我可以逐步完成中断,然后在它返回到主代码后,继续步进并观看RXST寄存器,经过一段时间后,BKDT会变高,但无法知道,因为它不会导致中断。 不知道每次收到错误时如何在不重置接口的情况下不断获得中断。

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

    Daniel,  

    是的,您理解正确。 我同意,实施不适合识别"中断检测"。 如果要区分Fes和BRKDT,可以在检测到FE时设置CPU计时器。 CPU计时器应配置为在超过10位数后触发中断。 在中断中,您可以确定是发生了BRKDT还是只发生了FE,然后重置SCI模块并相应地与UART发送器同步。

    我建议您对传输的数据实施某种校验和,这将有助于稳健性。

    解决此问题的另一种方法是定义一系列传输停止数据包(而不是在通信中添加中断),这些数据包在您的数据中不应通用。

    当您发现使用UART的一个缺点 时,所有握手都是由应用程序代码完成的。


    希望它有所帮助,
    科迪  

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

    您可以将您的回复标记为答案! 我不能,因为它不是我发布的。