1.
什么是
BUS-OFF?
當CAN控制器發生錯誤的次數超過255次,就會觸發BUS-OFF錯誤。一般發生BUS-OFF的條件是CAN總線受周圍環境干擾,導致CAN發送端發送到總線的數據被BUS總線判斷為異常,但異常的次數超過255次,BUS總線自動設置為BUS-OFF狀態,此時總線處于忙的狀態,數據無法發送,也無法接收。
本文引用地址:http://www.eepw.com.cn/article/201612/330366.htm
2.如何檢測BUS-OFF?
下面以CAN發送數據為例,介紹如何檢測BUS-OFF錯誤狀態。
struct
can_frame
framesend
=
{
.can_id
=
0xaa,
.can_dlc
=
1,
.data[0]
=
0x66,
};err
=
write(s_can0,
&framesend,
sizeof(framesend));
if(err
<=0)
perror(“send
data
error”);
else{
if(framesend
.can_id
&
CAN_ERR_BUSOFF){
perror(“bus-off”);
}
}通過檢測framesend .can_id是否被BUS-OFF置位。
3.BUS-OFF錯誤后如何處理?
最好的處理方法是:restart。can0出錯了,restart can0。
4.代碼實現
檢測CAN BUS-OFF錯誤并進行處理,網上已經有開源代碼,大家可以參考這個網址:http://www.pengutronix.de/software/libsocketcan/download/代碼里有個can_get_state函數,也可以檢測CAN BUS當前的狀態。
int
state;
if
((can_get_state(if_name_can0,
&state))
<
0)
{
fprintf(stderr,
"cannot
get
bustate,
"
"something
is
seriously
wrong");
}
else
if
(state
==
CAN_STATE_BUS_OFF)
{
fprintf(stderr,
"Device
is
in
BUS_OFF"
);
do_restart("can0");
}
do_restart("can0")的作用是restart can0。
關鍵詞:
Can總線BUS-OF