野火科技
直播中

jf_38230569

1年用户 5经验值
私信 关注

【野火】瑞萨RA MCU创意氛围赛+ 基于CAN总线的UDS诊断升级MCU /bootloader/UDS诊断/14229/15765

【瑞萨RA MCU创意氛围赛】 基于CAN总线的UDS诊断升级MCU工具

基于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

更多回帖

发帖
×
20
完善资料,
赚取积分