0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CAN、LIN报文的发送过程详解

832065824 来源:汽车电子嵌入式 作者:汽车电子嵌入式 2022-11-14 10:02 次阅读

前言

最近在研究AUTOSAR通信协议栈的时候发现对IPDU的Trigger Transmit很是疑惑,产生了以下几个问题:

(1)Com模块的IPDU的trigger发送和CanIf或者Can模块的Trigger发送一样吗?

(2)怎么通过CanIf模块发送trigger IPDU?

(3)哪个模块完成Can trigger IPDU的判断?

(4)请说明Can IPDR的Trigger Transmit的整个过程?

(5)Lin IPUD和Can IPDU的trigger transmit有何异同?

本文先梳理一遍CAN、LIN报文的发送过程,然后回答这些问题。

AUTOSAR 通信服务-Com模块概念详解

AUTOSAR 通信服务-PDU Router

AUTOSAR CAN通信协议栈分析(3)-CanIf

Can通信协议栈分析(1)-Can Driver

73bed7f6-63a7-11ed-8abf-dac502259ad0.png

正文

1.CAN报文IPDU的发送过程

1.1 COM模块发送IPDU

73ed8394-63a7-11ed-8abf-dac502259ad0.png

在COM模块中,周期报文通过Com_MainFunctionTx周期调度函数发送,事件触发型报文通过Com_TriggerIPDUSend通信服务接口发送。无论是Com_MainFunctionTx还是Com_TriggerIPDUSend最后都是调用PDUR模块的PduR_ComTransmit来发送报文,且传入到PduR模块的PduInfo->SDU数据buffer指针不为NULL。

740b9f1e-63a7-11ed-8abf-dac502259ad0.png

74573bea-63a7-11ed-8abf-dac502259ad0.png

1.2 PDUR模块发送IPDU

747d2cf6-63a7-11ed-8abf-dac502259ad0.png

强调Com模块过来的Can IPDU->SDU一定不为NULL是因为它会影响报文的发送方式(1.3章节详解)。PduR模块对于Com模块的CAN IPDU直接调用CanIf_Transmit发送,CanIf收到IPDU发送请求后直接调用CanDriver的接口发送报文,Copy Data到CanController发送。

74ac4220-63a7-11ed-8abf-dac502259ad0.png

PduR模块的PduRestPdu配置容器提供了PduRDestPduDatProvision配置参数来配置每一个发送报文是直接发送还是触发式发送。

Note: 在ETAS的集成配置环境ISOLAR中这个参数无论配置成啥都不影响PduR模块的配置代码。个人认为这个PduR模块对于Can报文的发送都是直接调用CanIf_Transmit,确实不需要这个参数,所以到底是ISOLAR有问题还是确实这个参数不影响代码的生成还有待研究。

1.3 CanIf模块发送IPDU

74df1128-63a7-11ed-8abf-dac502259ad0.png

CanIf模块提供CanIfTrggerTransmitSupport配置参数来配置CanIf模块是否支持Trigger方式发送报文。

7510126e-63a7-11ed-8abf-dac502259ad0.png

CanIf为每一Tx IPDU提供了CanIfTxPduTriggerTransmit的配置参数。如果该报文的上层发送模块是PduR模块且配置了该参数为True,这在PduR模块就是生成PduR_CanIfTriggerTransmit的函数。

1.3.1 DIRECT发送

75a1dc80-63a7-11ed-8abf-dac502259ad0.png

CanIf模块的CanIf_Transmit接口函数本身并不会判断传入的IPDU是否是需要Trigger发送(仅仅会做一些Det的检测),而是直接调用Can_Write来发送IPDU,由Can模块通过传入的IpduInfo->Sdu是否为NULL来确定是DIRECT发送还是TRIGGER发送IPDU。

如果是IpduInfo->Sdu不为NULL,则为DIRECT发送方式,Can_Write直接完成Copy Data into controller完成报文的发送。

1.3.2 Trigger发送

75c9977a-63a7-11ed-8abf-dac502259ad0.png

如果是IpduInfo->Sdu为NULL,则为TRIGGER发送方式,Can_Write --> CanIf_TriggerTransmit --> PduR_CanIfTriggerTransmit --> Com_TriggerTransmit完成IpduInfo->Sdu into Controller的数据拷贝,也就是所谓的Trigger数据发送。

1.4 Can模块发送IPDU

75fa0fd6-63a7-11ed-8abf-dac502259ad0.png

Can模块提供CanTriggerTransmitEnable配置参数来配置是否使用Trigger Transmit功能。Can模块完成IPDUD最终的Trigger发送。

2.LIN报文IPUD的发送过程

2.1 COM模块发送IPDU

COM模块统一了所有IPUD的处理方式,和1.1节完全一样。

