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

6 篇文章 10 订阅
4 篇文章 9 订阅

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

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

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

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

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

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

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

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

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

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工程,如下图所示:
    5

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

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

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

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

2.2协议栈文件修改适配S32DS

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

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

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

11

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

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

3.用户程序编写

3.1准备工作

3.1.1硬件平台

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

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

引脚功能如下表:

引脚功能S32K144EVB-Q100FRDM-KEAZ128Q80
SW2PTC12PTE4
SW3PTC13PTE5
RGB_REDPTD15PTH0
RGB_GREENPTD16PTH1
RGB_BLUEPTD0PTE7
VBATTJ11-2J11-2
LINJ11-1J11-1
GNDJ11-4J11-4
LIN_TXLPUART2_TX(PTD7)UART1_TX(PTF3)
LIN_RXLPUART2_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的,如下图:
    13

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

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

3.2.2 S32K144的LIN Mater例程解读

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

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

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

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

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

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

22

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文件夹。
    23

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

  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时间计算
    25
3.3.2 KEA128的LIN Master程序编写
  1. 解压并导入之前保存在S32DS2.2的工作区间的lin_master_kea128。

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

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

  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文件的零星帧相关的配置删除;
    28

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

  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

  • 2
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Auto FAE进阶之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值