基于S32DS+LIN_Stack_S12编写KEA的LIN例程

文章目录

  • 基于S32DS+LIN_Stack_S12编写KEA的LIN例程
    • 1.KEA基于S32DS的驱动和例程获取
    • 2.LIN Stack移植
      • 2.1添加文件以及目录
      • 2.2协议栈文件修改适配S32DS
    • 3.用户程序编写
      • 3.1准备工作
        • 3.1.1硬件平台
        • 3.1.2功能需求
      • 3.2 S32K144(主机)+KEA128(从机)
        • 3.2.1 S32K144的LIN Mater例程导入
        • 3.2.2 S32K144的LIN Mater例程解读
        • 3.2.3 KEA128的LIN slave程序编写
      • 3.3 KEA128(主机)+S32K144(从机)
        • 3.3.1 S32K144的LIN slave程序解读
        • 3.3.2 KEA128的LIN Master程序编写
        • 3.3.3 LIN_stack_S12_4_6_6的bug说明
    • 4.测试验证
      • 4.1 S32K144(主机)+KEA128(从机)
      • 4.2 KEA128(主机)+S32K144(从机)
    • 5.程序分享

1.KEA基于S32DS的驱动和例程获取

NXP的大部分芯片资料都是可以在官网找到的,包含芯片文档(数据手册,参考手册,应用笔记等)以及软硬件资料。下面以KEA系列为例,进行一个简单的介绍。

  1. 首先在NXP官网的搜索栏输入KEA,按下回车键,一般第一个就是KEA产品的链接,如下图所示:

  2. 进入产品链接之后,会发现产品界面分六个菜单栏,如下图所示:

  3. 一般开发人员只需要关注前面3个菜单栏即可:

  • OVERVIEW(概述)栏:简单描述该芯片的类别以及功能特性,适合快速寻找自己需要的芯片时使用;
  • DOCUMENTION(文档)栏:主要存放芯片的文档资料,包含参考手册,数据手册,应用笔记,勘误手册等,适合详细评估芯片时使用;
  • TOOLS & SOFTWARE(工具和软件)栏:主要存放评估板链接,IDE链接,软件驱动,配套工具,调试器链接等,适合软硬件开发时使用;
  1. 我们选择 TOOLS & SOFTWARE栏的KEA Freedom Evaluation Board链接,并点击进入:

  2. 进入开发板链接之后,往下拉到Design Resources界面,如下图所示;分为三部分,1是文档,2是demo板硬件资料,3是demo板配套的软件。

  3. 如下图所示,如果使用S32DS开发KEA系列芯片,大部分功能参考 《FRDM-KEAZ Freedom Evaluation Board – QSP》 里面包含的软件即可,同时这个界面也包含了上一篇文章提到的LIN_Stack_S12的下载链接。本文这两个链接所包含的软件都需要用到。

Tips:

  1. 资料后面有锁的资料需要注册然后登陆自己的NXP账号才能下载;
  2. 同时nxp有些涉及保密或者非常新的芯片资料在NXP官网是下载不了的,需要和nxp签订NDA协议才能在DocStore网站下载资料。

2.LIN Stack移植

解压FRDM-KEA-QSP.zip包含的所有压缩包,将…\FRDM-KEA-QSP\Code Project Examples and Sample Drivers (Evaluation Grade Only)\FRDM-KEAZ128\Driver Test SW for KEAZ128目录下的FRDM_KEA128_LIN_Master_PROD工程拷贝到S32DS for ARM 2.2的工作空间(workspace),方便接下来的使用。

2.1添加文件以及目录

  1. 在S32DS中导入FRDM_KEA128_LIN_Master_PROD工程,如下图所示:

