全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 嵌入式技术 >

CAN DLC与实际发送数据长度有何关系

时间:2022-08-25 10:41

人气:

作者:admin

标签: CAN  网络管理  上位机 

导读:以500Kbps通信的经典CAN为例,如果允许上位机/Gateway节点连续发送,1ms内可以发送三帧报文,也就是说:如果接收端没有在300us左右的时间内处理完连续帧,就可能会导致连续帧覆盖的问题...

Q1、Prepare Bus-Sleep Mode进入Network Mode条件

A1CAN网络管理中,Prepare Bus-Sleep Mode进入Network Mode可以通过三种方式,如下所示:

pYYBAGMG4JCALkZ3AACUY_N4y2I973.png

由CanNm_RxIndication()方式进入,即:在PBSM(Prepare Bus-Sleep Mode)下收到网络管理报文方式进入;

由CanNm_PassiveStartUp()方式进入。调用CanNm_PassiveStartUp()接口,表明网络需要被动唤醒,收到网络管理报文也属于被动接收,和CanNm_RxIndication()方式进入不一样吗?这里说一下个人理解:在PBSM模式下,ECU依然有接收报文的能力,如果接收到NM Msg,可以通过CanNm_RxIndication()接收,唤醒网络;如果收到特定的应用报文(比如:包含KL15信号的应用报文)或者诊断报文,也想把网络唤醒,显然非网络管理报文不会通过CanNm_RxIndication()接口接收,如果想让非网络管理唤醒网络,此时就可以让上层主动调用CanNm_PassiveStartUp()接口,进而唤醒网络;

由CanNm_NetworkRequest()方式进入,同CanNm_PassiveStartUp()方式,此方式也属于上层请求行为。不同于CanNm_PassiveStartUp()方式,此方式表明当前节点需要通信,需要主动唤醒网络。比如前面提到的一种情况:VFC置位时,即可主动调用CanNm_NetworkRequest()接口进入RMS状态。

Q2:CAN DLC与实际发送数据长度关系

A2:DLC(Data Length Code),一帧CAN报文中,发送数据的长度,用4个Bit表示。

对于ClassicalFrame,DLC的长度有效范围为0~8,对应的发送数据长度为0~8 bytes,如果DLC长度≥8,则发送数据长度为8 byte。

对于FD frame,DLC不仅可以等于0~8,还可以等于9~F,对应的数据长度分为12、16、20、24、32、48、64。如下所示:

pYYBAGMG4KiAOJJWAAEpyKwS8rM465.png

对于ClassicalFrame如果设置DLC = 4,实际在总线上传输的数据长度是4 byte还是8 byte?答:4 byte。虽然可以这样设置,但是工程实际中,很少这样用,一帧报文只传输4个数据或者更少,会降低有效数据负载,效率低。

注意:假设传输一个ClassicalFrame,虽然总线只传输4 byte数据,但是CAN模块消耗的硬件资源(RAM),实际是8 byte(eg:tc3xx)。

发送一帧CAN报文,对应一个Tx Buffer Element,在Tx Buffer Element中,根据发送CAN报文的类型决定消耗的DB(Data Buffer)大小,如下所示:

poYBAGMG4LyABLs6AACWlJ25nUA653.png

一帧CAN报文消耗多大的DB呢?DB空间的消耗,由TXESC.TBDS决定,因此,DB最小需要8 byte。如下所示:

pYYBAGMG4M-ANOLkAADNj0UUJrU566.png

什么意思呢?就是在硬件配置阶段,即使配置DLC = 4,但是一帧CAN报文也必须消耗8 byte的硬件RAM资源。而数据发送到总线时,只发送4 byte的数据。

Q3:$3E 80发送时机

A3:$3E 80的主要作用在于维持节点的会话状态,即:将节点维持在非默认会话。工程中,基于UDS软件升级过程中,Tester或者Gateway节点会使用功能寻址周期性发送$3E 80。何时发送$3E 80更合适呢?

本文主要想讨论$36服务过程中,何时发送$3E 80更恰当。软件升级过程中,一个$36 Block会发送大量数据,即:多帧传输,在多帧传输的过程中,发送一个$3E 80是否可行?答:可以,但是会带来风险。为什么这样说呢?多帧传输过程,一般使用物理寻址,针对特定节点升级,在多帧传输的过程中,发送一帧功能寻址的$3E 80,且中断接收,如果处理3E 80的中断例程耗时过多,导致连续帧会被延迟处理,连续帧被延时时间过长会导致接收丢帧的问题,即:下一个连续帧覆盖被延时处理的连续帧。以500Kbps通信的经典CAN为例,如果允许上位机/Gateway节点连续发送,1ms内可以发送三帧报文,也就是说:如果接收端没有在300us左右的时间内处理完连续帧,就可能会导致连续帧覆盖的问题,即:接收端接收丢帧。

pYYBAGMG4OWAL-hbAABuuhxFelE773.png

如上,讨论一种工况:

t0时刻,接收端中断收到$2A XxXx...(接收完成),进入中断例程处理$2A XxXx...数据(主要是通知上层Copy数据);

t1时刻,接收端中断收到$3E 80,进入中断例程处理3E 80数据;

t2时刻,接收端中断收到连续帧$2BXxXx...,由于同一中断(均是接收中断,优先级一样)正在执行,2BXx Xx...数据暂时不能处理;

t3时刻,3E 80数据处理完成,同时收到连续帧$2CXx Xx...,如果$2BXx Xx...和$2CXx Xx...使用同一个硬件缓存区,会导致连续帧$2CXx Xx...覆盖连续帧$2BXxXx...的工况。所以,为避免接收丢帧,接收缓存区一般会配置多一些,一般工程中会将资源全部使用或者用FIFO方式接收。

理想工况,这种连续帧插入3E 80的行为不会出现问题(中断例程不要处理大量逻辑),但在工程实际中,偶尔会遇到并行发送功能寻址$3E 80,导致连续帧发送问题的Bug。

一般在处理多帧发送过程中,如果上位机或者Gateway节点发送功能寻址的$3E 80,会选择在连续帧结束时(发送完最后一帧连续帧)发送。

注意:需求中,有时会约束$36服务的P4 server_max为5000ms,即:只允许接收节点(Server)回复一个NRC0x78,为什么呢?如果S3超时时间设置为5000ms,且$3E 80放在连续帧的最后发送,当前Block传输用时接近5000ms,如果再不发送一帧$3E 80,则其他节能可能会因S3超时回到默认会话。



审核编辑:刘清

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信