2.2 PDUR模块发送IPDU

2.2.1 Lin偶发帧sporadic frame发送

761b5812-63a7-11ed-8abf-dac502259ad0.png

Lin报文的周期发送是通过调度表实现的,而Lin调度表存在于LinIf模块,LinIf模块在周期调用调度表的时候通过callback的方式实现IPDU的trigger transmit,也就是向上获取到sdu数据,然后调用Lin_SendFrame发送报文。调度表中的报文都是需要周期发送处理的报文,对于偶发sporadic frame的发送,COM --> PDUR -->CanIf_Transmit中设置发送flag,实现偶发帧发送。

2.2.2 Lin非偶发帧sporadic frame发送

76501642-63a7-11ed-8abf-dac502259ad0.png

2.3 LinIf模块发送IPDU

76775be4-63a7-11ed-8abf-dac502259ad0.png

LinIf模块实现Lin调度表中报文的周期发送,且所有报文都是通过调用pdur模块的PduR_TriggerTransmit的callback函数完成sdu数据的获取。

76a35622-63a7-11ed-8abf-dac502259ad0.png

LinIf模块的LinIfTxPdu配置容器中提供了LinifTxTriggerTransmitUL的配置参数,但是这个参数依赖于LinIfUserTxUL参数,如果LinIfUserTxUL配置为PDUR,则LinifTxTriggerTransmitUL参数不管有无配置,则一定为PduR_TriggerTransmit,也就是PduR模块一定会生成一个PduR_TriggerTransmit配置callback函数。

2.4 Lin模块发送IPDU

Lin模块没有trigger transmit的判断,提供Lin_SendFrame的接口即可。

3.问题回答

问题1:Com模块的IPDU的trigger发送和CanIf或者Can模块的Trigger发送一样吗?

答:Com模块的IPDU的trigger发送和CanIf或者Can模块的Trigger发送不一样。

Com模块的trigger transmit是某个事件触发是调用Com_TriggerIPDUSend发送IPDU,但是无论是Com的周期发送Com_MainFunctionTx还是Com_TriggerIPDUSend发送IPDU,都是调用PduR_ComTransmit,而PDUR->CanIf->Can对于Com来的IPDU都是统一以DIRECT的方式直接Copy Data到Can Controller。

CanIf模块本身不做IPDU是否需要trigger transmit的判断,而是直接将IpudInfoPtr传递给Can模块,Can模块中通过IpduInfoPtr->Sdu是否为NULL来绝对是使用DIRECT的方式还是trigger transmit/也就是向上调用callback后set buffer来发送报文。

问题2:怎么通过CanIf模块发送trigger IPDU?

答:CanIfUser(可以自定义一个模块,或者是其他模块)在调用CanIf_Transmti发送报文的时候传入的IpduInfoPtr->Sdu == NULL同时CAN模块需要enable trigger transmit就可以实现CAN IPDU使用CanIf模块trigger transmit。

问题3:哪个模块完成Can trigger IPDU的判断?

答:CanDriver模块。

问题4:请说明Can IPDR的Trigger Transmit的整个过程?

答:CanDriver模块通过判断CanIf模块传入的IpduInfoPtr-Sdu为NULL且Can模块enbale了trigger transmit后调用CanIf_TriggerTransmt -> PduR_TriggerTransmt -> Com_TriggerTransmt完成Copy Data into Controller的数据拷贝操作,之后通过Can发送报文。

问题5:Lin IPDU和Can IPDU的trigger transmit有何异同?

答:

相同点:IPDU的trigger transmit都是最后调用Com_TriggerTransmit函数实现的。

不同点:Lin IPDU如果是非偶发帧(sporadic frame)在通过调度表发送时都是使用trigger transmit分方式发送的且COM -> PDUR对LIN IPDU的发送无影响;而Can IPDU的周期发送主要是通过COM -> PDUR向下传递IpduInfoPtr通过DIRECT方式发送的。

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • CAN
    CAN
    +关注

    关注

    57

    文章

    2692

    浏览量

    463110
  • LIN
    LIN
    +关注

    关注

    4

    文章

    214

    浏览量

    40216

原文标题:Can/Lin报文的触发发送(Trigger Transmit)