由于官方提供的LIN例程不带LDF文件,同时也不清楚使用的LIN_Stack版本,所以必须得换成有配套NCF Tools的LIN Stcak。这样应对不同车厂的需求时,只需使用NCF Tools导入车厂提供的LDF文件,同时配置下NPF文件,即可生成所需的配置文件。
2. 因为lin_cfg文件夹存放的是和LDF文件有关的配置,LIN_Driver文件夹存放KEA系列需要用到的协议栈,如下图所示。这两个文件夹包含的文件都删除即可。

  1. 将工程重新命名,点击菜单栏中的File,然后点击Rename(如下图所示),输入新的工程名lin_master_kea128,点击OK即可。

  2. 打开LIN_Stack的安装目录,将…\LIN_stack_S12_4_6_6\LIN_Stack目录下的所有文件复制到lin_master_kea128工程下的\include\LIN_Driver文件夹,将bsp文件中的无关文件夹删除,只保留AUTOBAUD和UART两个文件夹,如下图所示:

吐槽一下:关于官网KEA例程使用的LIN Stack版本,我向NXP的Support系统提交过相关Case,但是没有得到准确回复,只是推荐我使用CodeWarrior开发KEA系列单片机。。。。。。

2.2协议栈文件修改适配S32DS

由于协议栈的驱动是基于CodeWarrior开发的,如果想在S32DS使用,有几个地方需要修改下:

  1. AUTOBAUD文件夹中的lin_lld_autobaud.c文件,需要修改下定时器FTM0的中断使能方式,如下图所示:

  2. UART文件夹中的lin_isr.c文件,因为接下来需要使用UART1实现LIN的功能,需要将UART1的中断处理函数名称修改下,和启动文件保持一致,如下图所示:

  1. UART文件夹中的lin_lld_timesrv.c文件,需要修改下定时器FTM1的中断使能方式,如下图所示:

特别提醒:如果未使能自适应波特率的功能,LIN Stack是不会开启定时器FTM0的,此时就可以在其他地方使用FTM0了,如计算时基。

3.用户程序编写

3.1准备工作

3.1.1硬件平台

由于手上只有一个KEA128的评估板,为了能够实现主机和从机通信的功能演示,有增加了一块S32K144的评估板进行演示。
准备设备如下:

  • 12V电源
  • FRDM-KEAZ128Q80
  • S32K144EVB-Q100
  • 示波器ZDS1104
  • 一台个人电脑
  • 一根MicroUSB线

引脚功能如下表:

引脚功能 S32K144EVB-Q100 FRDM-KEAZ128Q80
SW2 PTC12 PTE4
SW3 PTC13 PTE5
RGB_RED PTD15 PTH0
RGB_GREEN PTD16 PTH1
RGB_BLUE PTD0 PTE7
VBATT J11-2 J11-2
LIN J11-1 J11-1
GND J11-4 J11-4
LIN_TX LPUART2_TX(PTD7) UART1_TX(PTF3)
LIN_RX LPUART2_RX(PTD6) UART1_RX(PTF2)

3.1.2功能需求

这次例程主要演示主节点SeatECU和从节点Motor1之间使用无条件帧进行通信:

  • 主节点SeatECU处于NormalTable调度表,以50ms的周期循环发送Motor1State_Cycl和Motor1Selection两个无条件帧,前者用于获取从节点Motor1的Motor1Temp信号,后者用于通知从节点Motor1 Motor1Selection信号值。开始运行时先亮绿灯,5s后绿灯和蓝灯交替闪烁。

对于主节点而言:

  • 如果主节点获取的Motor1Temp信号值大于规定的过温值,主节点会将Motor1Selection信号值设为STOP command并传递给从节点Motor1;此时点亮红灯。
  • 如果Motor1Temp信号值介于规定的最大值和过温值之间,Motor1Selection值会设为DECREASE MOTOR SPEED command;此时点亮蓝灯。
  • 如果Motor1Temp信号值低于规定的最大值,Motor1Selection值会设为INCREASE MOTOR SPEED command;此时点亮绿灯。
  • 按下SW2,主节点会切换到goto_sleep调度表,发送休眠命令后,主节点和从节点进入休眠;板上的RGB灯关闭。
  • 按下SW3,主节点会发送唤醒信号至LIN总线,从而唤醒其他节点。然后切换至NormalTable调度表。

