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

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

3天内不再提示

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

ZLG致远电子 2024-04-12 08:25 次阅读

CAN总线调试过程中出现报文发送失败。很多工程师都对此只知其一不知其二,今天我们就以CAN报文发送失败的问题来做一次探讨。

在了解CAN报文为什么会发送失败之前我们先看看一帧标准的CAN报文到底应该是怎么样的。表1是一帧正常标准数据帧的报文组成。
表1 标准数据帧报文格式组成24143244-f863-11ee-9118-92fbcf53809c.png

24197de4-f863-11ee-9118-92fbcf53809c.jpg

图1 标准数据帧格式CAN总线是一种基于广播的通讯方式,为了保证总线上的每一个正常节点都能正确的接收到报文,报文的发送者要求至少一个接收节点在报文发送结束前要作出应答,这也是报文里ACK存在的原因。

一帧CAN报文中ACK段长度为2个位,包含应答间隙(ACK Slot)和应答界定符(ACK Delimter)。在应答场里,发送器发送两个隐性位。当接收器正确地接收到有效的报文,接收器就会在应答间隙(ACK Slot)期间(发送ACK信号)向发送器发送一“显性”的位以示应答。

应答间隙:所有接收到匹配CRC序列(CRC SEQUENCE)的站会在应答间隙(ACK Slot)期间用一显性的位写入发送器的隐性位来作出回答。

应答界定符:ACK界定符是ACK场的第二个位,并且是一个必须为隐性的位。因此,应答间隙(ACK Slot)被两个隐性的位所包围,也就是CRC界定符(CRC Delimter)和ACK界定符(ACK Delimter)。

241d1c2e-f863-11ee-9118-92fbcf53809c.png

图2 正常ACK段报文

而如果总线上没有ACK应答(即应答间隙为隐性),发送器就会发送一个错误标志,并且发送错误计数器值加8,节点就会对报文进行自动重发,若自动重发依然收不到ACK,则在发送错误计数器计数满128后(即出现16帧错误帧),由错误主动转为错误被动状态,如图3所示。那导致ACK段出错的原因有哪些呢?下面小编总结了一些。

  • 总线上只有一个有效节点:发送报文的节点在发送出一帧报文后会检测总线上应答间隙的状态,如果检测到应答间隙为隐性位,则表示该帧报文没有得到ACK,发送失败,需要重发,而由于发送错误计数器会在发送失败后累加,直到该节点关闭。所以,当总线上只有一个有效节点时,这个节点是发不出去数据的,因为它所发出的数据帧中的ACK Slot没有另外一个节点来填充,将永远是隐性位,这个节点会一直重发数据直到发送成功或发送被取消。
  • 波特率不匹配或者节点没有初始化,导致没有ACK;
  • 总线线缆短路,断路,接反;
  • 高速CAN总线上接的节点不是高速CAN,而是容错低速CAN,导致不匹配。

24205d76-f863-11ee-9118-92fbcf53809c.jpg

图3 应答界定符错误帧242459c6-f863-11ee-9118-92fbcf53809c.png

图4 没有ACK的报文

当你在调试CAN总线时出现节点发送报文失败的情况时,一定要检查是不是以上几点疏漏导致你的总线上ACK异常。而借助恰当的仪器,可以在查找CAN总线错误时事半功倍。图4即采用致远电子的CANScope来对错误帧进行标记,同时找到错误帧对应的波形来查找出错误情况。CANScope还可以对CAN总线物理层、数据链路层、应用层做一系列的测试,为CAN工程师解决测试难题。

243449d0-f863-11ee-9118-92fbcf53809c.jpg

图5 CANScope测试项目

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

    关注

    145

    文章

    1950

    浏览量

    130747
  • 数据帧
    +关注

    关注

    0

    文章

    46

    浏览量

    6741
  • can报文
    +关注

    关注

    0

    文章

    4

    浏览量

    2324
收藏 人收藏

    评论

    相关推荐

    CAN总线知识】全面了解CAN总线协议

    基本概念1.报文总线上的信息以不同格式的报文发送,但长度有限。当总线开放时,任何连接的单元均可开始发送一个新报文。2.信息路由在
    的头像 发表于 10-15 08:05 1467次阅读
    【<b class='flag-5'>CAN</b>总线知识】全面了解<b class='flag-5'>CAN</b>总线协议

    CAN总线的报文类型介绍

    CAN(Controller Area Network)总线是一种广泛使用的串行通信协议,特别适用于汽车和工业自动化领域。CAN总线上的报文类型主要可以分为以下几种,每种类型都有其特定的用途和格式。
    的头像 发表于 09-03 14:20 1557次阅读

    如何在CANtest上通过报文发送实现CCP指令的发送

    如题,我在CANtest上通过CAN报文发送了CCP指令\'CONNECT\'、\'SET-MTA\'和‘Upload’。前两个指令的返回均没有报错,可\'Upload\'的返回直接
    发表于 08-13 10:46

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

    、VB6.0、libTSCAN1关于Demo工程简要描述:VB6.0编程语言调用libTSCAN接口实现硬件扫描、连接、CAN报文单帧发送、周期发送
    的头像 发表于 07-27 08:21 742次阅读
    基于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

    如何通过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报文格式和发送总流程

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

    TC275多路CAN节点,报文接收时需要开启多路的CAN接收中断吗?

    TC275配置使用一路CAN0时,收发都可以,收报文是开启的CAN0接收中断,然后接收报文;现在使用两路CAN
    发表于 02-20 08:27

    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

    使用CYT2B75芯片CANFD模块无法发送消息是什么原因导致的呢?

    你好,我使用SDL的example中的CANFD代码测试CYT2B75芯片CANFD模块,对部分代码进行了硬件适配修改,详见附件,配置为每秒发送一次CAN报文。 问题:消息发送
    发表于 02-02 06:57