CanTSyn

目标

本集成手册用于指导客户进行CanTSyn集成,文档主要包括的内容为:协议栈集成指导、基于普通应用的集成示例讲解。

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

缩写词和术语

表 缩写词和术语

缩写词/术语

描述

CanIf

Can Interface Can通信的接口模块

CanTSyn

TimeSyncOverCAN CAN时间同步模块

StbM

SynchronizedTimeBaseManager 同步时基管理器

参考文档

[1] 参考手册_CanTSyn.pdf

[2] 参考手册_StbM.pdf

协议栈集成

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

CanTSyn协议栈各配置模块的功能介绍。

使用协议栈源码和配置工具,进行协议栈的集成的步骤。

表 CanTSyn协议栈各配置模块介绍

模块名

功能

Can

CAN驱动配置。

CanIf

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

EcuC

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

CanTSyn

CAN时间同步模块

StbM

同步时基管理器

表 CanTSyn协议栈集成的步骤

步骤

操作

说明

1

ORIENTAIS Stuido配置工具工程搭建和协议栈模块加载

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

2

模块配置及配置文件生成

NA

3

代码集成

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

4

验证测试

NA

Note

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

新建ORIENTAIS Studio配置工程及模块加载

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

    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. 新建工程如下所示,上一步添加的模块已经被加入到工程中。

    image9

    图 新建工程-9

模块配置及代码生成

模块配置

模块的具体配置,取决于具体的项目需求。该协议栈各模块配置项的详细介绍。

表 协议栈各模块配置参考文档

模块

参考文档

说明

Can

MCAL对应的Can配置手册

Gpt

MCAL对应的Gpt配置手册

CanIf

集成手册_Can通信.pdf

EcuC

集成手册_Can通信.pdf

CanTSyn

参考手册_CanTSyn.pdf

StbM

参考手册_StbM.pdf

配置代码生成

  1. 在ORIENTAIS Studio主界面左方,选择对应的协议栈,单击右键弹出Validate All和GenerateAll菜单。

    image10

    图 配置代码的生成-1

  2. 选择Validate All对本协议栈各配置选项进行校验,没有错误提示信息即校验通过。若有错误信息,请按照错误提示修改。

  3. 选择Generate All,生成配置文件。右下角的Console窗口输出生成的配置文件信息。

    image11

    图 配置代码的生成-2

  4. 在工程config文件夹,可查看生成的配置文件。

    image12

    图 配置代码的生成-3

功能集成

代码集成

协议栈代码包括两部分:项目提供的协议栈源码和ORIENTAIS Studio配置生成代码。

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

Note

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

集成注意事项

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

表 CanTSyn协议栈集成约束清单

编号

类别

约束限制

1

头文件

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

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

2

初始化

CanTSyn_Init和StbM_Init初始化前需要确保Can和Gpt已经初始化

3

周期函数

CanTSyn_MainFunction和StbM_MainFunction按照需求放置到相应的周期任务中,一般为10ms

集成示例

本章节通过CanTSyn协议栈为例,向用户展示CanTSyn协议栈的集成过程。用户可以据此熟悉CanTSyn协议栈配置工具的配置过程,以及如何应用配置工具生成的配置文件。

为让用户更清晰的了解工具的使用,所用的配置均逐一手动完成。关于Can驱动的配置,请参考Can配置手册。关于Gpt驱动的配置,请参考Gpt配置手册。CanIf配置的具体操作请参照《集成手册_Can通信.pdf》。

Note

本示例不代表用户的实际配置情况,用户需要根据自己的实际需求,决定各个参数的配置。

集成目标

通过Canoe模拟CanTSyn主节点,向本示例的从节点发送时间同步报文,从节点获取主节点同步的时间。由于时间同步的从节点不向外发送时间,故通过一帧CAN ID为0x666的CAN报文将同步后的时间转发出来。

模块的配置

新建配置工程及模块加载操作,请参考本文档章节(模块配置及代码生成)。此次仅说明如何配置,模块的配置项具体示意参见《集成手册_CanTSyn.pdf》和《集成手册_StbM.pdf》。

