LINSlave

目的

本文档旨在通过一个LIN通信的示例工程的配置,向用户展示通信栈的集成过程。

由于各项目的需求不同,集成示例不会针对于特定的商业项目做详细讲解。

缩写词和术语

表 缩写词和术语

缩写词/术语

描述

BSW

Basic Software 基础软件

BswM

Basic Software Mode Manager 基础软件模式管理

MCAL

Microcontroller Abstraction Layer 微控制器抽象层

LinIF

LIN Interface LIN接口

LinSM

LIN State Manager LIN状态管理

ComM

Communication Manager 通信管理

EcuM

ECU State Manager ECU状态管理

SchM

Scheduler Manager 调度管理

参考文档

[1]参考手册_PduR.pdf

[2]参考手册_Com.pdf

[3]参考手册_EcuC.pdf

[4]参考手册_ComM.pdf

[5]参考手册_LinSM.pdf

[6]参考手册_LinIf.pdf

协议栈集成

项目交付的内容为:通信栈源码和ORIENTAIS Studio配置工具。通信栈细分为通信栈的各模块及其对应的配置工具模块。

通信栈各配置模块的功能介绍,参见表 通信栈各配置模块介绍。

使用通信栈源码和配置工具,进行通信栈的集成的步骤,参见表 通信栈集成的步骤。

表 模块功能介绍

模块名

功能

Lin

Lin驱动配置。(由MCAL工具导入)

LinIf

LinIf模块主要处理上层模块与底层驱动的之间PDU的传递,为上层模块提供统一的接口来管理不同的Lin硬件模块

EcuC

用于辅助配置工具完成配置的模块。主要提供Pdu的定义,其它模块通过关联EcuC中Pdu,相互关联起来。

PduR

PDU Router主要为通讯接口模块(LINIF)、传输协议模块(LIN TP、J1939 TP)、诊断通讯管理模块(DCM、J1939DCM)以及通讯模块(COM、LDCOM)以及IPDUM、SECOC等模块提供基于I-PDU的路由服务。

Com

COM模块主要提供I-PDU和信号相关管理功能

ComM

ComM模块主要进行通信的管理功能。ComM模块收集用户的总线访问请求,并把请求转发到不同的总线。

LinSM

主要功能是与通信硬件抽象层和系统服务层产生交互,为每一个Lin通信总线定义一个总线相关的状态管理,并为相关的总线提供流控制。

表 集成步骤介绍

步骤

操作

说明

1

ORIENTAIS Stuido配置工具工程搭建和通信栈模块加载

若配置工具已经搭建,则仅需进行通信栈模块的加载操作。

2

模块配置及配置文件生成

NA

3

代码集成

现有工程、通信栈源代码和配置生成文件的集成。

4

验证测试

NA

Note

通信栈集成之前,用户须确保已经有基础工程,且本通信栈相关的其他通信栈能正常工作。

新建ORIENTAIS工程

  1. 安装软件后,双击软件图标打开软件

    image1

    图 新建工程-1

  2. 菜单栏File🡪New🡪Project,新建工程

    image2

    图 新建工程-2

  3. 在弹出的新建窗口中选择Autosar下的 [BSW Project],选择Next

    image3

    图 新建工程-3

  4. 在弹出的窗口中输入工程名,选择Finish

    image4

    图 新建工程-4

  5. 在弹出的窗口中选择Yes。

    image5

    图 新建工程-5

  6. 在工程的[Bsw_Builder]项目上右键,选择New ECU Configuration。

    image6

    图 新建工程-6

  7. 在弹出的窗口中输入一个ECU名,然后选择Next

    image7

    图 新建工程-7

  8. 在弹出的窗口中勾选需要添加的模块,点击Finish。

    image8

    图 新建工程-8

  9. 新建完成的工程如下所示,步骤7中添加的模块已经被加入到工程中。

    image9

    图 新建工程-9

模块配置及代码生成

模块配置

模块的配置,取决于具体的项目需求。通信栈各模块配置项的详细介绍,参见表相关文档

表 模块参考文档

模块

参考文档及其章节

说明

LIN

