基于can总线的UDS软件升级
最近学习UDS诊断协议(ISO14229),是一项国际标准,为汽车电子系统中的诊断通信定义了统一的协议和服务。它规定了与诊断相关的服务需求,并没有设计通信机制。ISO14229仅对应用层和会话层做出了定义。UDS包含了ISO14229下属的七个子协议,其中ISO14229-2是在会话层,其他6个子协议在应用层。
OSI模型
这让我想到大学学习计算机网络知识中OSI七层网络模型。
如果MCU要实现UDS功能,还需要建立传输层和网络层,小昭使用的是ISO15765来实现这两层功能,剩下就是数据链路层和物理层,这两层数据底层,MCU已经帮我们实现,做些简单配置就可以了。
1、底层功能配置
CAN总线配置
canID接收配置、中断函数
定时器配置
OSI网络需要获取毫秒系统时间,判断数据传输是否超时
SD卡配置
后面会介绍,升级文件放在SD卡中。
SD卡DMA功能
2、网络层
ISO15657协议,它是为上层应用做服务,假设上层应用下发了256个字节给到网络层,要是物理层实现就头很大了,大家都知道,在标准can中,一次最多只能传八个字节数据。所以就有网络层的出现,15675实现将上层数据进行拆包,八个八个字节数据给到物理层,相反,如果物理层接收到数据,让后将一帧一帧数据丢给网络层,网络层会找到头数据和尾数据,将一帧帧数据进行大包给到应用层。这就是网络层,ISO15765的作用,实现数据拆包和打包的作用。
具体的报文格式可以参考这篇文章
ISO 15765-2标准报文格式详情
3、应用层
ISO14229服务,不会全部介绍,只讲bootloader升级可能要用到的服务。
用服务有:
会话服务0x10 session
安全访问SecurityAccess(0x27)
内存访问0x23 Read Version Information Service
网络管理CommunicationControl(0x28)
例程功能RoutineControl (0x31) service
请求下载0x34RequestDownload
数据传输0x36transferData
退出传输功能0x37 RequestTransferExit
MCU复位0x11 ECUReset
保持会话,TesterPresent(0x3E)服务,该 服 务 用 于 将 一 个 或 多 个 服 务 器 保 存 在 defaultSession 之 外 的 诊 断 会 话 中 。
实际的效果:
左边野火瑞萨R4M2开发板发送升级包请求,右边MCU接收升级包
避坑
在开发过程,遇到一些坑,分享给大家,防止掉坑里。 关于使用keil瑞萨A4M2踩过的坑