文章出处:【微信号:汽车电子嵌入式,微信公众号:汽车电子嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于VB6.0 实现 CAN信号收发 Demo

    本文主要讲的是,基于TSMaster实现TOSUN系列CAN/CANFD,LIN设备的操作。主要给大家介绍在TSMaster软件里如何实现CAN信号收发Demo工程。本文关键词:CAN
    的头像 发表于 07-27 08:21 627次阅读
    基于VB6.0 实现 <b class='flag-5'>CAN</b>信号收发 Demo

    CYT2BL和SDL v8.0.0是否有可能实现以相同ID发送和接收CAN报文(RxID、TxID)的功能?

    我使用的是 CYT2BL 和 SDL v8.0.0。 我想发送和接收具有相同 ID 的 CAN 报文。 1.是否有可能实现以相同 ID 发送和接收
    发表于 07-23 06:12

    TC3XX can发送报文,周期上下波动严重怎么解决?

    使用FULL CAN发送,周期调用Can_17_McmCan_lWriteMsgObj发送报文,查看周期是稳定的,但到发出来和中断触发的时间会上下波动,而且波动越来越大。
    发表于 07-11 08:00

    试图从CAN卡向TC375发送报文时,TC375始终收不到,为什么?

    我试图在TC375上进行CAN收发测试,测试目的是完成TC375和CAN卡的通讯,现在我已经成功地将CAN报文从TC375发送到了
    发表于 07-04 06:04

    TSMaster 中不同总线报文消息过滤的操作方式

    TSMaster软件平台支持对不同总线(CANLIN、FlexRay)报文和信号的过滤,包括全局接收过滤、数据流过滤、窗口过滤、字符串过滤、可编程过滤,针对不同的总线信号过滤器的使用方法基本相
    的头像 发表于 06-22 08:21 1329次阅读
    TSMaster 中不同总线<b class='flag-5'>报文</b>消息过滤的操作方式

    如何通过CAN报文TC375传输数据?

    从示例 MCMCAN_1_KIT_TC375_LK 和 ADC_Single_Channel_1_TC375_LK 开始,我必须用 CAN 报文发送从模拟通道获取的数值。 我就是这么做的: void
    发表于 05-28 08:30

    TC387从App跳回PBL在下载SBL,进入SBL后上位机发送CAN报文响应超时,怎么解决?

    你好,我目前实现了 PBL SBL 但目前的问题是:将SBL下载到RAM区域后,通过SBL下载App正常;但从App跳回PBL在下载SBL,进入SBL后上位机发送CAN 报文响应超时。我在SBL中
    发表于 05-24 08:12

    CAN报文为什么会发送失败?

    CAN总线调试过程中出现报文发送失败。很多工程师都对此只知其一不知其二,今天我们就以CAN报文
    的头像 发表于 04-12 08:25 1769次阅读
    <b class='flag-5'>CAN</b><b class='flag-5'>报文</b>为什么会<b class='flag-5'>发送</b>失败?

    CAN报文格式和发送总流程

    在标准格式中,报文的起始位称为帧起始(SOF),然后是由11位标识符和远程发送请求位(RTR)组成的仲裁场。RTR位标明是数据帧还是请求帧,在请求帧中没有数据字节。
    发表于 04-11 10:07 8384次阅读
    <b class='flag-5'>CAN</b>的<b class='flag-5'>报文</b>格式和<b class='flag-5'>发送</b>总流程

    TC387模块CAN0的节点2作为CANA使用,CANA既收不到报文也发不出报文如何解决?

    TC387模块CAN0的节点2作为CANA使用,CAN1的节点0作为CANB使用,配置基本相同。但CANB的通信正常,而在TJA1145正常情形下,CANA既收不到报文,也发不出报文
    发表于 02-19 06:43

    MCU怎样判断CAN发送状态?

    (); } 如此配置发现在一帧报文发送完了后,不能进入can发送中断, 2、能有别的标志位来判断can
    发表于 02-18 08:33

    CAN FD在发送报文时会有发不出去的现象怎么解决?

    现象描述: 在发送多帧报文数据时,出现了较为严重的报文丢失现象。编写测试程序,在for循环中循环发送id为0-7ff的报文,对返回值进行了判
    发表于 02-02 07:48

    TC364&amp;TJA1145特定CAN报文丢失怎么解决?

    客户现场进行急加速和急减速过程中,出现了特定ID的报文丢失,其它报文发送正常,CAN这一块用的工具配置生成,家里进行测试Busoff后能正常
    发表于 01-23 06:03

    TSMaster报文发送的信号生成器操作说明

    信号生成器功能是TSMaster分析中的报文发送模块。信号生成器用于发送和配置每个CAN/LIN信号的值变化行为,简而言之,这是一个可以控制
    的头像 发表于 12-23 08:21 892次阅读
    TSMaster<b class='flag-5'>报文</b><b class='flag-5'>发送</b>的信号生成器操作说明

    接收UDP报文过程

    物理网线发送到网卡 网络驱动程序会把网络中的报文读出来放到 ring buffer 中,这个过程使用 DMA(Direct Memory Access),不需要 CPU 参与 内核从 ring
    的头像 发表于 11-11 11:22 844次阅读
    接收UDP<b class='flag-5'>报文</b>的<b class='flag-5'>过程</b>