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
    +关注

    关注

    58

    文章

    3010

    浏览量

    471467
  • LIN
    LIN
    +关注

    关注

    4

    文章

    232

    浏览量

    41816

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    LIN/CAN(FD)/FlexRay总线静电二极管国产替代

    雷卯电子(Leiditech)作为国内ESD保护领域的领先厂商,为Nexperia(安世半导体)的产品线提供了成熟且完备的国产替代方案,尤其在LINCAN(FD)、FlexRay等车载网络接口领域。在替代选型上,雷卯产品不仅在关键参数
    的头像 发表于 10-13 18:38 359次阅读
    <b class='flag-5'>LIN</b>/<b class='flag-5'>CAN</b>(FD)/FlexRay总线静电二极管国产替代

    如何同时指定can硬件滤波器的只接收id为0 和id为3的报文呢?

    如何同时指定can硬件滤波器的 只接收id为0 和id为3的报文呢 我目前只会用 RT_CAN_FILTER_STD_INIT(3, RT_NULL, RT_NULL)去指定id为3的报文
    发表于 09-28 07:46

    移植CANfestival,发现can无法接收数据,为什么?

    通过can的上位机来发送报文,发现如下的情况 无论发送任何数据,发现rt_device_read返回值是0,查了一下函数返回值发现读取失败 然后我在下面一行打印接收到的数据 发现接收到数据都是0
    发表于 09-11 07:46

    什么,以太网能传CAN报文

    ),为控制指令在车内网络不同控制节点间的传输提供了新的选择。通俗来讲,ACF就是将目前较为成熟的控制协议(如CANLIN、FlexRay甚至是RS232串口指令等)
    的头像 发表于 09-09 15:59 2409次阅读
    什么,以太网能传<b class='flag-5'>CAN</b><b class='flag-5'>报文</b>?

    ProfiNet转CAN/CANopen网关技术详解

    CAN 报文,提供了更高的灵活性。 其核心工作原理是数据映射,即在网关内部建立 PROFINET IO 数据区与 CANopen 对象字典或 CAN 报文标识符之间的对应关
    的头像 发表于 08-26 16:54 576次阅读
    ProfiNet转<b class='flag-5'>CAN</b>/CANopen网关技术<b class='flag-5'>详解</b>

    虹科技术分享 | LIN总线译码功能与LIN控制交流发电机(二)

    上一期,我们详细分享了LIN总线的结构、译码方法、休眠与唤醒过程。那如何借助串行译码分析总线故障?我们能否从译码结果中,进一步提取LIN线发送的信息?答案是肯定的。这一期,我们就将结合
    的头像 发表于 08-07 11:28 604次阅读
    虹科技术分享 | <b class='flag-5'>LIN</b>总线译码功能与<b class='flag-5'>LIN</b>控制交流发电机(二)

    LIN协议:汽车电子中的隐形功臣

    在汽车电子通信领域,CAN/CANFD和车载以太网常被提及,但有一个低调却不可或缺的协议—LIN,正默默支撑着车窗、车灯等车身系统的智能化控制。LIN协议LIN是面向汽车底端分布式应用
    的头像 发表于 07-01 11:40 1710次阅读
    <b class='flag-5'>LIN</b>协议:汽车电子中的隐形功臣

    ATS失效请求报文问题的故障排除步骤

    本篇文章提供了解决 ATS 失效请求报文问题的故障排除步骤,主要聚焦在 CQ 接口上未显示主机发送报文的情况。
    的头像 发表于 06-09 15:17 1195次阅读
    ATS失效请求<b class='flag-5'>报文</b>问题的故障排除步骤

    使用S32G3板进行CAN消息测试遇到的问题求解

    我正在使用 S32G3板进行 CAN 消息测试。 配置完成后,我可以使用 cansend 命令发送 CAN 消息。 我想从 PC 接收 CAN 消息。 BSP是否收到了
    发表于 04-10 07:06

    CAN报文流程解析

    CAN报文流程解析,直流充电桩上的CAN通讯解析过程
    发表于 03-24 14:03 10次下载

    使用CAN以及CANIF配置了S32K310的CAN驱动模块,如何进行报文的接收呢?

    我使用CAN以及CANIF配置了S32K310的CAN驱动模块。我知道调用CAN_Write()函数进行报文发送,但我存有以下的一些问题:
    发表于 03-21 07:24

    STM32G473 CAN发送数据出现丢帧怎么解决?

    配置CAN以FIFO模式发送,单片机周期发送不同ID的CAN报文,同时使用软件ZCANPRO周期发送
    发表于 03-11 08:30

    dsPIC33C Touch-CAN-LIN Curiosity开发板用户指南

    电子发烧友网站提供《dsPIC33C Touch-CAN-LIN Curiosity开发板用户指南.pdf》资料免费下载
    发表于 01-22 16:18 1次下载
    dsPIC33C Touch-<b class='flag-5'>CAN-LIN</b> Curiosity开发板用户指南

    HTTP网络通讯过程

    过程 客户端(发送方组包) 1)HTTP 浏览器 解析 URL (协议、域名、资源路径) 生成  HTTP 请求报文 2)DNS(真实地址查
    的头像 发表于 01-20 09:07 1057次阅读
    HTTP网络通讯<b class='flag-5'>过程</b>

    CAN loopback模式测试

    ); HAL_NVIC_EnableIRQ(CAN_RX0_IRQn);。 发送和接收测试 发送报文:创建一个 CAN 报文结构体,填写标准
    发表于 01-18 16:29