MCAL对应的LIN配置手册

LinIf

集成手册_LinIf.pdf 章节5

PduR

集成手册_PduR.pdf 章节5

Com

集成手册_Com.pdf 章节5

LinSM

集成手册_LinSM.pdf 章节5

EcuC

集成手册_EcuC.pdf 章节5

ComM

集成手册_ComM.pdf 章节5

配置代码生成

  1. 在工程上右键会弹出校验整个工程和生成整个工程所有模块配置文件的菜单。

  2. 首先选择Validate All,没有错误提示信息即校验通过。

    image10

    图 配置校验

  3. 然后选择Generate All,弹出的提示选择Skip,生成配置文件。右下角的输出框中会输出生成的配置文件信息。

    image11image12

    图 配置生成信息

  4. 在工程Config文件夹下即可查看生成的配置文件。

    image13

    图 Config代码生成

功能集成

代码集成

通信栈代码包括两部分:项目提供的通信栈源码和ORIENTAIS Studio配置生成代码。通信栈集成包括通信栈源码(LIN、LinIf、PduR、ComM、LinSM等)、定时器源码和部分其他模块源码,具体文件见表。

用户须将通信栈源码和章节(配置代码生成)生成的源代码添加到集成开发工具的对应文件夹。通信栈集成的文件结构,参见章节(代码工程介绍)。

表 通信栈源码文件

移库文件夹

移库文件

说明

ComM

ComM.c、ComM.h、ComM_BusSM.h、ComM_Com.h、ComM_Dcm.h、ComM_Internal.c、ComM_EcuMBswM.h、ComM_Internal.h、ComM_MemMap.h、ComM_Nm.h

通信栈源码

LinIf

LinIf.c、LinIf.h、LinIf_Cbk.h、LinIf_Internal.h、LinIf_Slave.c、LinIf_Slave.h、LinIf_MemMap.h、LinIf_Types.h、LinTp.c、LinTp.h、LinTp_Internal.c、LinTp_Internal.h、LinTp_Slave.c、LinTp_Slave.h、LinTp_Types.h、SchM_LinIf.h

LinSM

LinSM.c、LinSM.h、LinSM_Cbk.h、LinSM_MemMap.h、

PDUR

PduR_LinIf.h、PduR_Com.h、PduR_Internal.c、PduR_Internal.h、PduR_MemMap.h、PduR_Types.h、PduR.c、PduR.h

Com

Com.c、Com.h、Com_Cbk.h、Com_GwInternal.c、Com_Internal.c、Com_Internal.h、Com_MemMap.h、Com_RxInternal.c、Com_TxInternal.c、Com_Types.h

FreeRTimer

FreeRTimer.c、FreeRTimer.h

定时器源码

SchM

SchM.c、SchM.h、SchM_Com.h、SchM_ComM.h、SchM_LinIf.h、SchM_PduR.h、

SchM部分源码

BswM

BswM.c、BswM.h、BswM_LinSM.h、BswM_ComM.h、

BswM部分源码

EcuM

EcuM_Types.h、EcuM.h、

EcuM部分源码

Note

通信栈集成之前,用户须确保已经有基础工程,且本通信栈相关的其他通信栈能正常工作。

集成注意事项

对于集成过程中,通信栈特殊要求和用户经常出现的问题,归类总结形成表 通信栈集成约束清单。用户需逐一排查表中的约束项,以避免集成问题出现。

表 集成约束清单

编号

类别

约束限制

1

中断

通信栈有中断、轮询或混合三种工作模式。若选取中断或混合模式,用户需在通信栈配置对应的中断并填充中断服务API。

2

堆栈

用户需确保为任务堆栈和中断堆栈分配足够的堆栈空间。

3

头文件

  • 添加通信栈代码之后,用户需更新集成开发工具中的头文件路径。

  • 调用通信栈API的源文件,需要包含通信栈的头文件。

4

初始化

以LIN通信为例,通信栈的初始化顺序为:Lin_Init、LinIf_Init、 PduR_Init、Com_Init、LinSM_Init。

5

周期函数

