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

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

3天内不再提示

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

冬至配饺子 来源:开心果 Need Car 作者:开心果 Need Car 2022-08-25 10:41 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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超时回到默认会话。



审核编辑:刘清

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

    关注

    58

    文章

    3013

    浏览量

    471485
  • 网络管理
    +关注

    关注

    0

    文章

    127

    浏览量

    29150
  • 上位机
    +关注

    关注

    27

    文章

    994

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    在物联网设备面临的多种安全威胁中,数据传输安全威胁和设备身份安全威胁本质区别?

    在物联网设备面临的多种安全威胁中,数据传输安全威胁和设备身份安全威胁本质区别,实际应用中哪一种更难防范?
    发表于 11-18 06:41

    CAN集线器什么作用

    CAN集线器作为工业通信网络中的关键设备,主要用于解决CAN总线在实际应用中遇到的 通信距离有限、多速率网络难兼容、以及数据冗余导致负载过高 等问题。在工业自动化、汽车制造、轨道交通等
    的头像 发表于 11-14 14:42 158次阅读
    <b class='flag-5'>CAN</b>集线器<b class='flag-5'>有</b>什么作用

    pipe发送超过16384长度,会被截断怎么解决?

    我在使用paho_mqtt 发送数据的时候,短包没问题,发现数据长度超过16384就会崩溃; 追查之下发现pipe 写入数据以后,一次性读出
    发表于 10-11 06:18

    CAN如何进行录波,接收所有数据

    。但是还是只能接收到过滤的传入的数据参数内容,实际我并希望他启用过滤。 3)RT_CAN_CMD_SET_FILTER 看can.c文件下,是
    发表于 10-09 09:12

    广成科技蓝牙转CAN模块的作用和应用场景

    蓝牙转CAN设备通常内置CAN通信接口电路和蓝牙通信模块。它实时监听CAN总线和蓝牙总线,当检测到CAN总线上有数据时,会立即对
    的头像 发表于 09-29 11:05 665次阅读

    CAN发送只能使用中断或者DMA,为什么?

    今天看了CAN发送的底层配置发现,rtt的CAN设备发送好像只能选择DMA或者中断的方式进行发送,这种设定是为什么呢? rt_device
    发表于 09-25 07:19

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

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

    【飞凌T527N开发板试用】CAN的使用

    can1:用命令行发送 先使能can1,然后设置发送长度。 执行 cangen就可以开始发送
    发表于 08-19 17:27

    如何使用20829 can-fd发送64字节扩展标识符数据帧?

    numberOfFIFOElements更改为16。 使用两个20829 EVK进行测试,最大传输数据大小为15个字节。DLC范围是0~15 uint32数据,但实际上,另一个节点每帧
    发表于 08-04 06:56

    如何查找 TLE9881 接收帧的 DLC

    我们的项目使用 TLE9881,并使用经典 CAN 协议进行通信。 您能帮我找到接收到的 CAN 帧的 DLC 吗?
    发表于 07-15 06:42

    CAN总线协议网关模块与数据采集器:工业自动化数据交互中枢

    、航空航天、船舶、医疗设备等众多领域,并成为一种广泛使用的工业标准通信协议。 CAN 总线的数据帧由帧起始、仲裁场、控制场、数据场、CRC 场、应答场和帧结束等部分组成。其中,仲裁场用于确定消息的优先级,
    的头像 发表于 05-09 10:10 658次阅读
    <b class='flag-5'>CAN</b>总线协议网关模块与<b class='flag-5'>数据</b>采集器:工业自动化<b class='flag-5'>数据</b>交互中枢

    USB3014读取请求为16Kbytes但实际数据长度只有64bytes时,这会影响USB性能吗?

    PC 发送 64 个字节,并且在 PC 端,我的读取请求大约是 16K 字节,那么我已经得到了 64 个字节,这是没问题的。 但我想知道,当读取请求为16Kbytes但实际数据长度
    发表于 05-09 06:26

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

    发现都有丢帧的情况。 调试如下:固定发送报文数量,并仿真,对将要发送数据添加到邮箱的成功状态进行计数。 第一种情况:等待所有发送邮箱都为空,再添加报文,出现丢帧。发20000帧,成功
    发表于 03-11 08:30

    关于STM32 CAN通信发送函数HAL_CAN_AddTxMessage()的最后一个参数填0和定义一个变量取地址的问题求解

    问题: 关于STM32 CAN通信 发送函数 HAL_CAN_AddTxMessage()的最后一个参数填0和定义一个变量取地址的问题,如果直接传0,我实验发现 STM32F103C8T6 会出
    发表于 03-11 08:22

    CAN loopback模式测试

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