对于从节点Motor1而言:

  • 按下SW2,Motor1Temp信号值会增加;
  • 按下SW3,Motor1Temp信号值会修改为一个定值,此值低于规定的最大值;此时点亮绿灯。

3.2 S32K144(主机)+KEA128(从机)

柿子先挑软的捏,从机程序相对主机程序会简单许多,这里首先进行KEA128从机程序的编写。不过,在编写KEA128的从机程序之前,需要准备好S32K144的主机程序,方便从机程序的调试。

3.2.1 S32K144的LIN Mater例程导入

  1. 在S32DS导入自带的S32K144的LIN Master例程,选择SDK版本为RTM v3.0.0的,如下图:

  2. 点击Generate Code生成相应的配置文件,如下图:

3.最后编译工程,生成所需的elf文件,如下图:

3.2.2 S32K144的LIN Mater例程解读

由于该例程是配合S32K144的LIN Stack进行使用的,新手理解不是很顺畅,笔者针对一些重要的部分详细介绍下:

  • 定时器LPTMR中断函数void LPTMR_ISR(void),具体实现如下:
  1. LPTMR设置的为500us进入一次中断,这个时间需要和lin_cfg配置组件的timeout unit设置保持一致,如下图所示:

  2. lin_lld_timeout_service(LI0)函数需要在每次进入中断都调用一次,主要检测帧数据收发时是否发生超时,以及检测LIN总线静默时间是否达到Idle timeout(图形化界面配置为5s),从而决定是否进入sleep mode。具体的功能介绍如下图:

  3. l_sch_tick(LI0)函数在每个时基(time base在此LDF文件设置为5ms)节拍处调用一次,起调度功能。详细介绍如下图:

  • 串口回调函数uint32_t timerGetTimeIntervalCallback0(uint32_t *ns) ,具体实现如下。该函数主要计算相邻两次调用该函数的时间间隔,一般用于检查唤醒型号和实现自动波特率时调用。

  • 其他函数的注释比较齐全,如果有些和LIN协议栈相关的函数不是很清楚功能,可以按下图方式,打开LIN协议栈的说明文档,在搜索栏输入函数即可查询。

3.2.3 KEA128的LIN slave程序编写

  1. 将2.2章节移植好LIN Stack的例程在S32DS2.2的工作区间压缩保存一份,然后将工程名改为lin_slave_kea128,方便区分主从机工程。

  2. 新建一个名为KEA128_Slave的npf文件,加载S32K144例程里的LIN21.ldf,其他配置如下图,并将生成的文件放入之前保留的lin_cfg文件夹。

  3. 由于KEA的LIN Stack在lin_isr.c文件已经用定时器FTM1实现了超时检测的功能,如下图,所以在用户程序中不需要再去实现。

  4. 从机程序不需要再开启一个定时器去调用l_sch_tick()函数,因为调度表只由主机发起。

  5. 按键配置以及SBC初始化等其他程序这里就不赘述,文章末尾会将例程分享出来。

3.3 KEA128(主机)+S32K144(从机)

接下来进行KEA128的主机程序编写,同样的,需要先准备好S32K144的从机程序。

3.3.1 S32K144的LIN slave程序解读

导入和3.2.1章节相配套的从机程序,并完成编译。和主函数的不同地方简单说明下:

  • 定时器中断函数void LPTMR_ISR(void),只需要调用超时函数lin_lld_timeout_service(LI0)即可,I_sch_tick(LI0)不需要使用。
  • 多了一个接收引脚中断函数void RXPIN_IRQHandler(void),具体实现如下图。如果使能了自动波特率功能,需要增加该函数,其中调用的自动波特率捕获函数LIN_DRV_AutoBaudCapture(INST_LIN1)会调用之前提到的timerGetTimeIntervalCallback0()用于bit时间计算

