×
接口总线驱动 > 总线 > 详情

Can总线如何检测BUS-OFF

发布时间:2020-05-28 发布时间:
|
1. 什么是BUS-OFF?

当CAN 控制器发生错误的次数超过255次,就会触发BUS-OFF错误。一般发生BUS-OFF的条件是CAN总线受周围环境干扰,导致CAN发送端发送到总线的数据被BUS总线判断为异常,但异常的次数超过255次,BUS总线自动设置为BUS-OFF状态,此时总线处于忙的状态,数据无法发送,也无法接收。

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。 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
高速串行总线技术发展与应用分析