3. 汽车诊断协议基础与RH850适配

在RH850平台上做诊断系统,协议栈不是孤立存在的,它必须落在具体的通信外设、缓冲区、中断和定时器上。理解UDS、OBD-II、DoIP三者的差异,并知道它们在RH850上分别依赖哪些硬件资源,是后续诊断服务实现和故障管理的基础。本节先厘清协议层次与适配关系,再展开CAN/CAN-FD/LIN外设配置和诊断报文收发的关键实现点。

一、三类诊断协议的定位与RH850承载方式

UDS(ISO 14229)是应用层诊断协议,定义诊断服务、请求/响应格式、会话与安全状态机,本身不绑定具体总线。它通常运行在CAN、CAN-FD、LIN或以太网之上,由ISO-TP(ISO 15765-2)负责多帧拆包与重组。OBD-II是法规排放诊断,应用层服务集较小(如$01、$02、$03、$09),但强制规定了物理层、诊断连接器和PID集合,在乘用车上多以CAN(ISO 15765-4)承载。DoIP(ISO 13400)则把诊断报文封装到IP网络之上,用TCP承载诊断消息、UDP承载车辆发现与状态查询,适合高带宽场景如OTA、大数据刷写。

在RH850上,这三类协议的承载路径不同:UDS over CAN/CAN-FD走RH850的CAN或CAN-FD控制器,经ISO-TP后进入UDS服务层;OBD-II同样走CAN控制器,但服务层是独立的OBD处理模块;DoIP则依赖RH850的以太网MAC与TCP/IP协议栈,诊断消息再映射到UDS服务层。因此,同一套UDS服务核心可以被CAN和DoIP两条路径复用,差异集中在传输层与网络层适配。

UDS / OBD-II / DoIP 在 RH850 上的协议栈承载关系 应用层 UDS 服务核心 (ISO 14229) OBD-II 服务模块 DoIP 消息处理 (ISO 13400) 传输 / 网络层 ISO-TP (ISO 15765-2) 单帧/首帧/连续帧/流控 ISO-TP (OBD 通道) 11-bit / 29-bit ID TCP / UDP + IP TCP:13400 诊断 / UDP:13400 发现 数据链路层 CAN / CAN-FD 控制器 RSCAN / RSCAN-FD CAN 控制器 OBD 物理通道 以太网 MAC (EthernetAVB/TSN) RMII / MII 接口 物理层 CAN 收发器 (ISO 11898-2) CAN 收发器 PHY (100BASE-T1 / 100BASE-TX) 关键适配点: UDS 服务核心可被 CAN 路径与 DoIP 路径复用;OBD-II 服务模块独立于 UDS,但共享 CAN 控制器与 ISO-TP 资源。

二、CAN/CAN-FD外设配置要点

RH850的CAN模块通常以RSCAN或RSCAN-FD形式出现,配置时先确定通道数、波特率和采样点。经典CAN常用500 kbps,采样点建议在75%~87.5%之间;CAN-FD的数据段可提升到2 Mbps或5 Mbps,仲裁段仍保持500 kbps。以RH850 F1x系列为例,若PLL输出CAN时钟为40 MHz,配置500 kbps、采样点80%时,可令TSEG1=13、TSEG2=4、SJW=3,则位时间=1+13+4=18个tq,tq=1/40MHz=25 ns,位时间=450 ns,实际波特率约2.22 Mbps,需重新调整分频。更常见的做法是设置BRP=4,使tq=100 ns,位时间=10个tq,TSEG1=7、TSEG2=2,采样点=(1+7)/10=80%,波特率=1/(10×100ns)=1 Mbps。若目标500 kbps,则BRP=8,tq=200 ns,位时间=10个tq,TSEG1=7、TSEG2=2,采样点80%。这些参数需与总线上其他节点一致,否则会出现位错误或错误帧。

CAN-FD还需配置数据段波特率切换(BRS)和ESI位。数据段若用2 Mbps,在40 MHz时钟下可设BRP=2,tq=50 ns,位时间=10个tq,TSEG1=7、TSEG2=2,采样点80%。发送时,若帧格式为FD且BRS=1,则仲裁段用500 kbps,数据段切到2 Mbps。接收端需同时支持两种速率,否则无法正确采样。此外,CAN-FD的DLC编码与经典CAN不同,DLC=9对应12字节,DLC=10对应16字节,DLC=11对应20字节,DLC=12对应24字节,DLC=13对应32字节,DLC=14对应48字节,DLC=15对应64字节。诊断报文若超过8字节,必须使用FD帧或ISO-TP多帧。