3.3.2 KEA128的LIN Master程序编写

  1. 解压并导入之前保存在S32DS2.2的工作区间的lin_master_kea128。

  2. 新建一个名为KEA128_Master的npf文件,加载S32K144例程里的LIN21.ldf,其他配置如下图,并将生成的文件放入之前保留的lin_cfg文件夹。

  3. 修改lin_cfg.c中结构体数组lin_frame_tbl[LIN_NUM_OF_FRMS]中的成员顺序如下图,详细原因请看3.3.3章节。

  4. 初始化定时器FTM0,并配置2.5ms进一次中断,记时达到一个时基调用l_sch_tick()函数。
    5.其他配置这里就不赘述,文章末尾会将例程分享出来。

3.3.3 LIN_stack_S12_4_6_6的bug说明

4.6.6版本的LIN Stack在使用了零星帧之后会有一个bug,导致调用l_ifc_goto_sleep(LI0)时,主机不会发送休眠命令(0x3C),只会停止数据发送,总线静默5s之后切换到休眠模式。

  1. 解决不发送休眠命令的方式有两种,
  • 一种是将LDF文件的零星帧相关的配置删除;

  • 第二种是修改lin_cfg.c中的结构体数组lin_frame_tbl[LIN_NUM_OF_FRMS]的成员顺序,使其和数组LI0_lin_configuration_RAM[],LI0_lin_configuration_ROM[]的元素顺序以及lin_cfg.h中枚举类型l_frame_handle中的成员顺序保持一致。

  1. 正常情况下,发送休眠命令之后,LIN主机应该立刻切换到睡眠模式,但是按上述方式修改之后,还是需要等5s才会进入休眠模式,个人感觉这个应该是LIN Stack底层的驱动bug导致,同时已将该问题反馈给NXP,后续收到NXP的反馈会在文章中更新。

4.测试验证

两套程序编写完成之后需要测试验证一下,下面是测试的数据。

4.1 S32K144(主机)+KEA128(从机)

S32K144做主机,KEA128做从机的测试波形如下:
正常运行:

休眠:

唤醒:

4.2 KEA128(主机)+S32K144(从机)

KEA128做主机,S32K144做从机的测试波形同上,这里就不展示了。
但是按下KEA128的SW2进行休眠时,KEA128板子的灯需要等5s才会熄灭,原因在3.3.3章节已经描述。

5.程序分享

KEA128的主从机例程已经放到码云上了,链接如下:
KEA128_S32DS_LIN_Example