CanTSyn模块配置

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

    image13

    图 CanTSynGeneral配置界面

  2. 在CanTSynGeneral下,有CanTSynDevErrorDetect、CanTSynMainFunctionPeriod和CanTSynVersionInfoApi 、CanTSynR19CbkVersion、CanTSynMultiplePartitionEnabled五个配置项。

  3. 将CanTSynMainFunctionPeriod配置为0.01,其他配置项保持默认。

    image14

    图 CanTSynGlobalTimeDomain配置界面

  4. CanTSynGlobalTimeDomain配置如下图所示:

    image15

    图 CanTSynGlobalTimeDomain配置

  5. CanTSynGlobalTimeDomain->CanTSynGlobalTimeFupDataIDList->CanTSynGlobalTimeFupDataIDListElements中的配置(使用CRC时),根据客户需求去填写CRC值。

    image16

    图 SynGlobalTimeFupDataIDListElements的配置

  6. CanTSynGlobalTimeSlaves->CanTSynGlobalTimeSlave的配置(做从节 点):

    image17

    图 CanTSynGlobalTimeSlave的配置

  7. CanTSynGlobalTimeSlaves->CanTSynGlobalTimeSlavePdus->CanTSynGlobalTimeSlavePdu的配置:

    image18

    图 CanTSynGlobalTimeSlavePdu的配置

  8. CanTSynGlobalTimeSyncDataIDLists->CanTSynGlobalTimeSyncDataIDL ist->CanTSynGlobalTimeSyncDataIDListElements的配置(使用CRC时)根 据客户需求去填写CRC值。

    image19

    图 CanTSynGlobalTimeSyncDataIDListElements的配置

  9. CanTSynGlobalTimeMasters->CanTSynGlobalTimeMaster的配置(做主节 点):

    CanTSynCyclicMsgResumeTime:在即时传输之前,第一个常规周期时间的消息传输发生的时间。

    CanTSynGlobalTimeDebounceTime:SYNC报文和FUP报文之间的间隔时间。

    CanTSynGlobalTimeTxCrcSecured:选择是否支持CRC。

    CanTSynGlobalTimeTxPeriod:同步报文周期。

    CanTSynImmediateTimeSync:启用/禁用在CanTSyn_MainFunction()中对StbM_GetTimeBaseUpdateCounter()的周期轮询。

    CanTSynMasterConfirmationTimeout:这表示每次传输Timesync消息后的确认超时时间。

    image20

    图 CanTSynGlobalTimeMaster的配置

  10. CanTSynGlobalTimeMaster->CanTSynGlobalTimeMasterPdus->CanTSynGloa lTimeMasterPdu的配置:

    image21

    图 CanTSynGlobalTimeMasterPdu的配置

StbM模块的配置

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

    image22

    图 StbMGeneral的配置界面

  2. 在StbMGeneral的配置。若使用GPT时钟,需打开StbMGptTimerRef,并 选择mcal配置的Gpt时钟;若用Eth硬件时钟,则不勾选。

    image23

    图 StbMGeneral的配置

  3. StbMSynchronizedTimeBases->StbMSynchronizedTimeBase的配置。

    image24

    图 StbMSynchronizedTimeBase配置界面

  4. StbMSynchronizedTimeBases->StbMSynchronizedTimeBase->StbMLocal TimeClocks->StbMLocalTimeClock的配置:

  5. StbMClockFrequency中填写StbM所引用的Gpt定时器的时钟频率。若是 Eth时钟则默认1000000000。

  6. StbMLocalTimeHardware引用所需要引用的Gpt的定时器通道。若是Eth 时钟则默认1。

    image25

    图 StbMLocalTimeClock配置界面

  7. StbMSynchronizedTimeBases->StbMSynchronizedTimeBase->StbMLocal TimeClocks->StbMTimeCorrection的配置:

    StbMAllowMasterRateCorrection如果主节点启用correction功能则需要开启。

    StbMMasterRateDeviationMax填写由 StbM_SetRateCorrection设置的速率偏差值的最大允许绝对值。

    StbMOffsetCorrectionAdaptionInterval填写适应性的速率矫正足以消除速率和时间偏差值的时间区间。

    StbMOffsetCorrectionJumpThreshold用于决定使用什么样的矫正方式。偏差值若小于此值,则在定义的时间周期内使用线性缩减(linear reduction)矫正。若大于此值,则以跳跃的方式立即设置正确的时间和速率。

    StbMRateCorrectionMeasurementDuration填写用于计算速率差的时间区间。

  8. StbMRateCorrectionsPerMeasurementDuration填写同时进行速率测量的 次数,以确定当前速率偏差。

    image26

    图 StbMLocalTimeCorrection配置界面

源代码集成

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

image27

图 工程结构目录

  • BSW目录,存放模块相关的源代码和配置代码。可以看到Source目录下各个文件夹下是各个模块的源代码。

  • BSW下的Config->BSW_Config目录,用于存放配置工具生成的配置文件