三、LIN外设配置与诊断承载

LIN用于低速车身网络,诊断通常走LIN的节点配置服务(NCF)或传输层(ISO 17987-2)。RH850的LIN模块(RLIN)配置包括波特率(常用19.2 kbps)、同步间隔场、同步场和PID。主节点发送报头,从节点响应。诊断帧使用NAD(节点地址)寻址,支持单帧和多帧传输。配置时需设置LIN计数器、超时和校验方式(经典校验或增强校验)。若诊断数据超过6字节,需用多帧传输,由主节点轮询从节点。LIN诊断的实时性较低,适合非关键故障读取和配置写入。

四、诊断报文收发实现

在RH850上,诊断报文收发通常采用中断+缓冲区方式。以CAN为例,发送时把ISO-TP组好的帧写入发送邮箱,使能发送请求,等待发送完成中断;接收时在接收中断中读取邮箱,按ISO-TP状态机处理单帧、首帧、连续帧和流控帧。下面是一段简化的CAN发送与接收处理示例,展示邮箱配置和ISO-TP首帧发送逻辑:

/* CAN 发送邮箱配置示例(伪代码,基于RH850 RSCAN) */
CAN_MBOX_Tx.id  = 0x7E0;          /* 诊断请求ID */
CAN_MBOX_Tx.dlc = 8;
CAN_MBOX_Tx.data[0] = 0x10;       /* ISO-TP 首帧 */
CAN_MBOX_Tx.data[1] = 0x14;       /* 总长度 20 字节 */
CAN_MBOX_Tx.data[2] = 0x2E;       /* UDS 服务:WriteDataByIdentifier */
CAN_MBOX_Tx.data[3] = 0xF1;       /* 数据标识符高字节 */
CAN_MBOX_Tx.data[4] = 0x90;       /* 数据标识符低字节 */
/* 剩余数据在连续帧中发送 */
CAN_Transmit(CAN_CH0, &CAN_MBOX_Tx);

/* 接收中断处理(简化) */
void CAN_Rx_ISR(void) {
    CAN_MBOX_Rx = CAN_Receive(CAN_CH0);
    if (CAN_MBOX_Rx.id == 0x7E8) {   /* 诊断响应ID */
        ISO_TP_ProcessFrame(&CAN_MBOX_Rx);
    }
}

对于DoIP,收发路径不同:诊断消息先封装成DoIP报文头(协议版本、载荷类型、载荷长度),再通过TCP socket发送。RH850的以太网驱动需配置MAC地址、PHY链路和DMA描述符。接收时从TCP缓冲区读取DoIP头,解析出UDS消息,再交给UDS服务层。DoIP的车辆发现使用UDP广播,端口13400,需处理车辆识别请求和响应。

五、协议适配中的关键判断

实际调试时,常见问题包括:CAN波特率不匹配导致错误帧计数上升;ISO-TP流控帧超时导致多帧传输中断;CAN-FD数据段速率切换失败导致接收端采样错误;DoIP TCP连接建立后未及时发送诊断消息导致超时断开。判断依据可以看错误计数器、ISO-TP状态机状态、DoIP连接状态和诊断响应码。例如,若UDS请求返回0x78(响应挂起),说明服务端正在处理,需等待后续响应;若返回0x7F且否定响应码为0x13,说明请求长度不正确,需检查ISO-TP组包。

在RH850上调试诊断协议时,建议先用CAN分析仪确认物理层和波特率,再抓取ISO-TP帧验证组包逻辑,最后用UDS服务测试会话和安全访问。DoIP则先用ping和UDP发现确认网络连通,再测TCP诊断通道。

总体而言,UDS、OBD-II、DoIP在RH850上的适配,核心是把协议状态机映射到CAN/CAN-FD/LIN外设和以太网外设的中断、缓冲区和定时器上。配置参数必须与总线一致,收发路径必须与协议层次对应,判断依据必须来自可观测的错误计数、状态机和响应码。掌握这些,才能为后续诊断服务实现和故障管理打下可靠基础。