CAN协议学习小结

CAN按功能划分

按功能简单划分:微控制器:主要负责和其他应用层的一些交互当数据需要发送时,会将数据传递给CAN控制器;

CAN控制器:数据到达后会进行报文的封装以二进制码的方式传递给CAN收发器;收到收发器的信息时,会进行解封装,将应用层数据打包传给微控制器处理;

CAN收发器:负责将二进制的信号与物理的电平信号进行转换,会根据CAN协议物理层定义的电平转换逻辑将CAN高和CAN低的电平拉到相应的预值;当收发器检测到CAN总线上个的数据时,会将CAN高与CAN低两根线的差分电平解析成数据链路层传输的二进制的比特流

另外,在节点两端,都会有一个终端电阻R0;作用是为了保证信号在传输过程中的阻抗连续性,消除了由于阻抗中断或者不连续带来的反射波效应

CAN的寻址方式

CAN采用的是广播寻址的方式,可以实现一对多的发送,即发送节点在发送过程中只负责将数据发送到总线上去,而不会去指定具体的接收节点,所有挂载在总线上面的节点都可以去接收到数据, 但是具体接不接受是由各个接收节点去决定的;

在每一个CAN节点的内部:在CAN控制器中都会有一个过滤器(接收过滤),可以根据应用层的配置,选择上层需要的数据进行传递,其他的数据直接过滤丢弃掉(控制器);可以减少微控制器对不必要数据的处理,所以也可以实现一对一,一对多的数据传输;

CAN的总线访问机制

CAN里节点没有主从之分,每一个节点在总线空闲的时候都可以去访问总线,因为是共享传输介质,那么总线在任一时刻,只能对一个节点去访问发送数据,节点在访问过程中,可能会出现访问冲突的情况;在CAN中采用的是非破坏性仲裁机制,即当遇见访问冲突的时候,会根据每个节点发送的报文id数值,来进行优先级的裁定,优先级高的报文会优先发送,优先级低的会在后面发送。

报文id实际上是由11bit组成,在仲裁过程中会对其进行逐位的比较,在出现不一致的时候会使用线与机制

回读机制:当数据发送完毕后,会回读确认与实际的总线接收到的内容是否一致;

当发送之后会通过回读的机制来比较发送的内容与实际总线上发送内容是否一致,如节点A与总线上相同位数据不一样,发和回读节点不一样,则A点仲裁失败,失败后A则从发送节点转变成接收节点,后面就不会再发送数据了;当总线空闲且没有其他的节点加入时,A和C会进行新一轮的数据的仲裁;

在CAN中同时发送的ID肯定是不一样的,如此可以保证在发送的过程中肯定会有一个优先级的决出。

对于11位id来说(标准帧),id越小优先级越高,在实际应用中,会将实时性需求比较高的id设置的较小,可以确保在总线冲突的时候,具有优先访问总线的权利。

CAN报文的类型

CAN标准帧:有十一位id和0到8个字节的有效字节(DaTa Field)组成的;

CAN远程帧:远程帧不携带有效字节,仅仅作为远程的一个发送请求,在实际应用中较少;

CAN扩展帧:id长度有29bit和8个字节的有效字节;

扩展远程帧:更加少见,不携带有效字节

CAN报文的结构组成

Id:高有效位在前;

RTR为0时,是一个数据帧,RTR为1时则是远程帧;

IDE是一个扩展帧只指示位,当IDE为0时,表示是一个标准的CAN报文,IDE为1的时候,表示是一个扩展帧,实际上是由一个Base ID 加上 ID Extension(扩展ID)组成,会有一个SRR为,代替了RTR位,与RTR位作用类似;

DLC(4bit):指示了数据场的字节数量,4bit可以代表0到15,但是数据场一帧最大就是8字节,所以当数值为9-15时,依旧为八个字节,但是在CAN FD总线中,会有新的分配

CAN校验场

校验范围是从ID到数据场的最后一位,从SOF开始到数据场,会生成一个十五位的校验码,再由校验场发送;

DEL固定为1;

ACK(应答场):需要接收节点给发送节点应答,由接收节点发送,会跟前面CRC的校验结果,决定发送0还是1;校验肯定则为0,不正确则为1;回读出现问题则会停止发送,会发送一个错误帧,会在DEL之后发送

EOF:报文结束,7bit

在报文结束后会在每帧后面加上3bit的帧间隔,在这之后才允许其他的节点去访问总线;

位填充机制

规则:只要总线上出现连续五个极性相同的位,则在下一位会额外加入一个极性相反的位,填充范围是从SOF开始到CRC结束,如果在这段数据中检测到有六个相同的位,则肯定发送出错

CAN在数据传输过程中的保护机制

例如CRC校验,位监控,填充规则的检查,ACK的检查,固定格式位检查

在检测出错误后,会发送错误帧 格式:6bit的错误标志位,8bit的错误界定符

在发送完错误帧后,发送节点会有一个错误纠正的机制,会重发出错的一些的数据;

常见的错误检测手段

对于发送节点来说:

主要手段为位监控(检查发送的数据和回读到的数据是否一致),若在仲裁场出现错误,发1读0对于发送节点来说不会认为这是一个错误,这是仲裁失败;但是发0读1则是位错误;

ACK的检测,发1读0则说明有的数据是发送了正确的信息,如果发1读1则不正确,因为数据发送错误;

对于接收节点:

填充检查,每五个相同极性插入一个相反极性,如果在接收过程中检测到六个,那么则破坏了填充的规则,发送一个错误帧

格式检查,在固定格式位检测到0则破坏固定格式;

ACK由接收节点发送,在发送之后会回读,若发送时是0在总线上读1,则也是破坏了ACK-Bit Monitoring 会在下一位发送错误帧

错误帧发送原则

在一个错误被检测到时,错误帧会在下一位马上发送,除了CRC错误会先在ACK位发送1,在ACKDEL发送之后再发送错误帧;

位错误,格式错误,填充错误都会在下一个bit立马发送错误帧

根据状态不一样,发送的错误帧也不一样:

在主动错误状态的情况下,发送的错误帧会发送6个0加8个1(可能会有6到12个0);

在被动错误状态的情况下,会发送6个1加八个1 ,对于发送节点,处于被动错误状态,检测到错误状态,会直接发送;如果在接收节点,检测到错误状态,发送6个1可能会被其他数据节点发送的数据覆盖掉不会被发现;

错误鉴定
 

主动错误状态(正常工作状态)

被动错误状态:不允许在3bit帧间隔之后,不能允许立马访问,还需等待8bit延迟,可以让主动错误状态的节点优先发送;

Busoff状态

TEC:发送错误寄存器

REC:接收错误寄存器

具体关系可查看其他文章,该文章仅仅是学习的一部分小结,非常的基础,图片由于和其他文章大同小异就没有放上去;希望可以有一定的帮助。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值