• 442查看
  • 0回复

[测试标定] 咬文嚼字ASAM_XCP——Communication Sequences

[复制链接]


该用户从未签到

发表于 21-1-2024 11:28:20 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


01

简介

哈哈明天我去UC震惊部上班了!

其实起完标题是想好好的看一看XCP协议的建立会话、标定、同步数据、刷写从机、关闭会话的整个流程的。但是项目中使用的协议栈并不完整,并且为了方便使用,许多配置都是关闭状态,所以本文还是简单介绍下XCP的连接和标定吧。

文末有 脸滚键盘之XCP_Calibration,读/写mcu任意变量,记得划到文章最后!

附个缩写表:
缩写
描述
ASAM
Assoication for Standardization of Automation and Measuring System
CTO
Command Transfer Object
DAQ
Data Acquistion
DTO
Data Transfer Object
ODT
Object Descriptor Table
PGM
Programming
PID
Packet IDentifier

本文的主节点:0x333,从节点:0x777。

02

建立会话



FF:XCP_STATE_CONNECTED

咬文嚼字ASAM_XCP——Communication Sequencesw1.jpg

上位机(CAN设备:0x333)的帧格式:

咬文嚼字ASAM_XCP——Communication Sequencesw2.jpg

下位机(ECU:0x777)

咬文嚼字ASAM_XCP——Communication Sequencesw3.jpg

回复内容结构体bit信息如下:

RESOURCEparameter:

咬文嚼字ASAM_XCP——Communication Sequencesw4.jpg

COMM_MODE_BASICparameter:

咬文嚼字ASAM_XCP——Communication Sequencesw5.jpg

图中log可译为上位机发送connect命令,下位机回复自身支持calibration、

DAQlists、stimulation,不支持Flashprogramming;自己是slave从机,

数据发送和 接收最大字节数均为8,协议层、tp层版本均为01。



FD:Get_STAUS

咬文嚼字ASAM_XCP——Communication Sequencesw6.jpg

回复的帧结构如下:

咬文嚼字ASAM_XCP——Communication Sequencesw7.jpg

咬文嚼字ASAM_XCP——Communication Sequencesw8.jpg

即发送FD命令后,下位机会回复当前的工作状态。



F6:Get_Seed

F7:UNLOCK

项目并没有配置UNLOCK,咱们这边就简单介绍一下。

咬文嚼字ASAM_XCP——Communication Sequencesw9.jpg

咬文嚼字ASAM_XCP——Communication Sequencesw10.jpg

03

CALIBRATION

标定log如下,发完这些指令后,上位机就可以接收mcu的数据了,接下来一帧一字节一比特位来分析。

咬文嚼字ASAM_XCP——Communication Sequencesw11.jpg



D6:FREE_DAQ

注意下协议栈的状态变化:

DaqState_en= XCP_DAQ_STATE_FREE_DAQ

咬文嚼字ASAM_XCP——Communication Sequencesw12.jpg

执行 Xcp_CmdFreeDaq() ,清空DAQ队列。

咬文嚼字ASAM_XCP——Communication Sequencesw13.jpg



D5:ALLOC_DAQ

DaqState_en =XCP_DAQ_STATE_ALLOC_DAQ

咬文嚼字ASAM_XCP——Communication Sequencesw14.jpg

执行 Xcp_CmdAllocDaq()设置队列,找到对应的RAM区。这边主要是如果isolar中配置了XcpDaqRamShifting的话,会有RAM位置的偏移以及导致ram overflow的风险,项目中目前是定义一个40000自己的数组来做Daq区。参考下图:

咬文嚼字ASAM_XCP——Communication Sequencesw15.jpg

收到命令之后的协议栈状态机:

咬文嚼字ASAM_XCP——Communication Sequencesw16.jpg

接下来所有的协议数据都将解析到 数组 Xcp_PLDaqRam_au32[] 中。



D4:ALLOC_ODT

DaqState_en= XCP_DAQ_STATE_ALLOC_ODT

咬文嚼字ASAM_XCP——Communication Sequencesw17.jpg

咬文嚼字ASAM_XCP——Communication Sequencesw18.jpg

ODT可以理解为收到命令后,下位机需要回复的数据帧数,之后下位机的协议栈在数据组包时,也会用到这个ODT count。

咬文嚼字ASAM_XCP——Communication Sequencesw19.jpg



D3:XCP_DAQ_STATE_ALLOC_ODT_ENTRY
DaqState_en = XCP_DAQ_STATE_ALLOC_ODT_ENTRY
咬文嚼字ASAM_XCP——Communication Sequencesw20.jpg

咬文嚼字ASAM_XCP——Communication Sequencesw21.jpg

接下来D3命令告诉下位机之后发送的ODT信息为第一帧内有2个变量。



E2:SET_DAQ_PTR

DaqState_en =XCP_DAQ_STATE_WRITE_DAQ

咬文嚼字ASAM_XCP——Communication Sequencesw22.jpg

咬文嚼字ASAM_XCP——Communication Sequencesw23.jpg

咬文嚼字ASAM_XCP——Communication Sequencesw24.jpg