Com_MainFunctionRx、Com_MainFunctionTx、LinIf_MainFunction、LinSM_MainFunction需要被周期性任务函数调用。

集成示例

集成目标

集成后的工程为主节点LIN,集成完成后的工程可以进行一个无条件帧发送和一个无条件帧接收。

通信报文配置如表:

表 通信报文配置

帧名称

帧类型

ID

Tx\Rx

关联帧

LinIfFrame_Tx1

无条件帧

0x0

Tx

LinIfFrame_Rx1

无条件帧

0x1

Rx

模块配置

EcuC模块配置

  1. 双击EcuC模块,打开EcuC模块配置界面。

    image14

    图 EcuC配置-1

  2. 在EcucConfigSets栏目上右键,选择EcucConfigSet。再在EcucConfigSet上右键,选择New🡪EcucPduCollection。

    image15

    图 EcuC配置-2

    • PduIdTypeEnum 选择UINT16.

    • PduLengthTypeEnum 选择UINT16。

  3. 在EcucPduCollection上右键,选择Pdu,会生成一个Pdu的配置界面。

    image16

    图 EcuC配置-3

    这里按照发送和接收,将Pdu名字改为报文的名字。

    PduLength:Pdu长度,根据实际使用帧的长度设置。

  4. 根据步骤3的描述,配置其余报文的Pdu。

    image17

    图 EcuC配置-4

  5. 报文需要PDUR路由,每个方向需要配置2个Pdu。

  6. ECUC模块到此配置结束。在模块上右键,然后选择校验,查看是否配置有错误。

Lin模块配置

如果Lin驱动使用的是MCAL配置,那么将MCAL生成的arxml配置文件导入到BSW工具选择对应的Lin模块即可。

image18

图 EcuC配置-5

