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.

[参考译文] TMS320F28069:SCI 接收到溢出但未进入中断

Guru**** 2553260 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1046831/tms320f28069-sci-received-overflow-but-did-not-enter-interrupt

器件型号:TMS320F28069
主题中讨论的其他器件:C2000WARE

您好、专家、

我的客户遇到 SCI 接收溢出和 SciaRegs.SCIFFRX.bit.RXFFOVF 为1的问题、但有时未进入中断。

正如 TRM 提到的、 当 SCI 接收溢出发生时、应该能够进入中断。  

我使用控制卡进行了测试、并按照如下方式修改了 c2000ware 中的代码、当 在 CCS 窗口中设置 overflow_test=1时、将不会读取数据并导致接收数据溢出:

在 sciaRxFifoIsr 中、还根据标志 SciaRegs.SCIFFRX.bit.RXFFOVF 复位 SCI。

sciaRxFifoIsr(void)
{
    Uint16 i;

    if(SciaRegs.SCIFFRX.bit.RXFFOVF ==1)
    {
         overflow_test = 0;
         SciaRegs.SCICTL1.all = 0x0023;
         SciaRegs.SCIFFTX.bit.TXFIFOXRESET = 1;
         SciaRegs.SCIFFRX.bit.RXFIFORESET = 1;
         overflow_count++;


    }
    if(overflow_test ==0)
    {
        for(i=0;i<1;i++)
            rdataA[i]=SciaRegs.SCIRXBUF.all;  // Read data
    }

只需将 overflow_test 设置为1并查看结果、执行多次测试即可发现 、SciaRegs.SCIFFRX.bit.RXFFOVF 为1、但未  再次进入中断 sciaRxFifoIsr。   

这里有什么问题吗? 为什么 会出现 SciaRegs.SCIFFRX.bit.RXFFOVF 为1但代码没有运行到 sciaRxFifoIsr 的情况  ?

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

    大家好、很好、

    RXFFIL 的值是多少?  您是否还可以检查 RXFFST 的值以查看 RX 缓冲区中是否有数据?

    在您附加的屏幕截图中、overflow_count 等于1 (在"Expressions"窗口中可见)、它最初是否为0? 这意味着输入了 ISR 并增加了其值。

    此致、

    Marlyn

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

    您好、 Marlyn、

    很抱歉、我忘记附上代码。

    首先 、overflow_test 为0,当在 CCS 窗口中设置为1时、将触发溢出、  

    如果 代码在溢出发生时运行到 ISR、则 overflow_count 值将增大、这意味着它按预期工作。

    否则将不会发生更改、这意味着代码在   SciaRegs.SCIFFRX.bit.RXFFOVF 为1时不会运行到 ISR、这就是问题所在。

    以下是未按预期工作的寄存器:

    我还发布了代码、以便您可以重现控制卡的问题。  

    e2e.ti.com/.../scia_5F00_loopback_5F00_interrupts.7z

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

    你好、很强、

    您能否提供您修改过的.c 文件?

    此外、当溢出发生时、您可以检查 RXFFST 的值吗?  

    此致、

    Marlyn

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

    Marlyn、

    我已经发布了工程 include c 文件、 RXFFST 如下所示:

    e2e.ti.com/.../Example_5F00_2806xSci_5F00_FFDLB_5F00_int.c

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

    你好、很强、

    感谢您附上该代码。 我也能够重复您在我的设置中描述的内容。 我已经向我们的设计团队发送了一份说明、以确定这是否是预期行为。 我将在听到回声后立即发布。

    此致、

    Marlyn

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

    您好、Marlyn、

     您对此主题有什么意见吗?

    此致

    斯基拉

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

    您好!

    设计团队仍在对此进行研究。 我应该在接下来的几天内得到答复。

    此致、

    Marlyn

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

    您好、Marlyn、

    两周前、 您有更新吗?

    客户要求我们给出根本原因、 我们希望 得到一个比较好的解释?   

     非常感谢您的支持!

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

    您好!

    设计目前正在处理此问题。 很抱歉耽误您的时间、但我告诉他们客户正在请求状态更新。

    我会在听到任何消息后立即发布。

    此致、

    Marlyn

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

    您好!

    我从设计中听说过、并确认提供的反馈允许即使在满足溢出条件时也发生中断。

    SCRXIRQn 输出(从 SCI 到 PIE 的中断触发)是 RXFFINT 和 RXFFOVFINT 的 ORed 版本、因此在溢出情况下需要同时清除它们。

    通常、我们的 PIE 是边沿敏感型、因此每次进入 ISR 时都需要一个中断触发边沿、对于该边沿、来自 SCI 模块的 SCIRX 中断必须清除并重新置位才能提供脉冲(正边沿)。 由于您在 ISR 中的单独寄存器写入中清除 RXFIFOINT 和 RFFOVFINT、一个将 SCRXIRQn 置为有效、而另一个将清零、因此它不会在 PIE 边界切换到 SCRXIRQn 中断。 因此、PIE 将不会看到转换、并且不会发生 ISR 条目。

    因此、为了使中断发生、您需要在同一寄存器写入期间清除溢出标志和中断标志。 下面的内容可以正常工作。

        //SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;   // Clear Overflow flag
        //SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;   // Clear Interrupt flag
    
        SciaRegs.SCIFFRX.all = 0x6064;  // RXFFOVRCLR & RXFIFORESET & RXFFINTCLR & RXFFIENA & RXFFIL = 4

    此致、

    Marlyn