本帖最后由 小昭debug 于 2023-7-3 12:58 编辑
最近学习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,实现权限访问功能,对每个功能服务进行分离和加密。 参考链接
[color=rgb(12, 147, 228) !important]Renesas软件包 参考文档: [野火EmbedFire]《瑞萨RA系列FSP库开发实战指南——基于野火启明开发板》—20230412
[color=rgb(12, 147, 228) !important]ISO15765
|