LinIf模块配置

  1. 双击LinIf模块,打开LinIf模块的配置界面。

    image19

    图 LinIf配置-1

  2. LinIfGeneral标签页保持默认值即可。

  3. 在LinIfGlobalConfig标签页下依次打开LinIfGlobalConfigs ->LinIfGlobalConfig ,右键新建LinIfChannel_0进行如下配置。

    image20

    图 LinIf配置-2

    LinIfChannel_0配置参数说明:

    表 LinIfChannel_0配置参数说明

    参数名

    设置值

    说明

    LinIfMainFunctionPeriod

    0.005

    LinIf Main函数的调度周期

    LinIfSleepModeFrameDelay

    4

    节点进入睡眠模式后,再次发送帧(frame)之前需要等待的最小时间延迟

    LinIfBusIdleTimeoutPeriod

    4

    总线空闲时间

    LinIfGotoSleepConfirmationUL

    LINSM

    Go-to-sleep命令的确认通知,通知的上层模块

    LinIfGotoSleepIndicationUL

    LINSM

    Go-to-sleep命令收到的通知,通知的上层模块

    LinIfScheduleRequestConfirmationUL

    LINSM

    调度表切换成功执行后的通知函数,通知的上层模块

    LinIfStartupState

    NORMAL

    Lin通道在启动后所处的状态

    LinIfWakeupConfirmationUL

    LINSM

    Wakeup通知函数,通知的上层模块

    LinIfChannelRef

    LinChannel_0

    LinIf的通道对应的Lin驱动的通道

    LinIfComMNetworkHandleRef

    ComMChannel_0

    LinIf的通道对应的ComM的通道

  4. 然后右击LinIfChannel_0新建LinIfFrame对象。

    image21

    图 LinIf配置-3

  5. 按照步骤创建2个对象,根据章节(集成目标)修改名字,并将LinIfFrameId设置为对应值。

    image22

    图 LinIf配置-4

    下面对不同名称的帧各举一例说明配置参数。

    LinIfFrame_Tx1报文LinFrame配置说明:

    表 LinIfFrame_Tx1报文LinFrame配置说明

    参数名

    设置值

    说明

    LinIfChecksumType

    ENHANCED

    报文使用的checksum类型(此处使用增强型校验)

    LinIfFrameType

    UNCONDITIONAL

    报文帧的类型(此处设置为无条件帧)

    LinIfFrameId

    0x0

    报文ID

    LinIfFrame_Rx1报文LinFrame配置说明:

    表 LinIfFrame_Rx1报文LinFrame配置说明

    参数名

    设置值

    说明

    LinIfChecksumType

    ENHANCED

    报文使用的checksum类型(此处使用增强型校验)

    LinIfFrameType

    UNCONDITIONAL

    报文帧的类型(此处设置为无条件帧)

    LinIfFrameId

    0x1

    报文ID

  6. 展开LinIfFrame_Tx1子配置页面,右键新建一个LinPduDirection对象,如果的LinIfFrame为Tx类型,则选择LinTxPdu,如果前面的LinIfFrame为Rx类型,则选择LinRxPdu。

    image23

    图 LinIf配置-5

  7. 点击新建的LinTxPdu然后选择右边LinIfTxPduRef对象,要求和LinIfFrame名称对应,如LinIfFrame_Tx1对应LinIfFrame_Tx1。

    image24

    图 LinIf配置-6

    以LinIfFrame_Tx1为例配置LinTxPdu配置参数:

    表 LinIfFrame_Tx1报文LinTxPdu配置说明

    参数名

    设置值

    说明

    LinIfUserTxUL

    PDUR

    用于确定触发LinTxPdu发送的上层模块,并在发送成功后通知该模块。

    LinIfTxPduRef

    LinIfFrame_Tx1

    指向一个ECUC中定义的PDU,将LinIfTxPdu和Pdu关联起来

  8. 按照上面的步骤完成剩下LinIfFrame的配置。

    表 其他报文LinIfFrame配置说明

    报文名

    LinIfTxPdu\LinIfRxPdu

    LinIfFrame_Tx1

    LinIfTxPdu

    LinIfFrame_Rx1

    LinIfRxPdu

  9. 选择Lin节点模式,当前配置为从机。

    image25

    图 LinIf配置-7

  10. 选择当前使用的Lin协议版本。

    image26

    图 LinIf配置-8

  11. 新建一个Lin从节点的配置。

    image27

    图 LinIf配置-9

    LinSlave参数配置说明

    表 LinSlave配置

    参数名

    设置值

    说明

    LinIfConfiguredNAD

    4

    从节点配置的NAD

    LinIfFunctionId

    0

    Function Id

    LinIfInitialNAD

    4

    从节点初始化的NAD

    LinIfNasTimeout

    1.0

    N_As超时时间,单位为秒。

    LinIfSupplierId

    5

    Supplier Id

    LinIfVariantID

    0

    Variant Id

  12. 校验配置,无错误信息,即配置完成。

Com模块配置

  1. 双击Com模块,打开Com模块的配置界面。

    image28

    图 Com配置-1

  2. ComGeneral标签页里面只需要配置ComSupportedIPduGroups参数,其余参数保持默认即可。ComSupportedIPduGroups是指IPduGroup的个数。IPduGroups会在ComConfig标签页中配置。后面的配置中将会配置2个IPduGroup,所以将这个参数配置为2。

    image29

    图 Com配置-2

  3. ComConfig下的两个参数不需要配置,保持默认即可。

    image30

    图 Com配置-3

  4. ComGwMapping为信号路由的配置,本次示例不需要信号路由,不需要创建对应对象。

  5. 新建2个ComIPdu对象,并修改名字。

    根据前文中定义的报文,创建2个ComIPdu对象。由于ComIPdu属性配置需要关联其他的对象,ComIPdu的属性先暂时不配置,待添加了其它对象后再配置ComIPdu属性。(参照步骤)

    image31

    图 Com配置-4

  6. 配置ComIPduGroup。

    将IPdu加入IPduGroup可以方便的控制IPdu的状态,根据需要使能和禁止IPdu的收发。

    添加两个ComIPduGroup对象,一个用于管理发送报文,一个用于管理接收报文,参数保持默认即可。

    image32

    图 Com配置-5

  7. 配置ComSignal。

    image33

    图 Com配置-6

    ComSignal对象属性的配置(以信号ComSignal_Tx1为例):

表 ComSignal属性配置说明

参数名

