IAP和OTA(基于CAN)
理论篇
前言
首先我们需要先把CAN总线驱动起来,最好是自己创建一个DBC文件,之后通过上位机控制,这个是基本条件。
预备知识
总线上每一个ECU都有一个ID,对于LIN总线,需要主机发送ECU的id进行访问,从机ECU才能给出应答。但是对于CAN总线来说,每一个ECU都可以主动发送数据;比如,主机发送0x7C1的id到总线,从机接收到之后,要把数据和属于自己的id(比如0x700)封装成一帧数据,之后作为响应发送到总线上。CAN的这个id就已经起到区分的作用了,不用再像LIN一样(0x3C的id后,还要包含NAD来区分)。对于UDS的数据,就包含在一帧CAN数据组帧的“数据段”里边
单帧、首帧、续帧、流控帧。
注:流控帧知识基于CAN的UDS诊断才有的,对于LIN,是不需要流控帧的。
这里要特别和LIN对比一下,CAN没有NAD这一个字节,而LIN是有的,其他的PCI、LEN、SID、RSID两者相同。
由上图可知,流控帧包含三个字节,第一个字节的前4位固定为3,后4位为FS,第二个字节为BS,第三个字节为STmin。
FS:表示是发送方否可以继续传输消息。
0表示可以继续发送,
1表示等待发送,
2表示数据溢出,
BS:接收方一次能接收的数据最大量。
STmin:表示两个连续帧之间的最小时间间隔。
流控帧的作用的指导对方应该怎么发送。比如,主机发送了多帧数据帧给到从机ECU,单从机ECU接收到多帧中的首帧,就要回复给对方一个流控帧。告诉对方我一次只能接受多少字节,你没发送一帧数据需要等一会再给我发。不管是主机发送给从机,还是从机发送给主机,只要接收到首帧,则必须给对方回复一个流控帧。
寻址格式
normal, extended, and mixed
看了图莫斯提供的代码之后,发现有一个宏定义是区分寻址方式的,看了ISO15765之后,又百度看了很多资料好像又懂了一点点。
其实变来变去,还是在CAN的一帧数据里边搞花样。一帧CAN数据有用的就是ID还有8字节的数据段。贴图时刻。
协议中N_AI里又包含了四个名词,叫:源地址(N_SA)、目标地址(N_TA)、目标地址类型(N_TAtype)、可选地址拓展(N_AE)
Normal addressing
图一,采用的11位的地址,是最常见的寻址方式了,N_AI就是can的标准帧id的11个字节。
图二,采样的29位的地址,24-28是一样的;16-23中区分是物理寻址还是功能寻址【218(dec)为物理寻址、219(dec)为功能寻址】;N_TA为目标地址,N_SA为源地址。
注意:在此寻址方式中,“数据段”的第一个字节还是PCI。
Extended addressing
图三,采样11位的地址,另外,它还把N_TA放在了“数据段”的第一个字节。相当在11位id的基础上再在数据段扩展出一个字节的空间来扩展id。
Mixed addressing
图四,它采用29位的id,又将N_AE放在了“数据段”的第一个字节,N_AE对地址的一个扩展,可以看成是子网络中的一个节点。
注意:只有在正常模式下“数据段”中的8个字节都表示数据,在其他两种模式下,则“数据段”的第一个字节还是存放地址,这个在具体的代码中是由体现的。
所以在开发的时候,首先需要弄清楚1、用的标准帧还是扩展帧进行通信;2、主机物理请求ID,功能请求ID,以及我ECU的物理反馈ID;3、从主机厂拿到手的ID地址寻址方式是什么(标准,扩展,混合)
参考链接
1.单帧、首帧、连续帧、流控帧
2.流控帧
3.寻址格式(很有用)
4.网友的只言片语