根據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:單片機執行進入中斷和退出中斷的標志位,為了來查看中斷的運行與單片機通信時序的關系。
|