1.
什么是
BUS-OFF?
當CAN控制器發(fā)生錯誤的次數(shù)超過255次,就會觸發(fā)BUS-OFF錯誤。一般發(fā)生BUS-OFF的條件是CAN總線受周圍環(huán)境干擾,導致CAN發(fā)送端發(fā)送到總線的數(shù)據(jù)被BUS總線判斷為異常,但異常的次數(shù)超過255次,BUS總線自動設(shè)置為BUS-OFF狀態(tài),此時總線處于忙的狀態(tài),數(shù)據(jù)無法發(fā)送,也無法接收。
2.如何檢測BUS-OFF?
下面以CAN發(fā)送數(shù)據(jù)為例,介紹如何檢測BUS-OFF錯誤狀態(tài)。
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.代碼實現(xiàn)
檢測CAN BUS-OFF錯誤并進行處理,網(wǎng)上已經(jīng)有開源代碼,大家可以參考這個網(wǎng)址:http://www.pengutronix.de/software/libsocketcan/download/代碼里有個can_get_state函數(shù),也可以檢測CAN BUS當前的狀態(tài)。
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。
關(guān)鍵詞:
Can總線BUS-OF
相關(guān)新聞