問題描述:
MPLAB X IDE MCC 生成的LIN通訊代碼,接收超時Bug導致丟幀。
故障現象:
晶片型號:PIC16F15344T-E/SSVAO
開發環境:MPLAB X IDE v6.05 + MCC 5.2.1
故障描述:LIN 接收丟幀
分析過程:
1、LIN接收丟幀,先用邏輯分析儀抓取LIN總線和LIN_RX引腳波形查看數據,發現外部波形正常,應該是LIN接收部分軟體故障。
2、在 lin_slave.c 中的 LIN_handler() 函數內,使用 IO 口輸出波形,用邏輯分析儀抓取波形的方式對LIN接收的狀態機運行狀態進行跟蹤,發現有不規則的進入LIN接收超時狀態。
3、分析代碼發現接收超時定時器是由 TMR0 的 1ms 定時器來驅動 LIN_timeout 定時計數的,LIN_timeout 每 1ms 加 1,在每次收到LIN IDLE信號時對 LIN_timeout 進行重新計數。
4、對 LIN_timeout 使用 IO 口輸出波形,用邏輯分析儀抓取波形的方式跟蹤其運行狀態。發現此計數值不正常,分析代碼發現 LIN_startTimer() 和 LIN_stopTimer() 函數僅對 LIN_timeout 和定時器進行了重置,但並未關閉定時器,所以定時器是一直在計數的。
5、修改 LIN_startTimer() 和 LIN_stopTimer() 函數,分別增加了對定時器的啟動和停止操作,LIN 接收恢復正常。
void LIN_startTimer(uint8_t timeout){LIN_timeout = timeout;
TMR0_WriteTimer(0);
NOP();
LIN_timerRunning = true;
TMR0_StartTimer(); //Fix LIN Timer Bug.
}
void LIN_stopTimer(void){
NOP();
// reset ticker counter
CountCallBack = 0;
LIN_timerRunning = false;
TMR0_StopTimer(); //Fix LIN Timer Bug.
}
解決方案:
在 lin_slave.c 中的LIN_startTimer() 函數末尾,增加一行代碼:
TMR0_StartTimer(); //Fix LIN Timer Bug.
LIN_stopTimer() 函數末尾,增加一行代碼:
TMR0_StopTimer(); //Fix LIN Timer Bug.
經驗總結:
LIN 1ms 接收定時器TMR0需要與接收定時進行同步啟停,以確保接收超時計數正確。
建議TMR0隻作LIN接收定時,不與其它模塊共用,以免衝突。
評論