STM32 CAN诊断详解

        在许多领域里面,控制系统由很多部分组成,只不过有主次之分。主控制系统是如何知道其他系统是否出现问题的,答案就是通过can诊断,不仅能知道出现的问题还能进行想对其进行的操作。一般为诊断仪和各个部分的通信。

       我们在can报文分为诊断报文和解析报文以及网络管理报文,不同的报文根据不同的ID保存在不同的位置。can诊断报文保存在自己的缓存里面。他的报文格式就是数据帧,简单来说,解析报文的ID用来判断是否是自己想要的报文,诊断也是,只不过诊断分为608,6d8,600三个,分别是物理寻址、响应和功能寻址。他的数据段也分为8个字节,但是其代表的意义有特别说明,第0个字节的高四位表示是多帧还是单帧,在单帧里面低四位表示数据长度。多帧的话再加上第一个字节八位一共十二位表示总的字节数,因此最大4095。多帧的首帧是这样的格式,后面的后续帧是低四位代表序号,从1-15依次循环,一直到字节数发送玩为止,也就是说,多帧的首帧最多有六个字节,后续帧最多有七个字节。功能寻址, 一般来说是对具有某一个功能的单一对多寻址,物理寻址是点对点的寻址。一般常用的是功能寻址是单帧,物理寻址是多帧。主要流程就是,判断,接收,储存,判断,进行相应的操作。

1.

判断报文标准帧的ID是否是诊断报文的ID是的话就进行接收

2.

判断是多帧FF还是单帧SF,通过高四位与F与判断是否是单帧

3.

判断完成之后进行接收,此时要注意接收状态要是等待接收单帧状态rx-sf,负责的话会在接收后续帧状态的,如果是多帧要判断总字节数是否大于4095,大于4095就是流控溢出fc=2,以及是否小于8,小于就用单帧了啊,简单。如果中间出现sn序号从1-15,不是按顺序排列那么直接报错跳出,请求重新发送。

4.

接收完成之后就是诊断了,首先我们需要判断当前的会话是否支持我们请求要干的事情,就是和Linux里面的用户权限差不多,一共defuat,extern,program  三个会话。然后判断是不是支持这个服务,等级够了压根没有这个服务也不行啊。最后再看安全等级,操作的要求比当前=安全等级低就可以,防止你你一个能力不匹配的人去干一件风险很大的事情,比如百度。如果不满足某一个的话都会进行否定响应处理,处理函数是统一的,都是否定然后跟一个服务ID。

最后执行相应的诊断服务!

大体思路就是这样的,配合ISO协议一看更合适。我也刚刚看,还有许多不懂的地方,多多指教!

你可能感兴趣的:(嵌入式,can,诊断)