标定CCP协议在S32K144上的移植实战

2023-11-11


前言

CCP协议在新能源汽车电子领域发挥着重要作用,CCP观测和标定作用对开发工程师起着重要作用。

疫情宅在家无聊,把这块的知识重新梳理下。

一、CCP是什么?

CCP(CAN Calibration Protocol)是一种基于CAN总线的ECU(Electronic Control Unit)标定协议,已经在许多欧美汽车厂商得到应用,采用CCP协议可以快速而有效地实现对汽车电控单元的标定。

二、移植步骤

1.准备工作

准备S32K144的CAN驱动

2.移植

CAN驱动部分移植头文件的配置:

配置CCP的ID

配置DAQ

配置中断

/* CCPPAR.H */
#ifndef CCPPAR_H_
#define CCPPAR_H_

#include "Cpu.h"
#include "APPL_CCP_HAL.H"

#include "ccp.h"

#define C_ENABLE_CCP
#define C_MINI_CAN_DRIVER


#define CCP_INTEL

#define CCP_RAM
#define CCP_ROM     const

#define CCP_BYTE    unsigned char
#define CCP_WORD    unsigned short
#define CCP_DWORD   unsigned long
#define CCP_BYTEPTR unsigned char*

#define CCP_DISABLE_INTERRUPT    ccpDisableInterrupt()
#define CCP_ENABLE_INTERRUPT     ccpEnableInterrupt()

#define CCP_MTABYTEPTR  unsigned char*
#define CCP_DAQBYTEPTR  unsigned char*

#define CCP_STATION_ID "CCPtest"
#define CCP_STATION_ADDR 0x1

#define CCP_DTO_ID 0x101
#define CCP_CRO_ID 0x100

#define CCP_DAQ
#define CCP_MAX_ODT 40
#define CCP_MAX_DAQ 1

//#define CCP_SEND_QUEUE_OVERRUN_INDICATION

//#define CCP_SEND_QUEUE
//#define CCP_SEND_QUEUE_SIZE 6

//#define CCP_CHECKSUM
//#define CCP_CHECKSUM_TYPE CCP_WORD

//#define CCP_BOOTLOADER_DOWNLOAD

//#define CCP_CALPAGE

#endif

将CCP需要移植的部分抽取到一个文件中方便移植:

ccpSend             CAN发送的驱动函数

ccpDisableInterrupt     关全局中断

ccpEnableInterrupt      开全局中断

#include "Cpu.h"
#include "APPL_CCP_HAL.H"

#include "ccp.h"

extern can_message_t TxMsg;
extern volatile uint32_t CanRecvFlag;
extern can_message_t RxMsg;

//------------------------------------------------------------------------------
// Global

unsigned long ccpSendFlag = 0;
unsigned long gCounter;

// Current Calibration page
CCP_BYTE ccpCalPage = 0; // Default ROM

/*----------------------------------------------------------------------------*/
/* Transmit the CCP message */
/* Id is CCP_DTO_ID, which is configured at compile time in CAN.C */

void ccpSend( CCP_BYTEPTR msg )
{
    TxMsg.id = CCP_DTO_ID;
    TxMsg.length = 8;
    TxMsg.data[0] = msg[0];
    TxMsg.data[1] = msg[1];
    TxMsg.data[2] = msg[2];
    TxMsg.data[3] = msg[3];
    TxMsg.data[4] = msg[4];
    TxMsg.data[5] = msg[5];
    TxMsg.data[6] = msg[6];
    TxMsg.data[7] = msg[7];
    CAN_Send(&can_pal1_instance, 0, &TxMsg);
    ccpSendFlag = 1;
}


/*----------------------------------------------------------------------------*/
/* Convert a memory address from CCP 8/32bit into a C pointer */

