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.

[参考译文] TMS320F280039C:SCI SCIRXST.RXRDY 行为

Guru**** 2531950 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1210939/tms320f280039c-sci-scirxst-rxrdy-behavior

器件型号:TMS320F280039C

亲爱的香榭丽舍大街,

我是为我们的客户提出这个问题的。

由于用户的应用程序是引导程序、因此不想使用中断。 他们希望使用基于轮询的代码来检查 SCI SCIRXST.RXRDY。

当他们使用如下代码时、他们发现他们会间歇性地丢失数据。

伪代码:

int main()
{
    while(1)
    {
        GetRxData();
    }
}

void GetRxData()
{
    if(SCIRXST.bit.RxRDY == 1)
    {
        Data = SCIRXBUF.bit.SAR;
    }
}

但是、如果用户更改为如下代码、则不会丢失字节。

void GetRxData()
{
    while (SCIRXST.bit.RxRDY == 0)
    {
    }
    Data = SCIRXBUF.bit.SAR;
}

但是,由于不使用中断,while (SCIRXST.bit.RxRDY ==0) 循环将花费太多时间,导致后台循环卡在  GetRxData()中,这不是所需要的。

用户希望使用基于 IF 的代码。

因此、我们希望 更详细地检查这些行为。

1.从"表25-13. TRM 的"SCIRXST 寄存器字段说明"、

"...RXRDY 通过读取 SCIRXBUF 寄存器、通过有效的软件复位或系统复位清零。。。"

情形1:

有一个输入字节、输入字节被复制到 SCIRXBUF 中、没有进一步的输入字节。 如果用户没有读取  SCIRXBUF、 RXRDY 位会保持高电平、除非复位。 对吗?

情形2:

有规律的输入字节。 如果下一个字节(比如"0x02")覆盖了前一个字节(比如"0x01")并且没有读取 SCIRXBUF、那么 RXRDY 的行为是什么?

它会保持在高电平吗?

或者它是高电平(意味着0x01字节已准备好被读取)、然后是低电平(覆盖期间)、再是高电平(0x02字节已准备好被读取)吗?

或者其他行为?

即、我们需要确认 RXRDY 是否将下降?

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

    韦恩、您好!

    感谢您的提问。

    Deshine Deshine 说:
    如果用户没有读取  SCIRXBUF、 除非进行复位、否则 RXRDY 保持高电平。 对吗?

    是的。

    有规律的输入字节。 如果下一个字节(比如"0x02")覆盖了前一个字节(比如"0x01")并且没有读取 SCIRXBUF、那么 RXRDY 的行为是什么?

    它会保持在高电平吗?

    [/报价]

    是的。 RXRDY 信号不应下降。

    此致、

    Vince

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

    尊敬的 Vince:

    如果 RXRDY 没有下降、您对在我的第一篇文章中使用 if-statement 有什么评论吗?

    用户为什么间歇性地丢失字节?

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

    韦恩、您好!

    设置该位时、您能否验证代码是否为"双读"(读取寄存器两次)? 我想知道它是否会意外地清除该位。 您可以通过在循环中添加+1个计数器并查看该计数器是否高于接收到的字节来检查此情况。

    此致、

    Vince

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

    尊敬的 Vince:

    我仍然感到困惑。

    请您更清楚一点吗?

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

    韦恩、您好!

    我的意思是:

    int main()
    {
        while(1)
        {
            GetRxData();
        }
    }
    
    void GetRxData()
    {
        if(SCIRXST.bit.RxRDY == 1)
        {
            Data = SCIRXBUF.bit.SAR;
            read_counter++; // <--- THIS IS THE ADDED CODE
        }
    }

    如果该计数器大于接收到的字节数、则代码运行速度如此之快、以至于它会对缓冲区读取两次、并且可能会在完全接收到下一个字节之前清除 RxRDY。 我认为这不是很可能的、但我们需要对其进行测试、以确保是否发生了这种情况。

    此致、

    Vince

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

    尊敬的 Vince:

    如波形所示、调试引脚(CH.3)上没有干扰、这意味着此时不会发生双读。

     

    是否有任何其他原因导致此 RxRDY 缺失问题?

     

    此外、你能否帮助说明从读取 RxBuffer 到 RxRDY 变为低电平所花费的时间?

    在此情况下、电流主环路时序是否正确?

     

    这是用户测试的伪代码。

    int main()
    {
            while(1)
            {
                Toggle CH4;
                GetRxData();
            }
    }
    void GetRxData()
    {
            if(SCIRXST.bit.RxRDY == 1)
            {
                Data = SCIRXBUF.bit.SAR;
                Toggle CH3; // The pin should go high and low in a short period while it is double read.
            }
    }
    

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

    韦恩、您好!

    我正在研究这件事,并会让你知道我发现什么。 我认为这可能就像循环可能不实际调用函数那样简单、这可能会成为编译器优化问题(不太可能)。

    此致、

    Vince

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

    韦恩、您好!

    所以有一件事,我在测试时再次解释,错误可以导致在适当的时候不标记。 是否能够在未按预期执行读取的情况下显示 RXST 寄存器值? 基本来说、我认为可能的情况是设置了一些错误并阻止一个字节注册 RXRDY 位。

    此致、

    Vince

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

    尊敬的 Vince:

    由于这很紧急、让我们来离线讨论一下。

    找到解决方案后、我们可以回来更新并与其他人共享。

    韦恩

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

    尊敬的 Vince:

    用户在其代码中找到了另一个根本原因、并解决了此问题。

    感谢您的支持。