终于有时间整理下基于CANoe的UDS Bootloader,网上也看到了有其他网友分享的例子,基于OSEK_TP,在新版本的CANoe里面,已经被新的接口取代了。
本刷新软件是基于CANoe 8.5, 编程语言是CAPL,刷写流程基于ISO15765-3,支持读S19文件。
基于diagSendRequest 和on diagResponse。
主界面如下:

刷写Trace 如下:

代码如下:
关于密钥部分,只是做了 简单的字节顺序调整,可以根据自己项目要求调整密钥算法。

variables
{long dwFile;char s19Filename[500];byte dataBuffer[0x0FFFFF];long data_len = 0;long transferData_idx=0;int iRespTimeout=500;enum{Extended_Session=0,TesterPresent,Disable_DTC,Disable_Communication,Programming_Session,Pending_Programming,Security_Access_Seed,Security_Access_Key,Erase_Flash,Request_Download,Transfer_Data,Transfer_Exit,Reset,Stop}prog_step=Extended_Session;enum {PROG_NOT_STARTED,PROG_INPROGRESS,PROG_STOPED}prog_status=PROG_NOT_STARTED;enum {Pre_programming,Programming,Post_Programming}programming_state;const int gSeedArraySize= 4;const int gKeyArraySize= 4;byte gSeedArray[gSeedArraySize];byte gKeyArray[gKeyArraySize];long MEM_START_ADDR = 0x001000;long MEM_END_ADDR   = 0x001FFF;long MEM_SIZE   = 0;byte sequence_num=1;msTimer delayTimer;
}
on envVar Env_Start
{ if(@Env_Start ==1){if(dwFile!=0) /*S19 File*/{programming_state = Pre_programming;prog_status = PROG_INPROGRESS;prog_step=Extended_Session;@Env_Progress =0;display_status("Preprogramming.......",'T');Preprogramming_seq();}else{display_status("ERROR - Load S19 File",'F');}}
}on envVar Env_Stop
{  if(@Env_Stop ==1){if(prog_status==PROG_INPROGRESS){prog_status = PROG_STOPED;prog_step = Stop;programming_state=Pre_programming;@Env_Progress =100;display_status("Flasing Interrupted",'F'); }}}on envVar Env_FilePath
{dwFile= getvalue(Env_FilePath,s19Filename);
}
void Preprogramming_seq()
{if(prog_status == PROG_INPROGRESS){switch(prog_step){case Extended_Session:diagSendRequest(dr_ExtendSession);display_status("1.1 Extended Session",'T');prog_step = TesterPresent;break;case TesterPresent:diagSendRequest(dr_3E_00);display_status("1.2 TesterPresent",'T');prog_step = Disable_DTC;break;case Disable_DTC:diagSendRequest(dr_85_DisDTC);display_status("1.3 Control DTC",'T');prog_step = Disable_Communication;break;case Disable_Communication:diagSendRequest(dr_28_DisAll);display_status("1.4 Communication Control",'T');prog_step = Security_Access_Seed;break;case Security_Access_Seed:diagSendRequest(dr_27_SeedReq);display_status("1.5 Request Seed",'T');prog_step = Security_Access_Key;break;case Security_Access_Key:Seed2Key();diagSetParameterRaw(dr_27_KeyReq, "securityKey", gKeyArray, gKeyArraySize);diagSendRequest(dr_27_KeyReq);display_status("1.6 Send Key",'T');prog_step = Programming_Session;break;case Programming_Session:diagSendRequest(dr_ProgSession);display_status("1.6 Programming Session",'T');programming_state=Programming;prog_step = Erase_Flash;break;default:break;}}
}void Programming_seq()
{byte memAddr[4];byte memSize[4];byte buff[512];int i;if(prog_status == PROG_INPROGRESS){switch(prog_step){case Erase_Flash:memAddr[0] = (byte)(MEM_START_ADDR>>24);memAddr[1] = (byte)(MEM_START_ADDR>>16);memAddr[2] = (byte)(MEM_START_ADDR>>8);memAddr[3] = (byte)(MEM_START_ADDR);memSize[0] = (byte)(MEM_SIZE>>24);memSize[1] = (byte)(MEM_SIZE>>16);memSize[2] = (byte)(MEM_SIZE>>8);memSize[3] = (byte)(MEM_SIZE);diagSetParameterRaw(dr_31_EraseFlash, "memory_addr", memAddr, 4);diagSetParameterRaw(dr_31_EraseFlash, "memory_size", memSize, 4);diagSendRequest(dr_31_EraseFlash);display_status("2.1 Erase Flash",'T');prog_step = Request_Download;break;case Request_Download:memAddr[0] = (byte)(MEM_START_ADDR>>24);memAddr[1] = (byte)(MEM_START_ADDR>>16);memAddr[2] = (byte)(MEM_START_ADDR>>8);memAddr[3] = (byte)(MEM_START_ADDR);memSize[0] = (byte)(MEM_SIZE>>24);memSize[1] = (byte)(MEM_SIZE>>16);memSize[2] = (byte)(MEM_SIZE>>8);memSize[3] = (byte)(MEM_SIZE);diagSetParameterRaw(dr_34_ReqDownload, "memory_addr", memAddr, 4);diagSetParameterRaw(dr_34_ReqDownload, "memory_size", memSize, 4);diagSendRequest(dr_34_ReqDownload);display_status("2.2 Request_Download",'T');prog_step = Transfer_Data;Read_s19File(s19Filename);break;case Transfer_Data:for(i=0;i<512;i++){buff[i]=dataBuffer[transferData_idx++];}diagSetParameter(dr_36_TransferData, "blockSequenceCounter", sequence_num);diagSetParameterRaw(dr_36_TransferData, "transferData", buff,512);diagSendRequest(dr_36_TransferData);if(sequence_num==0xFF){sequence_num =0;}else{sequence_num ++;}@Env_Progress = transferData_idx*100/data_len;if(transferData_idx>=data_len){prog_step = Transfer_Exit;sequence_num =1;transferData_idx=0;@Env_Progress = 100;}break;case Transfer_Exit:diagSendRequest(dr_37_ReqTransferExit);display_status("2.4 Request TransferExit",'T');programming_state=Post_Programming;prog_step = Reset;break;default:break;}}
}void Post_programming_seq()
{if(prog_status == PROG_INPROGRESS){switch(prog_step){case Reset:diagSendRequest(dr_EcuReset_01);display_status("3.1 Ecu Reset",'T');prog_status = PROG_STOPED;prog_step = Stop;programming_state=Pre_programming;break;default:break;}}
}on diagResponse *
{byte data[4096];long size;diagResponse * resp; // declare response with no concrete interpretationsize=this.GetPrimitiveSize(); // get length of responsethis.GetPrimitiveData(data, elcount(data)); // copy actual response from "on diagResponse *" into data arrayswitch(data[0]){case 0x67: // UDS: SecurityAccess_Process positive Responseif(data[1]==0x01) {gSeedArray[0]=data[2];gSeedArray[1]=data[3];gSeedArray[2]=data[4];gSeedArray[3]=data[5];}case 0x50:// UDS: DiagnosticSessionControl_Process positive Responsecase 0x51: // UDS: EcuReset_Process positive Responsecase 0x7E: // UDS: TestPresent positive Responsecase 0x71: // UDS: Routine Control positive Responsecase 0x68: // UDS: CommunicationControl positive Responsecase 0x74: // UDS: RequestDownload positive Responsecase 0x76: // UDS: TransferData positive Responsecase 0x77: // UDS: RequestTransferExit positive Responsecase 0xC5: // UDS: ControlDTCSetting positive ResponsesetTimer(delayTimer,10);break;case 0x7F:// UDS: Negative Responsebreak;default:break;}
}
on timer delayTimer
{if(programming_state==Pre_programming){Preprogramming_seq();}else if(programming_state==Programming){Programming_seq();}else{Post_programming_seq();}
}
void Seed2Key(void)
{gKeyArray[0]=gSeedArray[3];gKeyArray[1]=gSeedArray[2];gKeyArray[2]=gSeedArray[1];gKeyArray[3]=gSeedArray[0];
}

