![[转载]小猫爪:嵌入式小知识14 - ISO15765(UDS on CAN)详解](http://pic.xiahunao.cn/yaotu/[转载]小猫爪:嵌入式小知识14 - ISO15765(UDS on CAN)详解)
小猫爪嵌入式小知识14 - ISO15765UDS on CAN简介1 前言2 ISO15765和OSI的联系3 ISO15765-2 网络层定义3.1 拆包和组包SDU和PDU3.1.1 帧的定义1. 单帧SF2. 首帧FF3. 连续帧CF4. 流控帧FC3.1.2 帧的传输1. 单帧2. 多帧3.2 地址定义3.3 超时控制4 ISO15765-3 应用层定义4.1 超时控制4.2 数据定义5 AUTUSAR上的实现END1 前言ISO15765相信很多人都听说过这个协议它还有另外一个小名叫做CAN诊断协议规范还有个ISO14229(UDS协议规范)这两者又是什么关系呢其实可以简单粗暴的理解成ISO15765它规定了基于CAN的UDS协议而ISO14229则规定了UDS协议应用层以及UDS协议在不同的车载总线(CAN,Ethernet, LIN等)上的应用和限制。想搞清楚这两者的联系和区别可以参考这两篇文章《聊聊诊断协议——UDS》《汉子之解读ISO 14229UDS协议》。接下来就来简单介绍一下ISO15765这个ISO协议里面主要规定了哪些东西。2 ISO15765和OSI的联系ISO15765共有四个部分每个部分所规定的信息如下名称规定内容ISO15765-1基本信息大致介绍了一下ISO15765的大致内容ISO15765-2网络层服务ISO15765-3统一诊断服务在CAN上的实现UDS on CANISO15765-4相关排放系统要求其中第一部分第四部分对我们理解UDSon CAN用处不到这里就不多作介绍了感兴趣的朋友可自行去查看接下来着重对第二部分和第三部分进行简单介绍。简单的拉出OSIOpen System InterconnectOSI参考模型是ISO组织在1985年研究的网络互联模型该体系结构标准定义了网络互联的七层框架物理层、数据链路层、网络层、传输层、会话层、表示层和应用层CAN诊断协议就是基于OSI模式建立的两者的关系如下OSI汽厂增强诊断诊断应用用户自定义应用层ISO15765-3表示层无会话层无传输层无网络层ISO15765-2链路层ISO11898-1物理层用户自定义从上表中可以看出其中ISO15765-3规定的是OSI模型中的应用层而ISO15765-2规定了网络层可以看到CAN的UDS协议还是比较简单的这得益于CAN通讯比较简单。至于ISO11898-1不用想就知道它就是CAN协议标准。注其实对于上表中的各层对应关系在不同的文档中存在着较大的差异在部分文档的描述中会话层并不是空白而是由ISO15765-3定义传输层也不是空白而是由ISO15765-2定义。3 ISO15765-2 网络层定义在ISO15765-2中规定了网络层它需要定义什么呢最主要的就是拆、组包以及超时控制。下面我们来针对这两个方面分别来介绍。3.1 拆包和组包SDU和PDU所谓拆包和组包其实就是SDU服务数据单元和PDU协议数据单元两者之间的转换。SDU和PDU是数据在网络模型中上下两层传输过程中格式变换的说法这样说可能有点抽象下面就以很通俗的说法来介绍一下。都知道经典CAN有8个字节每一帧最大只能传输8个字节的数据上层网络要想通过CAN帧来传递信息就会出现两种情况有些消息长度很短只需要CAN的一帧就可以解决而有些消息长度很大无法通过CAN的一帧来完整传输那么就需要将该消息按照一定规则进行分割成若干个CAN帧进行传输。以上其实就是ISO15765-2中定义的最关键的部分下面具体看一下这个ISO15765中制定的拆包和组包的规则。3.1.1 帧的定义ISO15765-2为实现上一目标将CAN帧分成了以下四种类型。1. 单帧SF一条消息仅用一帧即可完成传输即为单帧SingleFrame单帧第一个字节byte0的高4位为0第一个字节byte0的低四位SF_DL为接下来准备传输的数据长度从第二个字节byte1至最后一个字节byte7为传输的数据所以CAN诊断数据发送长度得小于等于7个字节。单帧中SF_DL定义如下16进制值描述0保留1 ~ 6单帧数据长度值SF_DL7SF_DL 7 时只允许标准地址8 ~ F无效2. 首帧FF当一条消息需要多帧才能完成传输那么第一帧即被称为首帧首帧第一个字节byte0的高四位为1第一个字节byte0低四位与第二个字节byte1合起来FF_DL为接下来传输的数据长度从第三个字节byte2至最后一个字节byte7为传输数据。首帧中FF_DL定义如下16进制值描述0 ~ 6无效7FF_DL 7 只允许扩展地址及混合地址8 ~ FFF数据总字节数拆分信息最大数据长度支持 4095 个用户数据3. 连续帧CF当一条消息需要多帧才能完成传输时除了首帧外其他帧被称为连续帧连续帧第一个字节byte0的高四位为2第一个字节byte0的低四位为连续帧编号SN表示当前连续帧的顺序第一条连续帧的SN1后面每发出一帧连续帧SN加1范围0~15当SN15时下一条连续帧重新变成0。第二个字节byte1至最后一个字节byte7为剩余的数据。首帧已经传输了6个字节则接下来就是通过连续帧继续传输剩下的字节。4. 流控帧FC流控帧的作用在于接收端告知发送端接收能力包含FlowSttatus(FS)BlockSize(BS)和SeparationTimeMin(STmin)三个参数FS用来通知发送端当前流状态BS表示接收端在发送下一帧流控帧之前允许发送端连续发送的最大连续帧个数STmin表示发送端发送连续帧的最小间隔时间。发送端收到接收端反馈的流控帧后发送端会按照流控帧给出的接收能力进行发送连续帧即连续传输的连续帧不超过BS连续帧的发送间隔时间大于等于STmin。若接收端已经收满BS数量的数据且与首帧中包含的数据长度对比发现数据还没接收满则会继续发送流控帧发送端会接着发送连续帧以此类推直至所有数据发送完成。FS定义16进制值描述0继续发送CTS通知发送方重新发送连续帧该值意味着接收者准备好接收最大 BS 个连续帧。1等待WT通知发送方继续等待新的流控帧(N_PDU)的到来并重新设置 N_BS 定时器2溢出OverFlow通知发送方无法接收该多帧该流控参数值仅能在跟在回应首帧的流控帧中使用并且仅能在首帧中 FF_DL 信息的长度超过了接收实体缓冲区大小时使用3 ~ F保留BS定义16进制值描述00用于指示发送端在拆分数据的发送期间流控制帧不再发送流控制帧了。发送端应当不停的发送剩下的连续帧以便接收接收端另外的流控帧。01 - FF该范围的 BS 参数值用于指示发送方在没有接收到下一帧流控帧期间能发送的最大数目的连续帧。STmin定义16进制值描述00 - 7F间隔时间STmin范围0ms - 127ms该 STmin 单元的范围 00 - 7F 时单位为毫秒ms80 - F0保留F1 - F9间隔时间STmin范围 100us - 900us该 STmin 单元的范围 F1 - F9 最小分编为 100 微秒us参数值 F1 代表 100us参数值 F9 代表 900usFA - FF保留3.1.2 帧的传输ISO15765-2定义的四种帧类型是怎样组合来实现发送端和接收端数据传输的呢1. 单帧单帧消息的传输比较简单如下图示例发送端需要给接收端发送三个字节分别是0x22 0x10 0x20所以需要使用单帧帧中剩余未使用字节使用0xFF填充。如下所示Byte0Byte1Byte2Byte3Byte4Byte5Byte6Byte70x030x220x100x200xFF0xFF0xFF0xFF2. 多帧对于多帧的情况传输就比较复杂了如下图接收端接收到首帧后发送流控帧给接收端告知发送端自己在发送下一帧流控帧之前能够接收最大数量的连续帧以及两个连续帧之间的间隔发送端接收到流控帧的要求后按照该要求继续发送连续帧。接收端不断接收连续帧若接收端已经收满BS数量的连续帧且与首帧中包含的数据长度对比发现数据还没接收满则会继续发送流控帧发送端会接着发送连续帧以此类推直至所有数据发送完成。示例发送端需要给接收端发送0x2E 0x10 0x20 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F 0x10 0x11 0x12 0x13共23个字节长度的数据未使用字节用0xFF填充这时就需要多帧的形式来进行发送。发送端发出首帧Byte0Byte1Byte2Byte3Byte4Byte5Byte6Byte70x100x170x2E0x100x200x000x010x02接收端发出流控帧Byte0Byte1Byte2Byte3Byte4Byte5Byte6Byte70x300x000x010xFF0xFF0xFF0xFF0xFF发送端发出连续帧1Byte0Byte1Byte2Byte3Byte4Byte5Byte6Byte70x210x030x040x050x060x070x080x09发送端发出连续帧2Byte0Byte1Byte2Byte3Byte4Byte5Byte6Byte70x220x0A0x0B0x0C0x0D0x0E0x0F0x10发送端发出连续帧3Byte0Byte1Byte2Byte3Byte4Byte5Byte6Byte70x230x110x120x130xFF0xFF0xFF0xFF3.2 地址定义除了数据部分为了将数据发送到对的地方所以还需要对源地址以及目标地址进行定义对于地址的定义网络层定义了三种类型分别是标准扩展和混合其实说白了就是按照一定要求把CAN ID进行定义。在介绍之前先列举以下下面出现的一些符号代表的意思如下缩写符号描述N_AInetwork address informationN_TAnetwork target addressN_SAnetwork source addressN_TAtypenetwork target address type分为功能选址和物理选址Mtypemessage typeN_PCInetwork protocol control information在帧的定义中已详细解释标准地址是最通用的一种地址编码格式这里就以标准地址编码展开标准地址其又分为两种分别是标准地址和标准固定地址标准地址如下N_AI为N_SA, N_TA, N_TAtype, Mtype混合在一起形容的唯一CAN ID。标准固定地址只能在29-bit扩展CAN ID中才能被应用格式如下至于扩展地址和混合地址的编码格式感兴趣的朋友可以参考ISO15765原文。3.3 超时控制ISO15765-2中还针对时间制定了严格的超时机制在网络层中主要有如下几个时间参数时间参数描述超时时间(ms)运行需求(ms)N_As发送端发送一条CAN消息的时间1000N/AN_Ar接收端发送一条CAN消息的时间1000N/AN_Bs发送端发送首帧后到接受到流控帧的时间1000N/AN_Br接收端收到首帧后到发送流控帧的时间N/A(N_BrN_Ar)(0.9*N_Bs)N_Cs发送端收到流控帧后到发送连续帧的时间N/AN_CsN_As)(0.9*N_Cr)N_Cr接收端收下一个连续帧的时间1000--------再结合多帧的流程图就可以更清晰的了解到每个时间参数具体限制的地方这些事件参数的使用以及触发超时事件后的动作如下超时参数触发动作N_As发送方没有及时发送 N_PDU放 弃 信 息 的 接 收 并 传 递 N_ResultN_TIMEOUT_A 的 N_USData.confirm 指示N_Ar接收方没有及时发送 N_PDU放 弃 信 息 的 接 收 并 传 递 N_ResultN_TIMEOUT_A 的 N_USData.confirm 指示N_Bs发送方没有接收到流控帧丢失覆盖或在首帧前收到或连续帧没有被接收方接收到。放 弃 信 息 的 发 送 并 传 递 N_ResultN_TIMEOUT_Bs 的 N_USData.confirm 指示N_Cr接收方没有收到连续帧或之前流控帧未被发送方收到放 弃 信 息 的 接 收 并 传 递 N_ResultN_TIMEOUT_Cr 的 N_USData.confirm 指示4 ISO15765-3 应用层定义首先要搞清楚UDS协议是一种服务器-客户端交互模式发送端发送请求接收端返回响应。为了来实现这种通话模式网络层负责的是数据的传输而应用层则考虑的是数据的定义所以ISO15765-3主要规定数据的应用定义以及应用层层面的超时控制。4.1 超时控制对于应用层的超时控制ISO15765-3定义的时间参数如下表所示不想翻译的朋友可以参考这篇文章来理解哦https://blog.csdn.net/wjz110201/article/details/114837749[引用]。上表中的参数Δ P 2 C A N \Delta P2_{CAN} /spanspan classkatex-htmlspan classbasespan classstrut styleheight: 0.8333em; vertical-align: -0.15em;/spanspan classmordΔ/spanspan classmord mathnormal stylemargin-right: 0.1389em;P/spanspan classmordspan classmord2/spanspan classmsupsubspan classvlist-t vlist-t2span classvlist-rspan classvlist styleheight: 0.3283em;span class styletop: -2.55em; margin-left: 0em; margin-right: 0.05em;span classpstrut styleheight: 2.7em;/spanspan classsizing reset-size6 size3 mtightspan classmord mtightspan classmord mathnormal mtight stylemargin-right: 0.0715em;C/spanspan classmord mathnormal mtightA/spanspan classmord mathnormal mtight stylemargin-right: 0.109em;N/span/span/span/span/spanspan classvlist-s/span/spanspan classvlist-rspan classvlist styleheight: 0.15em;span class/span/span/span/span/span/span/span/span/span/span分为两个时间即:br span classkatex--displayspan classkatex-displayspan classkatexspan classkatex-mathml Δ P 2 C A N Δ P 2 C A N − R e q Δ P 2 C A N − R s p \Delta P2_{CAN} \Delta P2_{CAN-Req} \Delta P2_{CAN-Rsp} /spanspan classkatex-htmlspan classbasespan classstrut styleheight: 0.8333em; vertical-align: -0.15em;/spanspan classmordΔ/spanspan classmord mathnormal stylemargin-right: 0.1389em;P/spanspan classmordspan classmord2/spanspan classmsupsubspan classvlist-t vlist-t2span classvlist-rspan classvlist styleheight: 0.3283em;span class styletop: -2.55em; margin-left: 0em; margin-right: 0.05em;span classpstrut styleheight: 2.7em;/spanspan classsizing reset-size6 size3 mtightspan classmord mtightspan classmord mathnormal mtight stylemargin-right: 0.0715em;C/spanspan classmord mathnormal mtightA/spanspan classmord mathnormal mtight stylemargin-right: 0.109em;N/span/span/span/span/spanspan classvlist-s/span/spanspan classvlist-rspan classvlist styleheight: 0.15em;span class/span/span/span/span/span/spanspan classmspace stylemargin-right: 0.2778em;/spanspan classmrel/spanspan classmspace stylemargin-right: 0.2778em;/span/spanspan classbasespan classstrut styleheight: 0.9694em; vertical-align: -0.2861em;/spanspan classmordΔ/spanspan classmord mathnormal stylemargin-right: 0.1389em;P/spanspan classmordspan classmord2/spanspan classmsupsubspan classvlist-t vlist-t2span classvlist-rspan classvlist styleheight: 0.3283em;span class styletop: -2.55em; margin-left: 0em; margin-right: 0.05em;span classpstrut styleheight: 2.7em;/spanspan classsizing reset-size6 size3 mtightspan classmord mtightspan classmord mathnormal mtight stylemargin-right: 0.0715em;C/spanspan classmord mathnormal mtightA/spanspan classmord mathnormal mtight stylemargin-right: 0.109em;N/spanspan classmbin mtight−/spanspan classmord mathnormal mtight stylemargin-right: 0.0077em;R/spanspan classmord mathnormal mtighte/spanspan classmord mathnormal mtight stylemargin-right: 0.0359em;q/span/span/span/span/spanspan classvlist-s/span/spanspan classvlist-rspan classvlist styleheight: 0.2861em;span class/span/span/span/span/span/spanspan classmspace stylemargin-right: 0.2222em;/spanspan classmbin/spanspan classmspace stylemargin-right: 0.2222em;/span/spanspan classbasespan classstrut styleheight: 0.9694em; vertical-align: -0.2861em;/spanspan classmordΔ/spanspan classmord mathnormal stylemargin-right: 0.1389em;P/spanspan classmordspan classmord2/spanspan classmsupsubspan classvlist-t vlist-t2span classvlist-rspan classvlist styleheight: 0.3283em;span class styletop: -2.55em; margin-left: 0em; margin-right: 0.05em;span classpstrut styleheight: 2.7em;/spanspan classsizing reset-size6 size3 mtightspan classmord mtightspan classmord mathnormal mtight stylemargin-right: 0.0715em;C/spanspan classmord mathnormal mtightA/spanspan classmord mathnormal mtight stylemargin-right: 0.109em;N/spanspan classmbin mtight−/spanspan classmord mathnormal mtight stylemargin-right: 0.0077em;R/spanspan classmord mathnormal mtights/spanspan classmord mathnormal mtightp/span/span/span/span/spanspan classvlist-s/span/spanspan classvlist-rspan classvlist styleheight: 0.2861em;span class/span/span/span/span/span/span/span/span/span/span/spanbr 其中span classkatex--inlinespan classkatexspan classkatex-mathml Δ P 2 C A N − R e q \Delta P2_{CAN-Req} /spanspan classkatex-htmlspan classbasespan classstrut styleheight: 0.9694em; vertical-align: -0.2861em;/spanspan classmordΔ/spanspan classmord mathnormal stylemargin-right: 0.1389em;P/spanspan classmordspan classmord2/spanspan classmsupsubspan classvlist-t vlist-t2span classvlist-rspan classvlist styleheight: 0.3283em;span class styletop: -2.55em; margin-left: 0em; margin-right: 0.05em;span classpstrut styleheight: 2.7em;/spanspan classsizing reset-size6 size3 mtightspan classmord mtightspan classmord mathnormal mtight stylemargin-right: 0.0715em;C/spanspan classmord mathnormal mtightA/spanspan classmord mathnormal mtight stylemargin-right: 0.109em;N/spanspan classmbin mtight−/spanspan classmord mathnormal mtight stylemargin-right: 0.0077em;R/spanspan classmord mathnormal mtighte/spanspan classmord mathnormal mtight stylemargin-right: 0.0359em;q/span/span/span/span/spanspan classvlist-s/span/spanspan classvlist-rspan classvlist styleheight: 0.2861em;span class/span/span/span/span/span/span/span/span/span/span为客户端发送请求至服务器的时间span classkatex--inlinespan classkatexspan classkatex-mathml Δ P 2 C A N − R s p \Delta P2_{CAN-Rsp} /spanspan classkatex-htmlspan classbasespan classstrut styleheight: 0.9694em; vertical-align: -0.2861em;/spanspan classmordΔ/spanspan classmord mathnormal stylemargin-right: 0.1389em;P/spanspan classmordspan classmord2/spanspan classmsupsubspan classvlist-t vlist-t2span classvlist-rspan classvlist styleheight: 0.3283em;span class styletop: -2.55em; margin-left: 0em; margin-right: 0.05em;span classpstrut styleheight: 2.7em;/spanspan classsizing reset-size6 size3 mtightspan classmord mtightspan classmord mathnormal mtight stylemargin-right: 0.0715em;C/spanspan classmord mathnormal mtightA/spanspan classmord mathnormal mtight stylemargin-right: 0.109em;N/spanspan classmbin mtight−/spanspan classmord mathnormal mtight stylemargin-right: 0.0077em;R/spanspan classmord mathnormal mtights/spanspan classmord mathnormal mtightp/span/span/span/span/spanspan classvlist-s/span/spanspan classvlist-rspan classvlist styleheight: 0.2861em;span class/span/span/span/span/span/span/span/span/span/span为服务器发送响应至客户端的时间如下图所示br img srchttps://i-blog.csdnimg.cn/blog_migrate/43b65c6f1cc754e9204905922b0fa872.png alt在这里插入图片描述/p应用层定义了几种会话模式在不同的会话模式下客户端和服务端所被允许进行的访问内容是不同的常规的有默认会话模式(defaultSession)拓展会话模式(extendedSession)编程会话模式(programmingSession)。在一个非默认会话模式启动后则需要两个时间参数去约束如下对于应用层的超时控制及其复杂ISO15765中花了大把的篇幅来进行描述感兴趣的朋友可以自行参考ISO15765-3原文。4.2 数据定义上面网络层定义章节中介绍了为了将数据完整发送出去将一帧CAN报文的ID和数据分别进行定义网络层的定义和应用层的定义的对应关系如下从上表中可以看到地址部分应用层和网络层都是一一对应的所以应用层的地址层就不多介绍了不同的地方在于数据部分回顾一下ISO15765-2的内容经典CAN的8个字节需要前几个字节作单帧多帧等帧格式规范剩下来的才是数据部分而ISO15765则继续针对这部分数据再作定义也就是说ISO15765-3是基于ISO15765-2的基础上再定义。那么应用层针对数据部分做了哪些定义呢或者换种说话应用层定义在哪些具体服务。这里的数据定义其实就是我们常常所说的诊断服务即真正意义上的UDS前面所介绍的ISO15765-2网络层其实都是为了在CAN总线上实现UDS所制定的一系列基础而UDS在OSI分级中属于应用层。UDS其实是ISO14229-1定义的ISO15765-3直接给它照搬过来了所实现的具体服务类型如下补充除以上部分ISO15765-3还对地址的路由进行了相关规定在这里就不作介绍了感兴趣的朋友可以参考ISO16765-3原文。ISO15765-3说白了其实就是对ISO14229-1UDS的实现后面将会另有一篇文章专门对UDS进行详细的介绍以及对于每一项服务的应用和举例后面会专门有文章进行介绍。5 AUTUSAR上的实现下图是AUTOSAR的架构图在AUTOSAR架构中实现CAN诊断则依次要经过CAN硬件, CAN DriverCAN_IFCAN_TPPDURDCM模块。其中CAN硬件CAN Driver实现了链路层(ISO11898-1)和物理层CAN_IF层是链路层到网络层的接口CAN_TP实现了网络层(ISO15765-2) PDUR为AUTOSAR中的总消息路由它承载了CAN_TP模块与DCM模块的数据拷贝和交互DCM则是实现了应用层(ISO15765-3, ISO14229-1)。END