CanTSyn协议栈源代码集成步骤如下:

  1. 将MCAL生成的CAN、GPT模块配置文件和ORIENTAIS Studio生成的配置文件复制到对应的文件夹中;

  2. 将MCAL提供的CAN模块源码和普华提供的协议栈源代码文件复制到对应的文件夹中。

  3. 添加新增加的模块的代码头文件路径到工程设置中

协议栈调度集成

CanTSyn协议栈调度集成步骤如下:

  1. 协议栈调度集成,需要逐一排查并实现表 协议栈集成约束清单 所罗列的问题,以避免集成出现差错。

  2. 编译链接代码,将生成的elf文件烧写进芯片。

CanTSyn协议栈有关的代码,在下方的main.c文件中给出重点标注。

Note

本示例中,CanTSyn协议栈初始化的代码和启动通信的代码置于main.c文件,并不代表其他项目同样适用于将其置于main.c文件中。

 1#include <machine/wdtcon.h>
 2#include "Mcu.h"
 3#include "Port.h"
 4
 5// CanTSyn协议栈相关模块头文件
 6#include "Can_17_MCanP.h"
 7#include "CanIf.h"
 8#include "Gpt.h"
 9#include "StbM.h"
10#include "CanTSyn.h"
11
12StbM_TimeStampType timestamp;
13StbM_UserDataType userData;
14Uint8 Data[8] = {0};
15Can_PduType PduInfo = {0,8,0x666,&Data[0]};
16
17int main(void)
18{
19    /*Initialize ECUM Module*/
20    EcuM_Init(&EcuM_ConfigAlternative[0]);
21
22    /*Initialize FlsLoader*/
23    FlsLoader_Init(NULL_PTR);
24
25    // 初始化Can、CanIf、CanTSyn、StbM模块
26    StbM_Init(&StbM_Config);
27    Can_17_MCanP_Init(&Can_17_MCanP_ConfigRoot[0]);
28    CanIf_Init(&CanIf_InitCfgSet);
29    CanTSyn_Init(&CanTSyn_config);
30
31    // 打开通信(主节点使用)
32    CanIf_SetControllerMode(0, CANIF_CS_STARTED);
33
34    Gpt_EnableNotification(GptConf_GptChannel_Gpt_1ms);
35    Gpt_StartTimer(GptConf_GptChannel_Gpt_1ms, 100000);
36    Gpt_StartTimer(GptChannelConfiguration_STBM, 0xFFFFFFu);
37
38    StbM_TimeStampType test1 = {0u};
39    StbM_UserDataType  test2 = {0u};
40
41    // 主节点需要添加初始化授时
42    test1.secondsHi = 0;
43    test1.seconds = 1696903810;  // 初始时间戳(秒)
44    test1.nanoseconds = 0;       // 初始时间戳(纳秒)
45    StbM_SetGlobalTime(0,&test1,&test2);
46
47    /* infinite loop */
48    while (1)
49    {
50        if(Gpt_1msFlag == TRUE)
51        {
52            Gpt_1msFlag = FALSE;
53        }
54        if(Gpt_10msFlag == TRUE)
55        {
56            // CanTSyn、StbM模块周期处理函数
57            CanTSyn_MainFunction();
58            StbM_MainFunction();
59
60            // 做从节点时的测试代码:StbM_GetCurrentTime获取时间,将同步到的时间通过0x666报文转发出来
61            StbM_GetCurrentTime(0, &timestamp,&userData);
62            PduInfo.sdu[0] = (uint8)((StbM_TimeStamp.seconds & 0xff000000) >> 24);
63            PduInfo.sdu[1] = (uint8)((StbM_TimeStamp.seconds & 0x00ff0000) >> 16);
64            PduInfo.sdu[2] = (uint8)((StbM_TimeStamp.seconds & 0x0000ff00) >> 8);
65            PduInfo.sdu[3] = (uint8)((StbM_TimeStamp.seconds & 0x000000ff));
66            PduInfo.sdu[4] = (uint8)((StbM_TimeStamp.nanoseconds & 0xff000000) >> 24);
67            PduInfo.sdu[5] = (uint8)((StbM_TimeStamp.nanoseconds & 0x00ff0000) >> 16);
68            PduInfo.sdu[6] = (uint8)((StbM_TimeStamp.nanoseconds & 0x0000ff00) >> 8);
69            PduInfo.sdu[7] = (uint8)((StbM_TimeStamp.nanoseconds & 0x000000ff));
70
71            Can_Write(2, &PduInfo);
72        }
73    }
74    return 1;
75}

验证结果

根据集成目标,能够跟Canoe正常通信,以下是时间同步的同步log.

image28

图 验证结果