设置值

说明

ComBitPosition

0

根据实际使用帧的Startbit参数填写

ComBitSize

64

根据实际使用帧的Length参数填写

ComSignalEndianness

LITTLE_ENDIAN

Motorola格式设为BIG_ENDIAN

Intel格式设置为LITTLE_ENDIAN

ComSignalInitValue

0x00

根据实际使用帧的Initial Value参数填写

ComSignalType

UINT64

根据实际使用帧的Length参数填写

ComRxDataTimeoutAction

NONE

当信号属于发送报文时,设置为NONE当信号属于接收报文时,配置为NONE,超时后不做处理,配置为REPLACE,超时后用初始化值代替接收值,配置为SUBSTITUTE,超时后使用ComTimeoutSubstitutionValue值替换

ComInitialValueOnly

False

设置为True后,初始化后不会再更新这个信号的值

ComTransferProperty

PENDING

根据DBC中GenSigSendType参数设置:

Cycle 对应 PENDING

OnWrite 对应 TRIGGER

OnChange 对TRIGGER_ON_CHANGE

  1. 配置TX与RX 的周期处理函数的周期(根据实际需要填写)

    image34

    图 Com配置-7

  2. 配置ComIPdu属性。以ComIPdu_Com_Lin_Tx1为例说明:

表 ComIPdu属性配置说明

参数名

设置值

说明

ComIPduDirection

SEND

报文为发送报文

ComIPduSignalProcessing

DEFERRED

在周期函数中处理信号

ComIPduType

NORMAL

正常报文(非TP报文)

ComIPduGroupRef

Com_TxPduGroup_LinController_0

属于Com_TxPduGroup_LinController_0

ComIPduSignalGroupRef

没有信号组,不需要配置

ComIPduSignalRef

ComSignal_Tx1

将属于ComIPdu_Com_Lin_Tx1的信号关联进来

ComPduIdRef

Com_LinIfFrame_Tx1

指向EcuC中定义的Pdu

image35

图 Com配置-8

image36

图 Com配置-9

  1. 为发送报文配置ComTxIPdu,每个发送IPdu,必须要配置一个ComTxIPdu,参数保持默认值即可。只发送报文需要配置。

image37

图 Com配置-10

  1. 添加ComTxModeTrue对象,并将ComTxModeMode配置为None。

image38

图 Com配置-11

  1. 校验配置,无错误信息,Com模块即配置完成。

PduR模块配置

  1. 双击PduR模块,打开PduR模块配置界面。

    image39

    图 PduR配置-1

  2. PduRGeneral配置。

保持默认即可。

  1. PduRBswModuler配置。

    PduR模块的目的是实现上层模块到下层模块的路由。PduRBswModuler对象用来描述上层模块和下层模块属性。本示例中上层模块为Com,下层模块为LinIf,PduR模块将Com中的Pdu路由到LinIf中。所以需要新建2个PduRBswModuler对象,分别对应Com和LinIf。

    image40

    图 PduR配置-2

    image41

    图 PduR配置-3

  2. PduRRoutingPaths配置。

    该容器有4个配置选项,保持默认即可。

    image42

    图 PduR配置-4

  3. 添加PduRDestPdus与PduRSrcPdus。

    Pdu的接收或发送有源头也有目的地。发送报文,是从Com到LinIf,所以SrcPdu选择Com模块中关联的Pdu,DestPdu选择LinIf中关联的Pdu。

    image43

    图 PduR配置-5

    image44

    图 PduR配置-6

    接收报文,是从LinIf到Com的,所以SrcPdu选择LinIf模块中关联的Pdu,DestPdu选择Com中关联的Pdu

    image45

    图 PduR配置-7

    image46

    图 PduR配置-8

  4. 配置PduRRoutingPaths。

    由于有2个报文需要收发,所以需要配置2个路由路径。

    image47

    图 PduR配置-9

    image48

    图 PduR配置-10

  5. 校验配置,无错误信息,PduR模块即配置完成。

ComM模块配置

  1. 双击ComM模块,打开ComM模块配置界面。

    image49

    图 ComM配置-1

  2. ComMGeneral标签页中的参数保持默认即可。

  3. ComMConfigSet配置。

