基于can总线的UDS软件升级
最近学习UDS诊断协议(ISO14229),是一项国际标准,为汽车电子系统中的诊断通信定义了统一的协议和服务。它规定了与诊断相关的服务需求,并没有设计通信机制。ISO14229仅对应用层和会话层做出了定义。UDS包含了ISO14229下属的七个子协议,其中ISO14229-2是在会话层,其他6个子协议在应用层。
OSI模型
这让我想到大学学习计算机网络知识中OSI七层网络模型。
如果MCU要实现UDS功能,还需要建立传输层和网络层,小昭使用的是ISO15765来实现这两层功能,剩下就是数据链路层和物理层,这两层属于底层,MCU已经帮我们实现,做些简单配置就可以了。本次使用野火启明瑞萨RA4M2开发板实现UDS升级功能,将升级包bin文件放到SD卡,即可对can总线下多个设备进行自动化升级。
1、底层功能配置
CAN总线配置
canID接收配置、中断函数
可以之前Renesas瑞萨RA4M2和STM32 CAN通信
定时器配置
OSI网络需要获取毫秒系统时间,判断数据传输是否超时
SD卡配置
后面会介绍,升级文件放在SD卡中。
具体可以看Renesa 瑞萨 RA4M2 移植文件系统FAT32
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 之 外 的 诊 断 会 话 中 。
实际的效果:
左边野火瑞萨RA4M2开发板发送升级包请求,右边MCU接收升级包
避坑
在开发过程,遇到一些坑,分享给大家,防止掉坑里。 关于使用keil瑞萨RA4M2踩过的坑
开发经验(避坑)
在开发过程,遇到一些坑,分享给大家,防止掉坑里。
1、之前在rasc添加的组件不能删除。
下面在rasc添加ThreadX,不只是RTOS,其他组件也出现这种情况。
当去掉组件不使用,重新配置。但是组件还是显示在软件包,导致编译出错。
解决方式,自己琢磨发现:
找到工程下buildinfo.gpdsc文件,删除残余的组件。
会有提示,点击确认就行,残余的组件就没有,可以顺利编译。
但是治不了根, 当你重新再配置,还会出现前面的情况,需要做同样的操作 ,找到工程下buildinfo.gpdsc文件,删除残余的组件。可能需要做其他的配置。
还有可以一种情况,在components下取消组件,在stacks还存在,比如ThreadX,还在stacks中,直接Remove掉。
2、SD卡,FAT32文件系统的开发。
当把较多变量和数组放在局部函数会导致,错误中断
代码例子
//有坑
int transfer_data_cm36(FIL* f_update)
{
UINT update_fnum = 1; /* 文件成功读写数量 */
BYTE update_ReadBuffer[64]={0}; /* 读缓冲区 */
u16 index;
u8 send_transfer_flag = 0;
FRESULT update_res_sd = FR_OK;
uint16_t exit_crc = 0xFFFF;
if(update_fnum < 1)
{}
}
像这样,运行直接Default_Handler
尝试改堆栈空间,也没什么作用。
然后把这部分变量放到全局,就能成功运行。
//
static UINT update_fnum = 1; /* 文件成功读写数量 */
static BYTE update_ReadBuffer[64]={0}; /* 读缓冲区 */
static u16 index;
static u8 send_transfer_flag = 0;
static FRESULT update_res_sd = FR_OK;
static uint16_t exit_crc = 0xFFFF;
int transfer_data_cm36(FIL* f_update)
{
if(update_fnum < 1)
{}
}
3、CAN总线开发,忘记取消过滤CANID
配置成这样,不做过滤处理,提取总线所有标准类型数据帧数据。
开发板的CAN收发器CANH和CANL丝印是反的,花了一些时间才发现
SDK建议使用比较新的版本包括keil5用比较新的,不然很可能出现些奇怪的问题。
功能扩展
1、升级包可以做些加密功能。
2、结合pcan-view,扩展实现CAN报文分析工具。
3、其实有一个很重要的功能就是trustzone,实现权限访问功能,对每个功能服务进行分离和加密。
原文链接
参考链接
Renesas软件包
参考文档: [野火EmbedFire]《瑞萨RA系列FSP库开发实战指南——基于野火启明开发板》—20230412
ISO15765