ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

CANFD发送失败排查:BRS位配置错误与收发器不匹配的坑

CANFD发送失败排查:BRS位配置错误与收发器不匹配的坑 1. 问题现场还原一个让人抓狂的CANFD发送失败案例那天下午产线测试台的同事跑过来找我说有一块域控制器样件的CANFD报文死活发不出来。现象很典型用CANoe挂上总线Trace窗口里能看到其他节点的心跳报文在正常滚动唯独我们这块板子的报文一条都刷不出来。硬件同事量了波形CAN_H和CAN_L的差分电平正常终端电阻也对收发器供电也没问题。软件同事查了代码发送函数的返回值是成功的邮箱也没有报busy。这就很诡异了。物理层没问题协议层看起来也没问题但报文就是上不了总线。我接手之后第一件事是打开CANoe的Trace窗口把过滤条件清掉然后盯着看。果然总线上只有其他节点的报文我们的节点像是被总线静音了一样。后来我让软件同事把CANFD的配置参数截图发过来一眼就看到了问题BRS位被勾选了但数据段的波特率配置和仲裁段不一致而且收发器的型号根本不支持CANFD的数据段高速率。把BRS取消之后报文立刻正常发送。这个坑其实非常典型。很多刚接触CANFD的工程师看到FD两个字就觉得一定要把BRS打开才能发挥CANFD的优势结果忽略了BRS背后的硬件约束和配置一致性要求。这篇文章我就把这个问题的来龙去脉拆开讲清楚包括BRS到底是什么、为什么勾错了会导致发送失败、怎么一步步排查、以及在实际项目中怎么配置才稳妥。如果你正在用CANoe、周立功USB转CANFD接口卡、或者自己在GD32F5这类MCU上配CANFD外设这篇文章应该能帮你省下不少调试时间。2. CANFD与BRS先把基础概念捋清楚2.1 CANFD到底快在哪里传统CAN的痛点很明显最高1Mbps的波特率单帧最多8字节数据。在现在动辄几十个ECU、上百条报文的整车网络里这个带宽早就不够用了。CANFDCAN with Flexible Data-rate就是在这个背景下出来的它主要做了两件事第一数据段可以跑更高的波特率。仲裁段还是用原来的速率比如500kbps但数据段可以切到2Mbps、5Mbps甚至更高。这样仲裁的时候大家速率一致不会乱传数据的时候又能提速。第二单帧数据长度扩展到64字节。原来8字节要拆成好几帧发的数据现在一帧就能搞定协议开销大大降低。这两点加起来CANFD的有效带宽比传统CAN能高出好几倍。但注意这两个特性是独立的你可以只用64字节长帧而不提速也可以只提速而不用长帧当然也可以两个都用。2.2 BRS位速率切换的开关BRS全称是Bit Rate Switch直译就是波特率切换。它位于CANFD帧的控制段里是一个单独的位。这个位的作用非常直接BRS 0整帧都用仲裁段的波特率传输数据段不提速。BRS 1从数据段开始切换到数据段波特率传输到CRC段再切回仲裁段波特率。你可以把BRS理解成一个变速开关。仲裁段大家都要听所以必须用统一的低速数据段只有发送方和接收方在传可以偷偷加速。但这里有个关键点很多人会忽略BRS只是一个请求切换的标志位真正能不能切、切到多少取决于收发器和控制器的硬件能力。如果收发器不支持CANFD的高速数据段或者控制器配置的数据段波特率和收发器不匹配那这个BRS位就是一颗定时炸弹。2.3 为什么BRS勾错了会发送失败发送失败的表现形式其实有好几种很多人只盯着发不出去这一种其实还有更隐蔽的第一种控制器直接拒绝发送。有些CANFD控制器在初始化时会校验配置如果发现数据段波特率配置非法比如超过了控制器支持的上限或者收发器反馈不支持发送请求会被直接丢弃邮箱一直处于pending状态。第二种发送出去了但总线报错。控制器把帧发到总线上但因为数据段波特率实际跑不起来波形畸变其他节点采样错误触发错误帧发送方收到错误计数增加最终进入错误被动甚至总线关闭状态。第三种发送成功但接收方收不到。这种情况最坑发送方Trace里能看到帧发出去了但接收节点因为BRS处理逻辑不一致把帧当成错误帧丢掉了。我遇到的那次属于第二种和第三种的混合控制器把帧发出去了但因为收发器不支持数据段高速率波形在数据段严重畸变总线上其他节点疯狂报错最后我们的节点错误计数飙升发送直接失败。3. 排查思路从现象到根因的完整链路3.1 第一步确认物理层没有问题排查任何总线问题第一步永远是物理层。别急着看代码先把示波器或者CAN分析仪挂上去看波形。具体要看这几个点CAN_H和CAN_L的静态电平隐性状态下应该是2.5V左右显性状态下CAN_H约3.5V、CAN_L约1.5V。如果静态电平就不对先查收发器供电和终端电阻。终端电阻CAN总线两端各需要一个120欧姆的终端电阻并联后是60欧姆。用万用表断电测CAN_H和CAN_L之间的电阻应该是60欧姆左右。如果是120欧姆说明只接了一端如果是40欧姆说明接多了。波形质量用示波器看差分信号上升沿和下降沿是否干净有没有明显的振铃或者过冲。如果波形本身就不好后面协议层怎么调都是白搭。这一步的目的是排除硬件根本没通这种低级问题。我见过太多人一上来就怀疑协议配置结果查了半天发现是终端电阻没接。3.2 第二步确认仲裁段通信正常物理层没问题之后先确认仲裁段能不能正常通信。做法很简单把BRS关掉数据段波特率设成和仲裁段一样然后发一帧试试。如果这样能发出去说明仲裁段的配置、收发器的基础功能、总线的电气特性都是OK的。问题就锁定在数据段的高速切换上。如果这样还是发不出去那问题就不在BRS而在更基础的配置上比如控制器的时钟配置对不对波特率分频参数算得对不对采样点设置是否合理收发器的工作模式引脚有没有拉对这一步是分水岭能帮你快速判断问题范围。3.3 第三步检查BRS与数据段波特率的匹配确认仲裁段正常之后再把BRS打开但数据段波特率先设一个比较保守的值比如1Mbps或者2Mbps。如果这个能通说明BRS机制本身没问题只是之前设的速率太高了。如果设成保守值还是不通那就要检查收发器是否支持CANFD普通CAN收发器比如TJA1050是不支持CANFD数据段高速率的必须用CANFD专用收发器比如TJA1044、TJA1051、MCP2551的FD版本等。收发器的数据手册里会明确写支持的最高数据速率。控制器的数据段波特率配置不同MCU的CANFD外设配置方式不一样。以GD32F5为例它的CANFD外设需要分别配置仲裁段和数据段的波特率预分频、时间段1、时间段2等参数。这些参数算错了数据段就跑不起来。采样点一致性CANFD对采样点的要求比传统CAN更严格。仲裁段和数据段的采样点都要在合理范围内通常75%到80%而且所有节点的采样点要尽量一致。如果发送方和接收方采样点差太多高速数据段很容易采样错误。3.4 第四步用CANoe的Trace和Statistics窗口定位CANoe是排查这类问题的利器但很多人只会看Trace窗口的报文列表忽略了其他有用的信息。Trace窗口把过滤条件清掉看总线上有没有错误帧。CANoe会把错误帧用红色标出来鼠标悬停能看到错误类型。如果是位填充错误、CRC错误、格式错误基本能定位到是数据段的问题。Statistics窗口这里能看到总线的错误计数、总线负载、帧统计等信息。如果错误计数在飙升说明总线上有节点在疯狂报错。Bus Statistics能看到具体的错误类型分布。比如Stuff Error多说明位填充有问题CRC Error多说明数据段传输有误码Form Error多说明帧格式不对。Hardware配置在CANoe的Hardware菜单里能看到通道的详细配置包括仲裁段波特率、数据段波特率、采样点等。确认这里的配置和实际硬件一致。我那次就是通过Statistics窗口看到错误计数飙升然后结合Trace窗口的错误帧位置定位到是数据段的问题。4. 实操配置以CANoe和周立功接口卡为例4.1 CANoe里的CANFD通道配置在CANoe里配置CANFD通道路径是Configuration-Hardware-Network Hardware Configuration。选中对应的CAN通道点Setup。关键参数有这几个Baudrate (Arbitration)仲裁段波特率常见500kbps。Baudrate (Data)数据段波特率常见2Mbps或5Mbps。Sample Point (Arbitration)仲裁段采样点建议80%。Sample Point (Data)数据段采样点建议75%到80%。BRS是否启用波特率切换。这个勾选框就是本文的主角。这里有个细节CANoe的采样点是用百分比表示的但底层实际是配置时间段1和时间段2的比值。如果你用的是周立功的USB转CANFD接口卡它的配置工具里可能是直接填时间段参数。两者要对应上。4.2 周立功USB转CANFD接口卡的使用要点周立功的USBCANFD系列接口卡在国内用得很广性价比高。使用的时候有几个坑要注意第一固件版本要匹配。不同批次的接口卡固件版本可能不一样老固件可能不支持某些CANFD特性。用之前先去官网查一下最新固件该升级就升级。第二配置工具里的BRS选项。周立功的配置工具里通常有启用BRS的勾选框勾上之后还要填数据段波特率。如果数据段波特率填得超过了接口卡支持的上限工具可能会报错也可能默默接受但实际跑不起来。第三终端电阻。周立功的接口卡有的内置120欧姆终端电阻有的需要外接。用之前确认一下如果总线上已经有终端电阻了接口卡的就不要再接否则并联后阻值不对。第四通道映射。周立功的接口卡通常是双通道或者四通道配置的时候要确认CANoe里选的通道和实际接线一致。我见过有人接的是CAN2但CANoe里配的是CAN1查了半天以为是BRS的问题。4.3 GD32F5的CANFD配置要点如果你是在GD32F5这类MCU上自己配CANFD外设那BRS的处理就更需要小心。GD32F5的CANFD外设配置大致分这几步第一步配置时钟。CANFD外设的时钟源要选对分频系数要算准。时钟不准波特率就不准。第二步配置仲裁段波特率。设置预分频、时间段1、时间段2、同步跳转宽度。以500kbps为例假设时钟是40MHz预分频设4时间段1设15时间段2设4同步跳转宽度设1算下来波特率是40M / 4 / (1 15 4) 500kbps。第三步配置数据段波特率。同样的逻辑但参数不一样。以2Mbps为例预分频设2时间段1设7时间段2设2同步跳转宽度设1算下来是40M / 2 / (1 7 2) 2Mbps。第四步配置帧格式。在发送帧的时候要设置FD帧标志和BRS标志。如果BRS标志置1控制器就会在数据段切换到数据段波特率。第五步配置收发器。如果用的是分立收发器要确认收发器的使能引脚、模式引脚都配置正确。有些收发器有专门的FD使能引脚不拉高的话数据段高速率跑不起来。这里最容易出错的是波特率参数计算。很多人直接抄别人的配置但时钟源不一样算出来的实际波特率就不对。一定要自己根据时钟频率算一遍。5. 常见问题速查表与避坑经验5.1 常见问题速查表现象可能原因排查方法解决方式报文完全发不出去仲裁段配置错误关闭BRS数据段用仲裁段速率试发检查时钟、分频、采样点发送后总线报错数据段波特率过高降低数据段波特率到1Mbps试确认收发器支持的最高速率发送成功但接收方收不到BRS处理不一致检查接收方是否支持CANFD统一收发双方的BRS配置错误计数飙升采样点不匹配用CANoe Statistics看错误类型调整采样点到75%-80%偶发发送失败终端电阻不匹配断电测CAN_H和CAN_L电阻确保总线两端各120欧姆接口卡无响应固件版本过旧查官网最新固件升级接口卡固件CANoe Trace无报文通道映射错误确认CANoe通道和实际接线重新映射通道5.2 避坑经验BRS不是越开越好很多人有个误区觉得CANFD既然支持高速数据段那就一定要把BRS打开不然就浪费了CANFD的能力。这个想法是错的。BRS开不开取决于你的实际需求和硬件能力。如果总线上有节点不支持CANFD或者收发器不支持高速数据段那BRS就必须关掉否则整个网络都通信不了。如果只是传一些短报文数据段提速带来的收益有限反而增加了配置复杂度和出错概率那也可以先不开。我的建议是新项目先用BRS0跑通全链路确认物理层、协议层、应用层都没问题之后再逐步开启BRS并提高数据段波特率。这样出问题的时候能快速定位是BRS引入的还是其他环节的问题。5.3 避坑经验采样点要对齐CANFD对采样点的敏感度比传统CAN高得多。传统CAN在500kbps下采样点差个5%可能还能凑合但CANFD数据段跑到2Mbps甚至5Mbps采样点差一点就可能导致采样错误。实操中我一般会这样做仲裁段采样点统一设80%数据段采样点统一设75%所有节点的时钟频率尽量一致避免因为时钟偏差导致采样点漂移用CANoe的Bus Statistics看错误分布如果Stuff Error多优先调采样点还有一个细节同步跳转宽度SJW不要设得太小。SJW的作用是允许节点在检测到边沿时调整自己的位时间补偿时钟偏差。设得太小时钟稍微偏一点就同步不上。一般设1到2个时间份额比较稳妥。5.4 避坑经验别忽略收发器的隐藏参数收发器的数据手册里除了波特率还有几个参数容易被忽略环路延迟Loop Delay收发器从TX输入到总线输出再从总线输入到RX输出有一个环路延迟。CANFD数据段速率越高这个延迟占位时间的比例越大。如果环路延迟太大数据段的位时间就不够用采样会出错。对称性Symmetry收发器输出波形的上升沿和下降沿对称性要好。不对称会导致占空比失真高速下容易采样错误。共模电压范围CANFD对共模电压的要求比传统CAN更严格。如果总线上有多个节点共模电压不一致高速数据段容易出问题。选收发器的时候一定要看数据手册里明确标注支持CANFD和支持的最高数据速率。别拿普通CAN收发器硬上CANFD。6. 从根因出发如何设计一个稳妥的CANFD配置流程6.1 配置流程的四个阶段经过这次排查我总结了一套CANFD配置的流程分四个阶段阶段一硬件确认。确认所有节点的收发器都支持CANFD确认总线拓扑和终端电阻正确确认接口卡固件版本最新。阶段二基础通信。所有节点先关闭BRS数据段用仲裁段速率跑通基础通信。这一步的目的是排除物理层和基础协议层的问题。阶段三逐步提速。开启BRS数据段波特率先设1Mbps跑通后升到2Mbps再升到5Mbps。每升一次都用CANoe的Statistics窗口观察错误计数确认稳定后再继续。阶段四压力测试。在所有节点都跑通之后做长时间的压力测试观察是否有偶发错误。CANFD在高速下的偶发错误往往和温度、电压、线缆长度有关需要在实际工况下验证。6.2 参数计算的通用公式不管用什么MCUCANFD的波特率计算逻辑是一样的波特率 时钟频率 / 预分频 / (1 时间段1 时间段2) 采样点 (1 时间段1) / (1 时间段1 时间段2)其中时间段1和时间段2的单位是时间份额Tq。同步跳转宽度SJW一般设1到2个Tq。以时钟40MHz、目标波特率2Mbps为例预分频设2则Tq 2 / 40M 50ns位时间 1 / 2M 500ns 10个Tq时间段1 时间段2 9如果采样点设75%则时间段1 7时间段2 2验证40M / 2 / (1 7 2) 2Mbps采样点 8 / 10 80%注意采样点算出来是80%不是75%。因为时间段1包含了同步段。这个细节很多人会算错。6.3 用Python脚本批量验证配置如果你要配多个节点手动算参数容易出错。我一般会写个Python脚本批量算def calc_canfd_baudrate(clock_hz, prescaler, tseg1, tseg2): tq prescaler / clock_hz bit_time tq * (1 tseg1 tseg2) baudrate 1 / bit_time sample_point (1 tseg1) / (1 tseg1 tseg2) return baudrate, sample_point clock 40_000_000 for prescaler in range(1, 10): for tseg1 in range(1, 20): for tseg2 in range(1, 10): baud, sp calc_canfd_baudrate(clock, prescaler, tseg1, tseg2) if abs(baud - 2_000_000) 1000 and 0.75 sp 0.80: print(fPrescaler{prescaler}, TSEG1{tseg1}, TSEG2{tseg2}, Baud{baud:.0f}, SP{sp:.2%})这个脚本能帮你快速找到所有满足目标波特率和采样点范围的参数组合然后从中选一个预分频和时间段都比较整的。6.4 CANoe的自动化测试脚本如果你用CANoe做自动化测试可以用CAPL或者Python通过COM接口来控制报文发送和错误监控。比如用Python控制CANoe发送CANFD报文import win32com.client canoe win32com.client.Dispatch(CANoe.Application) canoe.Open(rC:\path\to\config.cfg) canoe.Measurement.Start() # 获取总线对象 bus canoe.Bus # 发送CANFD报文BRS1 msg bus.Messages.Add(TestMsg, 0x100, 8, 1) # 1表示CANFD msg.BRS True msg.Data [0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08] msg.Send() canoe.Measurement.Stop()这个脚本只是示例实际用的时候要根据CANoe的版本和配置调整。重点是在自动化测试里BRS的开关要作为测试用例的一个变量分别测试BRS0和BRS1的情况确保两种配置下都能正常通信。7. 几个容易被忽略的细节7.1 CANFD帧的DLC编码CANFD的DLC编码和传统CAN不一样。传统CAN的DLC就是数据长度0到8。CANFD的DLC是0到15但对应的数据长度不是线性的DLC数据长度0-80-8字节912字节1016字节1120字节1224字节1332字节1448字节1564字节如果你在代码里直接把数据长度赋给DLC比如想发12字节就写DLC12那就错了。DLC12对应的是24字节。这个坑在调试长帧的时候特别容易踩。7.2 CANFD的CRC字段CANFD的CRC字段比传统CAN长而且根据数据长度不同CRC的位数也不一样。数据长度小于16字节时用17位CRC大于16字节时用21位CRC。这个细节在排查CRC错误的时候要注意。7.3 错误帧的格式CANFD的错误帧格式和传统CAN也有区别。传统CAN的错误帧是固定的6个显性位CANFD的错误帧在数据段可能更长。用CANoe抓错误帧的时候要注意区分是仲裁段的错误还是数据段的错误。7.4 总线关闭后的恢复如果节点因为错误计数过高进入总线关闭状态恢复时间是有规定的。传统CAN是128次11位隐性位后恢复CANFD的恢复时间可能更长。在调试的时候如果节点突然不发了先看看是不是进入了总线关闭状态。8. 写在最后的一些个人体会这次排查花了大半天最后发现是BRS配置和收发器不匹配的问题。说起来简单但中间走了不少弯路。我最大的体会是CANFD的调试一定要有分层排查的思路。物理层、仲裁段、数据段、应用层一层一层往上查每层都确认没问题了再往上走。别一上来就怀疑最复杂的部分很多时候问题就出在最基础的配置上。另外BRS这个位虽然小但它牵扯的东西很多收发器能力、控制器配置、采样点、时钟精度、总线拓扑。任何一个环节不匹配都可能导致发送失败。所以在新项目里我一般会把BRS相关的配置单独列一个检查清单每次改配置都过一遍。最后分享一个小技巧如果你不确定BRS该不该开就先关掉。关掉BRS的CANFD帧本质上就是一个数据长度扩展到64字节的传统CAN帧兼容性最好调试也最简单。等基础通信跑通了再逐步开启BRS提速。这样即使出问题也能快速定位是BRS引入的而不是其他环节的锅。
返回列表