如何使用S32DS开发KEA系列的LIN功能(二)相关推荐

  1. RIoTBoard开发板系列笔记(十二)—— gstreamer + vpu实现视频硬件解码播放

    i.mx6 solo芯片中包含一个VPU (video processing unit),可以进行视频硬件编解码加速,之前RIoTBoard开发板系列笔记(四)-- 使用VPU硬件解码文章简单的记录了 ...

  2. Winform开发框架之客户关系管理系统(CRM)的开发总结系列2-基于框架的开发过程...

    在上篇随笔<Winform开发框架之客户关系管理系统(CRM)的开发总结系列1-界面功能展示>中介绍了我的整个CRM系统的概貌,本篇继续本系列的文章,介绍如何基于我的<winform ...

  3. 简介NXP的车规级MCU之KEA系列

    概述 Kinetis® EA系列32位Arm® Cortex®MCU广泛适用于质量要求和长期供货保证要求都很高的汽车和工业应用.Kinetis EA系列是广泛的Arm生态合作体系的入门级产品,并具有以 ...

  4. MSDN webcast《Silverlight for Windows Phone开发》系列视频第二季

    课程简介 作为第一季度的延续,这一季度讲述一些Windows Phone中文社区讨论相对较少的进阶话题,例如应用程序的生命周期,启动器与选择器,推送通知服务,Panorama与Pivot控件,地理位置 ...

  5. 【直播回顾】云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第19讲):Java Spring Cloud微服务架构模式与开发实战...

    主讲人:徐雷(云栖社区特邀Java专家) 徐雷,花名:徐雷frank:资深架构师,MongoDB中文社区联席主席,吉林大学计算机学士,上海交通大学硕士.从事了 10年+开发工作,专注于分布式架构,Ja ...

  6. 【Xamarin开发 Android 系列 5】 Xamarin 的破解

    [Xamarin开发 Android 系列 5] Xamarin 的破解 原文:[Xamarin开发 Android 系列 5] Xamarin 的破解 有关这个话题,十分敏感,公司开发还是支持下商业 ...

  7. iOS开发UINavigation系列四——导航控制器UINavigationController

    iOS开发UINavigation系列四--导航控制器UINavigationController 一.引言 在前面的博客中,我么你介绍了UINavigationBar,UINavigationIte ...

  8. Web开发兼容性系列文章(一):不同设备浏览器的userAgent值大全

    Web开发兼容性系列文章(一):不同设备浏览器的userAgent值大全 Posted on 2011-07-22 12:37 随它去吧 阅读(1388) 评论(11) 编辑 收藏 http://ww ...

  9. phoenix 开发API系列 目录

    phoenix 开发API系列(一)创建简单的http api phoenix 开发API系列(二)phoenix 各类 api 实现方式 phoenix 开发API系列(三)phoenix api ...

最新文章

  1. SpringBatch 写文件JSON(JsonFileItemWriter)用法(十二)
  2. ad中电容用什么封装_图文并茂用最通俗易懂的对话为你讲解电子技术知识- C什么是电容?...
  3. 自适应数字墙星系网站404页面源码
  4. control的用法及短语_九上U5(control)微课详解与精练
  5. 本地跨域处理ajax,Node.js配合node-http-proxy解决本地开发ajax跨域问题
  6. 大数据_Flink_数据处理_流处理API_Transform(2)_滚动聚合算子_keyBy_sum_min_max_minBy_maxBy---Flink工作笔记0030
  7. H3C 典型数据链路层标准
  8. 【Oracle】ORA-27369: job of type EXECUTABLE failed with exit code: Key has expired
  9. HashPasswordForStoringInConfigFile 已过时
  10. Cleanmymac X最新版 Macbook“垃圾”清理软件
  11. C#基础知识(收藏)
  12. 玉龙雪山还会存在多久
  13. 线性代数中矩阵相乘如何计算
  14. 资料:线性代数与空间解析几何知识点全汇总
  15. 【BZOJ4198】【NOI2015】荷马史诗(贪心,Huffman树)
  16. Actors 基于消息驱动的异步编程模型
  17. 2021-11-12:前 K 个高频元素。给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。提示:1 <= nums.length <=
  18. 实现类似微信聊天功能的mysql表设计
  19. pi/4dqpsk的matlab及FPGA仿真
  20. php seekdir,C++_详解C语言中telldir()函数和seekdir()函数的用法,C语言telldir()函数:取得目录流 - phpStudy...

热门文章

  1. linux系统打补丁
  2. 临床试验中edc录入_使用电子数据采集(EDC)系统进行医疗器械临床试验研究
  3. 英二变英一,数二变数一!考研人太难了……
  4. 获取腾讯视频真实地址php源码,腾讯视频的地址解析下载
  5. 【三角】【棱形】【等等】
  6. windows rid劫持
  7. PMO如何赋能与支撑战略项目管理︱亚马逊PMO负责人宋晓雪
  8. Z-BLOG 懒人一键采集插件,自动采集+发布+推送
  9. php 定时采集数据,懒人一键采集(采集+推送+定时)
  10. 网络安全之暴露面、攻击面、脆弱性