E1:WRITE_DAQ

DaqState_en= XCP_DAQ_STATE_WRITE_DAQ

咬文嚼字ASAM_XCP——Communication Sequencesw25.jpg

将地址存储到对应的ODT中去。

咬文嚼字ASAM_XCP——Communication Sequencesw26.jpg

看到这边在想,为啥数据存到数组中而不是结构体数组方便解析呢?

但其实不对,DAQ ODT的大小是会根据实际的标定量变化,而整个xcp的协议栈看下来,有点像是在嵌入式的C中实现了安全模式的mallco了,可谓是经典。

整个流程跑下来,我们看下log和数据:

咬文嚼字ASAM_XCP——Communication Sequencesw27.jpg

咬文嚼字ASAM_XCP——Communication Sequencesw28.jpg



E0:SET_DAQ_LIST_MODE

咬文嚼字ASAM_XCP——Communication Sequencesw29.jpg

帧格式:

咬文嚼字ASAM_XCP——Communication Sequencesw30.jpg

上位机发送的0x00代表XCP Direction for DAQ,即将开始DAQ。



DE:DAQ_PREPARE_START
DaqState_en = XCP_DAQ_STATE_PREPARE_START.
咬文嚼字ASAM_XCP——Communication Sequencesw31.jpg

咬文嚼字ASAM_XCP——Communication Sequencesw32.jpg

检查下DAQ list Num是否对应,之后修改DAQ mode。

咬文嚼字ASAM_XCP——Communication Sequencesw33.jpg

咬文嚼字ASAM_XCP——Communication Sequencesw34.jpg



DD:START_STOP_SYNCH

DaqState_en = XCP_DAQ_STATE_READY_TO_RUN

咬文嚼字ASAM_XCP——Communication Sequencesw35.jpg

咬文嚼字ASAM_XCP——Communication Sequencesw36.jpg

设置mode为 XCP_DAQLISTMODE_RUNNING,按照DAQ对ram区做初始化 然后准备开始执行DAQ。
咬文嚼字ASAM_XCP——Communication Sequencesw37.jpg

状态设置完之后,周期task就可以根据设置好的DAQ和ODT对master输出数据了。

简单举个例子,具体数据打包的代码就不一一列举了,下图可以看到可以看到RAM位置的信息已经被拷贝进来了。

咬文嚼字ASAM_XCP——Communication Sequencesw38.jpg



STOPPING THE DATA TRANSFER

首先:DE 02: START_STOP_DAQ_LIST

DD 02 : START_STOP_SYCNCH

咬文嚼字ASAM_XCP——Communication Sequencesw39.jpg

即可停止标定了,命令帧格式上面已有介绍。

04

DOWNLOAD

简单列一个hex download的过程图,偷懒了其实是工具下载时提供的提示图。

咬文嚼字ASAM_XCP——Communication Sequencesw40.jpg

咱们就可以把hex文件中的数据,download到ECU指定的位置去了。

还是介绍一下命令格式,这边的指令比起测量就少了很多。



F6:SET_MTA

咬文嚼字ASAM_XCP——Communication Sequencesw41.jpg

协议栈会把地址信息拷贝到 Xcp_NoInit[0].Session.Mta.AddrValue 。

      



download

download有2种命令,EE和F0,分别表示max download和 short download,会将数据拷贝到F6的地址中去。

咬文嚼字ASAM_XCP——Communication Sequencesw42.jpg

咬文嚼字ASAM_XCP——Communication Sequencesw43.jpg

short download会有一个长度位。

咬文嚼字ASAM_XCP——Communication Sequencesw44.jpg

咬文嚼字ASAM_XCP——Communication Sequencesw45.jpg

05

脸滚键盘之QWERDF

看完整个流程之后,XCP上位机无非就是通过A2L、hex文件中的地址、数据信息做解析,通过XCP协议将数据打包给ECU,最后ECU通过如下函数,将数据复制或者再打包返回给上位机。

咬文嚼字ASAM_XCP——Communication Sequencesw46.jpg

看完ASEM-Part5,我们已经掌握了协议,那么是不是可以自己发指令来读取、设置变量呢? 在实际工作中,如果出现没有调试环境、只有一个CAN设备时,我们能不能秀一把?

模拟下读取某个数组变量。先设置好指令:

咬文嚼字ASAM_XCP——Communication Sequencesw47.jpg

实操:

咬文嚼字ASAM_XCP——Communication Sequencesw48.jpg

咱们再修改下变量,看看发的值能不能实时变更。(其实是动图太大,要分两次发哈哈)

咬文嚼字ASAM_XCP——Communication Sequencesw49.jpg

再模拟下改变某个变量。

咬文嚼字ASAM_XCP——Communication Sequencesw50.jpg

咬文嚼字ASAM_XCP——Communication Sequencesw51.jpg

06

错误码

最后的最后的最后,附个错误码。

咬文嚼字ASAM_XCP——Communication Sequencesw52.jpg

快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 1-2-2025 13:10 , Processed in 0.223851 second(s), 32 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.