欢迎关注六度杂货铺公众号, 回复 UDS Bootloader即可索取。

基于CANoe的UDS Bootloader刷写软件相关推荐

  1. 基于canoe开发的Bootloader刷写上位机,符合uds流程

    基于canoe开发的Bootloader刷写上位机,符合uds流程,可供项目应用和学习 另有支持周立功can卡的Bootloader上位机,符合uds规范的支持s32k144,英飞凌的Bootload ...

  2. 【CANOE】- 基于CAPL的UDS Bootloader刷写设计

    文章目录 前言 一.创建Canoe的工程 二.新建CAPL脚本的.can文件 三.加入CDD文件 四.编写CAPL脚本 4.1 CDD文件引用 4.2 如何定义诊断报文 前言 这里我们只是提供下思路, ...

  3. 基于TSMaster的UDS刷写教程

    今天给大家介绍基于TSMaster的UDS诊断刷写流程.基本流程主要分为基本参数配置.刷写流程两部分. 一.基本参数配置 1.新建工程 打开TSMaster软件,选择创建新工程-诊断-UDS诊断,然后 ...

  4. 基于CANoe的Bootloader上位机软件 下位机为飞思卡尔MC9S12G128MLL

    基于CANoe的Bootloader上位机软件 下位机为飞思卡尔MC9S12G128MLL ID:6850668870980676Max_Min

  5. canoe的dela_一种基于CANoe的ECU软件刷新方法及装置的制造方法

    一种基于CANoe的ECU软件刷新方法及装置的制造方法 [技术领域] [0001]本发明涉及汽车电子技术领域,尤其涉及一种基于CANoe的ECU软件刷新方法及 目-ο [背景技术] [0002]随着汽 ...

  6. PCAN-UDS API实现uds协议的BootLoader刷写流程

    本文探讨使用PCAN官方的PCAN-UDS API来实现BootLoader刷写流程.不对流程进行详解,对流程不熟悉的同学可以参考https://blog.csdn.net/king110108/ar ...

  7. 基于canoe 新建一个lin工程_基于CANoe的高性能网关测试系统的构建

    < 工业控制计算机 > 2010 年第 23 卷第 8 期 进行整车电气系统架构设计时 , 由于动力系统 Powertrain 与车身系统 Comfort 在控制要求上的不同 , 通常将整 ...

  8. 车载网络 - BootLoader刷写 - 总纲

    随着车载以太网技术的快速发展,智能汽车也已经走进了千家万户,OTA无线解决方案也逐渐走进了大众的视野:实际上在车载以太网未出现之前,我们车上大多数使用的升级一般都是adb.U盘等不太方便的刷写方式,并 ...

  9. 基于ARM的嵌入式Bootloader实现自动升级

    摘要:本文阐述了ARM7嵌入式系统Bootloader的基本流程,重点分析了在Bootloader中通过CF存储卡或硬盘实现对内核或文件系统进行升级.并通过EM8624L在ARM+uClinux下实验 ...

