我使用28335SCI实现一个485通讯,使用过程中,我发现无法接收数据了,查了一下此时RXERROR为1。
我现在有三个疑问
1.为啥产生接收错误RXERROR为1会导致无法接收数据?程序中接收数据是通过中断接收,没有使用RXFIFO,中断配置没有打开接收中断错误使能。
2.我现在的解决方法是在SCI接收中断服务函数中检测RXERROR,如果为1则重新初始化SCI,这种方式似乎是可以解决问题的,我觉得这种解决方式似乎有点暴力了,有无更好的解决方案?
3.我在设置SCI的时候没有打开接收中断错误使能,请问在这种情况下会不会出现我在SCI接收中断服务函数查询RXERROR为0,然后RXERROR才为1的情况?还是说必须要使能接收中断错误使能,这样查到的RXERROR状态才可靠?
Green Deng:
根据RXERROR寄存器的定义,这个寄存器跟是否使用RXFIFO应该没什么关系
SCI receiver error flag.
The RX ERROR flag indicates that one of the error flags in the
receiver status register is set. RX ERROR is a logical OR of the
break detect, framing error, overrun, and parity error enable flags
(bits 5-2: BRKDT, FE, OE, and PE).
A 1 on this bit will cause an interrupt if the RX ERR INT ENA bit
(SCICTL1.6) is set. This bit can be used for fast error-condition
checking during the interrupt service routine. This error flag cannot
be cleared directly
it is cleared by an active SW RESET or by a system reset.
Reset type: SYSRSn
0h (R/W) = No error flags set
1h (R/W) = Error flag(s) set后面两个问题我找其他负责SCI的工程师确认一下之后再回复你
,
user5243826:
十分感谢您的回复!如果能帮请教下SCI工程师那更好了,因为我在其余论坛上发现许多用485出现这个问题的状况,可是大家都在使用检测rxerror来复位SCI来解决问题,都没能讲明白问题rxerror导致无法再进入sci接收中断的本质原因。。
,
Green Deng:
以下是美国工程师的回复:
First thing to debug the issue would be to resolve the cause of RXERROR. This bit is set when any of the bits 5-2 of SCIRXST (receive status) register are set. So when the RXERROR bit is being set which of these bits (BRKDT, FE, OE, PE) are being set?The only way to reset the RXERROR bit is using SCI software reset.
SciaRegs.SCICTL1.all =0x0003;
SciaRegs.SCICTL1.all =0x0023;
To trigger the receive interrupt because of RXERROR it is necessary to turn on the receive interrupt error enable (RXERRINTENA).
个人理解:接收状态下,SCIRXST的5-2位被置1之后RXERROR位就会被置1。所以,RXERROR被置1的时候BRKDT, FE, OE, PE其中应该有被置1的。复位RXERROR位的唯一方法是SCI软件复位。