can模塊一共有三種錯(cuò)誤,為錯(cuò)誤主動(dòng),錯(cuò)誤被動(dòng)和總線關(guān)閉,總線關(guān)閉就是所說的bus off,通常情況下我們也只需要對(duì)bus off進(jìn)行特殊處理。在can模塊內(nèi)部有一個(gè)錯(cuò)誤計(jì)數(shù)器,當(dāng)錯(cuò)誤次數(shù)超過255時(shí)就會(huì)導(dǎo)致bus off,如果此時(shí)bus off的恢復(fù)模式設(shè)置為禁止自動(dòng)恢復(fù),就需要認(rèn)為介入設(shè)置恢復(fù)機(jī)制。 通常主機(jī)廠都要求在產(chǎn)生bus off后ECU不能自動(dòng)恢復(fù),并給出快慢恢復(fù)要求,供應(yīng)商要根據(jù)要求來制定bus off的快慢恢復(fù)機(jī)制。比如在bus off后首先快恢復(fù),時(shí)間為50ms,次數(shù)超過5次之后切換為慢恢復(fù)機(jī)制,時(shí)間為200ms,在恢復(fù)期間ECU不能發(fā)出或者接受報(bào)文影響整車網(wǎng)絡(luò)。 對(duì)于spc560系列的MCU的配置,應(yīng)在原來CAN模塊初始化的基礎(chǔ)上,對(duì)CR寄存器的某些位進(jìn)行指定: 使能BUS OFF Interrupt(BOFFMSK = 1); 對(duì)于其他不需要關(guān)心的中斷要禁止,以免造成其他影響,(ERRMSK= 0,TWRNMSK = 0,RWRNMSK= 0); 配置bus off recovery mode為disable self recovery(BOFFREC = 1) 通過以上的配置之后,在產(chǎn)生bus off之后會(huì)觸發(fā)MCU中斷,在中斷函數(shù)中,要把CAN模塊的發(fā)送和接收暫時(shí)關(guān)閉,并清除中斷標(biāo)志位,切換快慢恢復(fù)時(shí)間 Void FlexCan_BusOff_ISR(void) { For(x = 0;x<32;x++) { Can0.BUF[x].CS.B.CODE = 0; } If(FasterRecover_Time<5) { Recover_Time = 50; } Else { Recover_Time = 200; } Can0.ESR.B.BOFFINT = 1; Bus_Off_Flag = 1; } 然后在定時(shí)器中就可以計(jì)時(shí),當(dāng)計(jì)時(shí)到恢復(fù)時(shí)間時(shí),對(duì)CAN模塊重新初始化,并嘗試發(fā)送報(bào)文,如果發(fā)送成功,則總線恢復(fù)正常,否則,繼續(xù)保持休眠,等待下次恢復(fù)時(shí)間。 對(duì)于s12xs128的芯片,可以使用codewarrior的處理器專家,打開busoff的recovery mode為User模式,然后使能中斷,在中斷函數(shù)中的處理方法同上,同時(shí)設(shè)置Events里面的OnBusOff為generate code,在生成代碼中會(huì)有一個(gè)CAN1_Busoff_RecoveryRequest()函數(shù),在請(qǐng)求恢復(fù)總線的時(shí)候,直接調(diào)用這個(gè)函數(shù)即可,其實(shí)這個(gè)函數(shù)就是對(duì)CANMISC寄存器中的busoff標(biāo)志位進(jìn)行清除(write 1 to clear)。 對(duì)于要求不高的地方,不需要配置bus off,默認(rèn)為自動(dòng)恢復(fù)即可。 |
|