UDS诊断服务
前奏
即为service identifier。测试者发送一个SID,返回一个SID+40。
如果ECU不能发送一个答案或者需要更多时间响应,则发送NRC。一般格式为7F+SID+NRC码。跟我学UDS(ISO14229) ———— NRC码_nrc uds-优快云博客
多个UDS服务支持同一子功能SF(subfunction),其中SF最高位为肯定响应抑制位,置一则抑制肯定响应,也就是不需要ECU回应。不管置一与否都不会抑制否定响应。
一些额外的服务支持一个标识符DID(Date identifier),一般格式为SID+DID。ECU响应一般格式则为(SID+40)+DID。
PCI(Prorocol Control Information)--------------->协议控制信息。
USDT(Unaknowledged Segmented Data Transfer(i,e with transport protocol))-------------->未确认分段数据传输(即使用传输协议)
1.SID
1.1 0x2F
输入输出控制服务,也就是所谓的强控。比如要控制一个高驱,正常需要达到软件逻辑才能控制。可以通过2F直接控制该高驱。
一般格式为 2F+DID+IOCP。IOCP:INPUT OUTPUT CONTROL。
1.2 0x10
可以通过10服务的子功能进入非默认回话。常用的有0x01:默认会话、0x02:编程会话、0x03:拓展会话。一般切换格式为:0x10+SF(0x01、0x02等)。
其中0x3E周期性服务,用来保证非默认会话不会回到默认会话,因为处于非默认会话一段时间后,若没有其他响应则会自动回到默认会话。一般格式为3E+SID。一般称此时间为S3时间,也就是超时时间,在此超时时间内发送3E即可维持非默认会话。
于此同时还有两个P2时间,分别为P2Client和P2Server。P2Client为客户端从发出信号到接收ECU响应的最大超时时间,如果在这个时间内没有接收到响应信号,则会报超时错误。P2Server为ECU接收到信号后处理信号的最大超时时间,同样没有处理完发出信号贼会报超时错误。还有两个与之对应的P2*时间,分别为P2 *Client和P2 *Server。P2 *Server为如果ECU处于忙的状态或者需要额外的一些处理时间,则可以通过一些特殊的否定响应码0x78来表示当前忙,需要更多的等待时间,也就是P2 *Server,并且最终发送响应给Server。P2 *Client则为Server等待的时间。其中,P2 *Server的时间和响应次数是各大厂商自己制定的。
1.3 0x27
如果请求种子被发送ECU默认是锁定的,可以通过27服务跳转到Level1甚至Levelm,ECU也可以通过27服务在不同的Level之间进行转换,但是只能同时处于一个安全等级。
一般格式为0x27+SF
在上电或者重置(RESET)ECU之后,ECU是处于被锁住状态的
和27相关的否定响应码如下:
0x35-----------代表发送给ECU的秘钥不正确
0x36-----------代表发送错误次数过多,ECU已经处于最大接收次数的一个状态
0x37-----------代表太多次被尝试,ECU已经处于一个被锁定的状态
1.4 0x2E
写内容,往哪里写内容,就要看DID了 一般格式为 2E+DID+Data
1.5 DTC 0x19
0x19+0x02----------通过DTC状态掩码读取DTC
0x19+0x04---------通过DTC来读取快照数据(发生错误时的环境数据)
0x19+0x06---------通过DTC来读取故障产生时的环境数据
0x19+0x0A--------通过DTC来读取所有支持的DTC故障码
1.5.1 快照数据如何读取:
首先有个概念 Snapshot Record Number,快照数据编号,也就是SRN,一般最近的快照数据编号为20,也可以自定义一个编号。
定义好编号之后就要设置快照数据中的内容 比如说其中有五个DID,那么就要定义五个DID的含义
第一步先发送0x19+0x03读取一个DTC中所有存储的DTC快照编码,一般响应为0x59+0x03+三个DTC字节+SRN(SRN也就是快照编码)
第二步就可以发送0x19+0x04+三个DTC字节+SRN码来读取快照中的数据了 如果SRN为FF则为读取所有的快照数据。
第三部就是接收肯定响应了,一般格式为0x59+0x04+三个DTC字节+当前DTC的状态位+(SRN(块状数据)+NoID(到底多少个DID码,比如定义了5个DID,那么NoID为0x05+(DID+SD(这里面就是快照数据内容了))))
第四步,如果没有定义这个SRN码,那么就会回复31负相应,表示出现了超出范围的请求数据。
1.5.2 02服务如何读取DTC
SM:StatusMask(八位)---------状态掩码 不支持置1
SAM:StatusAvailabilityMask(八位)-------------ECU支持的状态有效位 支持就置1 这个SAM是不会改变的 是早就被定义好的
status:ECU的状态(八位)一般来说会回复一个status与SM相与不为0的字节
一般发送格式为:19+02+SM 接收格式为:59+02+SAM+(DTC+status)----------------------------部分故障
一般发送格式为:19+0A 接收格式为:59+0A+SAM+(DTC+status)----------------------所有故障
1.5.3 14服务
14 服务主要是负责清楚诊断信息的服务,也就是让DTC复位
一般发送格式为:14+三个字节的DTC(DTC+DTC+DTC)若为三个FF字节则为清楚所有DTC
接收则为:54+三个DTC字节
2.CAN的传输
2.1 首帧
第一帧的第一个字节高四位如果是1,那么代表发出的就是首帧。低四位和第二个字节就代表了传输的数据的具体的长度。
比如说第一个字节的低四位为0和第二个字节为18,那么就代表要传输的字节数为24个字节。
示例传输格式为:10+18+data段。
2.2 流控帧
当接收到首帧(First Frame-------->FF)以后,需要回复一个流控帧(Flow Conrtrol----------->FC)。一般通过第一个字节PCI高四位(第一个字节的高四位)为3来表示当前帧为流控帧。第一个字节低四位(Flow Status------->FS)则表示当前流控的一个状态:0------>继续发送、1----------------->等待、0--------------------->发送方发送的数据长度超过了接收方的接收能力。
第二个字节一般叫做Block Size(BZ),表示在下一帧流控帧返回之前,A节点最多还能发送几帧连续帧给B。
第三个字节一般叫做Separation time(STmin)。代表了两帧连续帧之间的时间间隔。如果为0x14则代表A像B节点发送连续帧时,两帧连续帧之间的时间间隔要大于20ms,不能小于20ms。
2.3 连续帧
Consecutive Frame(CF)代表连续帧。
其中,PCI高四位(第一个字节的高四位)用2来表示连续帧,低四位(sequence number)表示当前帧数为第几个连续帧
例如说21、22一直到2F发送完之后,又会从21开始发送,一直循环。
在发送完连续帧以后,B节点会发送一个流控帧回来,其中的FS为0表示当前数据需要等待处理一下
2.4 单帧传输
PCI高四位一般为0,表示单帧传输。低四位表示这一帧表示要传输的数据内容,有几个字节。
比如一般格式为03+49+53+4f+00+00+00+00。
3. CAN的物理寻址和功能寻址
物理寻址和功能寻址是通过定义不同的CAN ID 来定义向单个ECU发送的物理寻址还是对多个ECU发送的功能寻址。
物理寻址:客户端与服务器是一对一的通信方式
功能寻址:客户端可以对多个ECU发出同一功能的诊断请求,实现一对多的通信方式
功能寻址示例如下:
750发送:10+03
那么会回复601:50+03+.......
和602:50+03+........
物理寻址就是单个了,相当于没有602这个CAN ID。