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