CCP_MTABYTEPTR ccpGetPointer( CCP_BYTE addr_ext, CCP_DWORD addr )
{
  //if (ccpCalPage==1 && addr>=0x14000 && addr<0x18000) { /* CALRAM */
    //return (CCP_MTABYTEPTR) ( addr + 0x30000UL );
  //}

  return (CCP_MTABYTEPTR) addr;
}


/*----------------------------------------------------------------------------*/
// CCP Callbacks

void ccpUserBackground( void )
{
}

CCP_BYTE ccpDisableNormalOperation( CCP_MTABYTEPTR a, CCP_WORD s )
{
  return 1;
}


/*----------------------------------------------------------------------------*/
/* Calibration RAM/ROM Selection */


CCP_DWORD ccpGetCalPage( void )
{
  return (CCP_DWORD)ccpCalPage;
}

void ccpSetCalPage( CCP_DWORD a )
{
  ccpCalPage = (CCP_BYTE)a;

    if (ccpCalPage==1) { /* RAM */
      //#pragma asm
        //mov DPP1,#11h
      //#pragma endasm
    } else {             /* ROM */
      //#pragma asm
        //mov DPP1,#05h
      //#pragma endasm
    }

}

void ccpInitCalPage( void ) {

    #define CALROM_ADDR 0x14000
    #define CALRAM_ADDR 0x44000
    unsigned char *p1 = (unsigned char *)CALROM_ADDR;
    unsigned char *p2 = (unsigned char *)CALRAM_ADDR;
    unsigned int i;
    for (i=0;i<0x4000;i++) {
      // *p2++ = *p1++;
    }
}


//------------------------------------------------------------------------------
// 10ms Timer Isr

void CCP_DAQ_Callback(void)
{
  // 10 ms
  // Data Acquisition on Channel 2
  ccpDaq(1);

}


//------------------------------------------------------------------------------
void CCP_Init(void)
{
    // initialize Calibration RAM
    ccpInitCalPage();


    // Initialize CCP driver
    ccpInit();
}

void CCP_Main(void)
{
    if(CanRecvFlag)
    {
        CanRecvFlag = 0;

        ccpCommand(&RxMsg.data[0]);
    }

    // Check for pending CCP transmit messages (DTO)
    //if (ccpSendFlag)
    {
        //ccpSendFlag = 0;
        ccpSendCallBack();
    }

    ccpBackground();
}

void ccpDisableInterrupt(void)
{
    DISABLE_INTERRUPTS();
}

void ccpEnableInterrupt(void)
{
    ENABLE_INTERRUPTS();
}

在main函数中调用如下:

调用初始化

主循环中10ms定时器调用DAQ任务

