亲爱的香榭丽舍大街,
我是为我们的客户提出这个问题的。
由于用户的应用程序是引导程序、因此不想使用中断。 他们希望使用基于轮询的代码来检查 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 是否将下降?