最新文章

  1. 菜鸡记录-王爽-汇编语言-实验十(编写子程序-解决除法溢出)
  2. bmaplib vue 调用_Vue-cli3/4中使用AMap、BMap
  3. EasyUI datagrid动态加载json数据
  4. vss6 forgot admin password
  5. 数字图像处理:第二十一章 视频压缩标准
  6. 1.17 import static静态导入
  7. C# 中的 ref 已经被放开,或许你已经不认识了
  8. netty接收大文件的方法
  9. 阿里技术专家告诉你,如何画出优秀的架构图?
  10. 动态修改css 规则
  11. 【数字信号去噪】基于matlab奇异值分解(SVD)数字信号降噪【含Matlab源码 1020期】
  12. SSH开发的物流管理系统
  13. poi导出xlsx文件后,打开报“因为文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配。”的解决方法
  14. css 给文字加下划线
  15. 网络诊断提示:远程计算机或设备将不接受连接 (根治 )
  16. 【蓝桥杯】看完这些,还在担心自己拿不到奖?
  17. 解决!只有IE64位浏览器能上网,其他软件都上不了网
  18. forEach,$.each()以及$().each()的比较
  19. spark python_Python、流、SQL 有更新!耗时两年,Spark 3.0 重磅发布!
  20. 如何在互联网存量时代做电商?

热门文章

  1. 无线网桥有服务器吗,无线网桥的三种用法
  2. lua可以调用mysql数据库吗_Lua 数据库访问
  3. 时间同步装置和卫星对时是变电站基本要求
  4. https双向认证訪问管理后台,採用USBKEY进行系统訪问的身份鉴别,KEY的证书长度大于128位,使用USBKEY登录...
  5. java打包成jar|执行jar包中的main方法
  6. postman使用———(一)登录获取token设置全局变量/环境变量
  7. Android自定义一个省份简称键盘
  8. 名人故事之 Ivan Edward Sutherland
  9. CentOS 7 安装 libzip 1.5.2
  10. oracle数据库的基本教程 pdf,Oracle数据库技术基础教程 PDF 下载