FAE的踩坑之路——2、MPLAB X IDE MCC 生成的LIN通訊代碼,接收超時Bug導致丟幀

關鍵字 :LIN 接收丟幀

問題描述:
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接收定時,不與其它模塊共用,以免衝突。

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論