默认已经生成了一个ComMChannel对象ComMChannel_0和一个ComMUser对象ComMUser_0,修改以下几个参数,其余参数保持默认值。

image50

图 ComM配置-2

image51

图 ComM配置-3

image52

图 ComM配置-4

  1. 校验配置,无错误信息,ComM模块即配置完成。

LinSM模块配置

  1. 双击LinSM模块,打开LinSM模块配置界面。

    image53

    图 LinSM配置-1

  2. LinSMGeneral标签页内各参数保持默认值。

  3. LinSMConfigSet标签页参数说明如表。其余参数保持默认值。

表 LINSM配置参数说明

参数名

设置值

说明

ComMNetwork Handle Ref

ComMChannel_0

指向ComM配置的通道

image54

图 LinSM配置-2

  1. 校验配置,无错误信息,LinSM模块即配置完成。

代码工程介绍

项目交付给用户的工程目录结构如下:

image55

图 工程目录结构

  1. Config目录,这个目录用来存放基础软件配置工具生成的配置文件。

  2. 模块相关的静态源代码,存放在各个模块的文件夹下。

应用配置文件

  1. 将章节(模块配置及代码生成)生成的配置文件复制到Config文件夹中。

  2. 添加初始化函数和周期调用函数。

 1// 初始化Lin、LinIf、LinSM模块
 2Lin_Init(&Lin_Config);
 3LinIf_Init(NULL_PTR);
 4LinSM_Init(NULL_PTR);
 5
 6
 7// 初始化PduR模块
 8/* Initialize the Pdur module */
 9PduR_Init(&PduR_PBConfigData);
10
11
12// 初始化Com模块
13/* Initialize the Com module */
14Com_Init(&Com_PBConfigData);
15
16// 使能接收和发送IPduGroup
17Com_SetIpduGroup(ipduGroupVector, Com_RxPduGroup_LinController_0, TRUE);
18Com_SetIpduGroup(ipduGroupVector, Com_TxPduGroup_LinController_0, TRUE);
19
20Com_ReceptionDMControl(ipduGroupVector);
21Com_IpduGroupControl(ipduGroupVector, TRUE);
22
23
24// 初始化ComM模块
25/* Initialize the ComM module */
26ComM_Init(&ComM_Config);
27
28// 将配置的通道切换到FULL_COMMUNICATION
29ComM_RequestComMode(ComMUser_0, COMM_FULL_COMMUNICATION);
30ComM_CommunicationAllowed(ComMChannel_0, TRUE);
  1. 添加MainFunction函数

 1/*Task_5ms_Dcpd: Core0(CPU0),Type = BASIC, Priority = 6*/
 2TASK(Task_5ms_Dcpd)
 3{
 4    /* please insert your code here ... */
 5    // 启用lin协议栈通信
 6    ComM_MainFunction_ComMChannel_0();
 7
 8    Com_ReceiveSignal(ComSignal_Rx1, &u1_ComTest);  // LIN信号的接收
 9    Com_SendSignal(ComSignal_Tx1, &u1_ComTest);      // LIN信号的发送
10
11    if (E_OK != TerminateTask())
12    {
13        while (1) {}
14    }
15}
16
17
18/*Task_50ms_Psc: Core0(CPU0),Type = BASIC, Priority = 5*/
19TASK(Task_50ms_Psc)
20{
21    /* please insert your code here ... */
22    // 调用LinIf主函数和LinSM主函数,处理LIN协议栈周期任务
23    LinIf_MainFunction();
24    LinSM_MainFunction();
25
26    if (E_OK != TerminateTask())
27    {
28        while (1)
29        {
30            /* dead loop */
31        }
32    }
33}

验证结果

根据集成目标,第5章一共配置了2个报文帧,其中1个周期发送报文,1个周期接收报文。

  1. 根据前文的配置,这里将PLIN进行如下设置:

    image56

    图 PLIN配置

  2. 接通PLIN可以在Receive窗口看到接收和发送的报文。

    image57

    图 接收报文验证