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

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

1诊断会话控制

诊断会话控制10h 02h:通过物理寻址发送10h 02h,然后写入刷写标志位,最后ECU重启进入Bootloader,在BootLoader中需先发送肯定响应再执行跳转到刷新模式动作。

//参数1
cantp_handle channel = PCANTP_HANDLE_USBBUS1;
//参数2
uds_msgconfig config;
config.can_id = 0x0;
config.can_msgtype = PCANTP_CAN_MSGTYPE_STANDARD;
config.nai.protocol = PUDS_MSGPROTOCOL_ISO_15765_2_11B_NORMAL;
config.nai.target_type = PCANTP_ISOTP_ADDRESSING_PHYSICAL;
config.type = PUDS_MSGTYPE_USDT;
config.nai.source_addr = PUDS_ISO_15765_4_ADDR_TEST_EQUIPMENT;
config.nai.target_addr = PUDS_ISO_15765_4_ADDR_ECU_1;
 //参数3
uint8_t session_type = PUDS_SVC_PARAM_DSC_ECUPS;

uds_status status= UDS_SvcDiagnosticSessionControl_2013(channel, config, &request, session_type);

参数1为PCAN通道
参数2为uds_msgconfig结构体,为PUDS消息的配置
参数3为会话类型

2安全访问

安全访问27h 03h/04h:刷写必须通过安全访问。安全访问(27h)服务在排放相关和安全系统中是强制的。其它系统不要求使用该服务。下载前,通过安全访问过程是强制的,确保只有合法的诊断仪或上位机能对ECU进行下载操作。
SecurityAccess(client_handle, config, PUDS_SVC_PARAM_SA_RSD_5, NULL, 0)

//参数1
cantp_handle channel = PCANTP_HANDLE_USBBUS1;
//参数2
uds_msgconfig config;
config.can_id = 0x0;
config.can_msgtype = PCANTP_CAN_MSGTYPE_STANDARD;
config.nai.protocol = PUDS_MSGPROTOCOL_ISO_15765_2_11B_NORMAL;
config.nai.target_type = PCANTP_ISOTP_ADDRESSING_PHYSICAL;
config.type = PUDS_MSGTYPE_USDT;
config.nai.source_addr = PUDS_ISO_15765_4_ADDR_TEST_EQUIPMENT;
config.nai.target_addr = PUDS_ISO_15765_4_ADDR_ECU_1;
//参数3
uds_msg request;
//参数4
uint8_t security_access_type = PUDS_SVC_PARAM_SA_RSD_5;
//参数5
(uint8_t*)security_access_data = NULL;
//参数6
uint32_t security_access_data_size = 0;
status = UDS_SvcSecurityAccess_2013(channel, config, &request, security_access_type, (uint8_t*)security_access_data, security_access_data_size);

参数1为PCAN通道
参数2为uds_msgconfig结构体,为PUDS消息的配置
参数3为uds_msg结构体,为消息内容
参数4为Request Seed
参数5为可选的要传输到服务器的数据(比如标识)
参数6为参数5的大小

3请求下载

请求下载(34h);

    uint8_t memory_address_buffer[4];
    uint8_t memory_addres_size[4];
    uint8_t memory_address_size = 4;
    uint8_t memory_size_size = 4;

    memset(&request, 0, sizeof(uds_msg));
    memset(&response, 0, sizeof(uds_msg));
    memset(&confirmation, 0, sizeof(uds_msg));
    memset(memory_address_buffer, 0, sizeof(uint8_t) * 4);
    memset(memory_addres_size, 0, sizeof(uint8_t) * 4);
    for (int i = 4; i > 0; i--)
    {
        memory_address_buffer[4 - i] = m_Address >> ((i - 1) * 8) & 0xff;
        memory_addres_size[4 - i] = blocksize >> (((i - 1) * 8)) & 0xff;
    }
status = UDS_SvcRequestDownload_2013(channel, config, &request, 0x0, 0x0, memory_address_buffer, memory_address_size, memory_addres_size,
        memory_size_size);

参数1为PCAN通道
参数2为uds_msgconfig结构体,为PUDS消息的配置
参数3为uds_msg结构体,为发送请求消息内容
参数4为压缩方法 0x0表示不压缩
参数5为加密方法 0x0表示不加密
参数6为要写入数据的服务器内存的起始地址
参数7为memory_address_buffer缓冲区的大小,以字节为单位。
参数8为服务器用来比较未压缩的内存大小在TransferData服务期间传输的数据总量
参数9为memory_size_buffer缓冲区的大小,以字节为单位

4下载(传输)数据

传输数据(36h);

uint8_t* record = new uint8_t[sendsize];
uint16_t record_size = sendsize;
status = UDS_SvcTransferData_2013(channel, config, &request, serial_number, record, record_size);

参数1为PCAN通道
参数2为uds_msgconfig结构体,为请求的配置
参数3为uds_msg结构体,函数创建并发送的请求消息
参数4 计数加1(01~0F)0F后再从01开始计数
参数5缓冲区包含所需的传输参数
参数6参数5的大小

5退出下载请求

请求退出传输(37h)。

uint8_t record[exitsize];
uint8_t record_size = 1;
status = UDS_SvcRequestTransferExit_2013(channel, config, &request, record, record_size);

参数1为PCAN通道
参数2为uds_msgconfig结构体,为请求的配置
参数3为uds_msg结构体,函数创建并发送的请求消息
参数4缓冲区包含所需的传输参数
参数5参数5的大小

6完整性校验(CRC)

“检查刷新完整性”31h 01h F0h 01h:此例程用来检查逻辑块的完整性。

uint8_t routine_control_type = PUDS_SVC_PARAM_RC_STR;
uint16_t routine_identifier = 0xDFFF;
status = UDS_SvcRoutineControl_2013(channel, config, &request, routine_control_type, routine_identifier, routine_control_option_record, routine_control_option_record_size);

参数1为PCAN通道
参数2为uds_msgconfig结构体,为请求的配置
参数3为函数创建并发送的请求消息
参数4为RoutineControl 类型
参数5为服务器本地例程标识符
参数6为包含例程控制选项的缓冲区
参数7为缓冲区大小

7兼容性校验

“检查刷新一致性”31h 01h FFh 01h:一旦完成所有的应用软件或数据块/模块的下载,诊断仪将开始一个例程来触发ECU检查重刷新的一致性。

uint8_t routine_control_type = PUDS_SVC_PARAM_RC_STR;
uint16_t routine_identifier = 0xFF01;
status = UDS_SvcRoutineControl_2013(channel, config, &request, routine_control_type, routine_identifier, routine_control_option_record, routine_control_option_record_size);

参数1为PCAN通道
参数2为uds_msgconfig结构体,为请求的配置
参数3为函数创建并发送的请求消息
参数4为RoutineControl 类型
参数5为服务器本地例程标识符
参数6为包含例程控制选项的缓冲区
参数7为缓冲区大小

你可能感兴趣的:(c++,汽车)