根据883的规格书的介绍,FIFO接收缓冲只有2个字节的存储空间,因此,如果接受时的接收中断执行时间过长,而上位机的数据发送一次超过2个字节,超过FIFO的存储空间,就会造成单片机的FIFO溢出。如果没有对RCREG进行定期在主程序中读取,则错误标志无法清零,单片机的串口通信就会锁死,出现无法正常通信的情况。
下图是883在上位机一次连续发送4个字节,在中断中读取RCREG,由于中断执行一次时间超过了发送3个字节的总时间,FIFO的接收缓冲器不能实时被RCREG转取走,造成FIFO溢出。单片机进入接收中断,取走第一次接收到的0x55,但是取走后中断要执行其他程序,不能马上退出中断再进入接收中断,因此后面的3个字节需要存储在FIFO中,造成FIFO的溢出。
C1:上位机发送0x55 4个字节的数据,接单片机RX引脚
C2:单片机执行中断程序,相应接收后的执行返回接收到得上位机数据,由于中断有一个长时间的延时,使单片机在退出第一个接收字节的中断时,已经错过了上位机发送的后3个字节。但是当时仍有2个字节存储在FIFO接收缓冲器中,由于还有3个字节要存储,而FIFO只有2个,造成第二个字节丢失,单片机OERR置位。接收中断响应了后2个存储成功的数据,执行完成后推出接收中断响应,FERR不会自动清零,单片机以后将无法执行接收中断,好比单片机已经进入通信锁死状态。
C3:单片机执行进入中断和退出中断的标志位,为了来查看中断的运行与单片机通信时序的关系。
|