int main()
{  
  ...
  CCP_Init();

  ...

  for(;;)
  {

	...

	if(ChkSoftTimerTout(AppTimer, TMR_APP_TEST_CNT))
	{
		SetSoftTimerTout(AppTimer, TMR_APP_TEST_CNT, 5);

		*((uint32_t *)TestCnt) += 1;

		*((uint32_t *)(TestCnt+3)) += 1;
	}

	CCP_Main();

	if(ChkSoftTimerTout(AppTimer, TMR_APP_DAQ1_TEST))
	{
		SetSoftTimerTout(AppTimer, TMR_APP_DAQ1_TEST, 10);

		CCP_DAQ_Callback();
    }
}

3.测试验证

从测试工程中elf用ASAP2 Editor 工具制作A2L文件

将A2L文件导入CANape开启标定

测试效果如下:


总结

通过标定协议我们就可以更快的调试程序了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

标定CCP协议在S32K144上的移植实战 的相关文章

  • HTML <progress> 标签

    实例 正在进行的下载
  • kali 破解压缩包密码

    一 提取加密压缩包的哈希值 zip2john 文件名 gt hash txt zip2john 文件名 能提取出文件的哈希值 然后我们通过重定向 将它写入一个文档中 二 利用工具对提取到的哈希值进行破解 john hash txt 然后就能
  • windows11安装微软商店里的ubuntu报错,已解决

    1 问题情况 安装微软商店的Ubuntu系统 安装完成后打开开始菜单的Ubuntu图标 初始化过程中卡住 点击界面下方的展开按钮有文字提示报错 报错提示内容为 Installing this may take a few minutes W
  • 京东抢购服务高并发实践

    声明 本位来自京东张开涛的微信公众号 kaitao 1234567 授权CSDN转载 如需转载请联系作者 作者 张子良 京东高级开发工程师 在京东负责抢购后端服务系统架构和开发工作 责编 钱曙光 关注架构和算法领域 寻求报道或者投稿请发邮件
  • eclipse与Mysql数据库是否连接的检验

    先去下载与Mysql数据库版本匹配的架包 然后导入到项目中 在这里我用的是Mysql8 0 Mysql8 0的驱动类名是 com mysql cj jdbc Driver 首先新建一个Demo类 然后进行数据库的连接即检验 代码如下 pac
  • Java架构直通车——基于数据库for update实现分布式锁

    文章目录 使用数据库解决超卖问题 非分布式 分为三步 原始方法 合并二 三步 使用update行锁使操作下沉到数据库 合并一 二 三步 使用方法锁 优化 使用块锁 使用数据库解决分布式超卖问题 主要原理 解决方案 解决库存超卖问题 可以另扣

随机推荐

  • 转帖:C++大师Lippman:我对中国程序员的忠告

    天极网特稿 记者 宋保强 C 语言的创立者 斯坦 利普曼 Stan Lippman 9月17日参加了在北京召开的微软技术大会Tech Ed2004并做了 The C Binding Integrating a Static and dyna
  • 嵌套循环基础练习题

    目录 java循环以及循环嵌套练习题 01 求10以内的偶数的和 02 求100以内的所有素数 素数 一个大于1的自然数 除了1和它本身外 不能被其他自然数整除 03 随机产生一个1 100之间的整数 看能几次猜中 要求 猜的次数不能超过7
  • CloudEvents 入门文档

    CloudEvents 入门文档 1 0 3 版本 文档来自 GitHub CloudEvents 摘要 这份非技术规范文档用来为你提供关于 CloudEvents 规范的总体概览 它补充了 CloudEvents 规范的相关背景以及在制定
  • midjourney最新使用方法教程指令关键词

    自ChatGPT走红以来 以 聊天 为核心的人工智能协作工具们受到了各行各业的关注 让AI写首诗 发封邮件 或是做一份计划书 这些工作已经成为AI聊天机器人的 日常需求 但似乎 人们遗忘了AI还具有创作文字以外的内容 比如 一幅画 2022
  • [完美解决]VS2012创建或打开C++浏览数据库文件时出现错误

    完美解决 VS2012创建或打开C 浏览数据库文件时出现错误 在使用VC2012的时候出现问题如下 创建或打开C 浏览数据库文件XXXXXXX stdf时发生错误 IntelliSense和浏览信息将不能用于C 项目 请确保已安装Micro
  • 全自动高清录播服务器,常态化高清录播服务器 高清全自动录播系统

    特点 支持高清视频会议终端1080P 720P下的录制 点播和直播 双流录制可到高两路1080P 60帧图像 支持把录制下来的会议或者培训内容直播给网内所有的客户端 PC和视频会议终端 支持IPhone IPAD 安卓系统等点播和直播 设计
  • BitLocker的解密

    BitLocker的解密 解密 以管理员身份运行命令提示符 然后在里面输入命令 C指的是盘符 这里以解密C为例 manage bde off C 弹出所有用法 manage bde 更多使用方法 可参考官网 https docs micro
  • win11打开应用被管理员阻止怎么办 window11管理员已阻止你运行此应用的解决方法

    大家在使用windows11系统时 是否有出现过电脑运行应用被阻止的情况呢 可能很多人的蒙着不知道如何处理这个问题 下面就和大家分享一下解决方法吧 更多Windows11安装教程 可以参考小白重装系统网 1 用鼠标右键单击开始图标 接着在出
  • TCP和UDP

    文章目录 TCP和UDP 什么是TCP 用JAVA实现一个基于TCP的简单网络通信 什么是UDP 用JAVA实现一个基于UDP的网络通信 TCP和UDP 什么是TCP TCP即传输控制协议 Transmission Control Prot
  • 【Unity学习笔记】Animation、Input类

    Animation Animation View 通过动画视图可以直接创建和修改动画片段 Animation Clips 显示动画视图 Window Animation 创建动画片段 为物体添加Animation组件 在动画视图中创建片段
  • Maven、JDK的安装以及环境配置

    Maven 项目管理工具 什么是Maven Maven是一个项目管理工具 它包含了一个对象模型 一组标准集合 一个依赖管理系统 和用来运行定义在生命周期阶段中插件目标和逻辑 核心功能 Maven的核心功能是合理叙述项目间的依赖关系 通俗点就
  • 端口转发工具 rinetd 的使用

    rinetd 可以将服务器的端口转发到另一个端口 1 安装rinetd 服务 vi etc yum repos d nux misc repo 输入以下内容报存 nux misc name Nux Misc baseurl http li
  • c++与c#的区别

    1 继承 C 支持多继承 C 类只能继承一个基类中的实现但可以实现多个接口 2 数组 声明 C 数组和声明 C 数组的语法不同 在 C 中 标记出现在数组类型的后面 3 数据类型 在C 中bool类可以与整型转换 但C 中bool 类型和其
  • 脚本ssh进入其他主机报错--bash: jps: command not found和Error: JAVA_HOME is not set and java could not be found

    文章目录 一 报错图例 二 报错原因 三 解决方案 三种 一 报错图例 二 报错原因 原因 在shell脚本写的ssh到其他节点的时候默认是不加载配置文件的 linux并不能去找到java中jps的命令和java的path路径等 三 解决方
  • 【java面试题】lock和synchronized有什么区别?

    学习目标 掌握 lock 与 synchronized 的区别 理解 ReentrantLock 的公平 非公平锁 理解 ReentrantLock 中的条件变量 lock 与 synchronized 的区别有三个层面 学习内容 1 不同
  • QT运行不出界面

    如果只出现如下一个黑色运行窗口 说明你环境配置的基本没啥问题 可以试试 项目 gt 构建设置中 gt General gt Shadow build 取消勾选 如下 如果第一种没有解决 看下构建出的release目录或者debug目录中 是
  • 自己实现图形验证码

    如果不想重复造轮子 参考上一篇文章 SpringBoot生成图形验证码 Muscleheng的博客 CSDN博客 这里不需要依赖开源组件包 完全自己实现图形验证码功能 两步完成 第一步 编写图形验证码工具 package com zhh d
  • 微信小程序 webiew缓存问题

    在微信小程序webview中嵌套H5页面 我们原本使用了localStorage用来标识用户信息的 但是后来发现在android手机上每一次杀掉小程序进程之后 localStorage的数据也会被清除 这样的话就和我们原本的意愿是相违背的
  • web 服务器安全维护,Web服务器安全攻击及防护机制详解

    Web安全分为两大类 Web服务器的安全性 Web服务器本身安全和软件配置 Web应用程序的安全性 在Web服务器上运行的Java ActiveX PHP ASP代码的安全 Web服务器面临的攻击 Web服务器攻击利用Web服务器软件和配置
  • 标定CCP协议在S32K144上的移植实战

    文章目录 目录 文章目录 前言 一 CCP是什么 二 移植步骤 1 准备工作 2 移植 3 测试验证 总结 前言 CCP协议在新能源汽车电子领域发挥着重要作用 CCP观测和标定作用对开发工程师起着重要作用 疫情宅在家无聊 把这块的知识重新梳