TM4C123 CAN控制器模式配置与位时序调校实战指南

发布时间:2026/7/23 6:23:00
TM4C123 CAN控制器模式配置与位时序调校实战指南 1. 项目概述在嵌入式系统开发尤其是汽车电子和工业控制领域控制器局域网CAN总线是连接各个智能节点的“神经系统”。它的稳定与否直接决定了整个系统的可靠性。很多工程师在项目初期往往把精力集中在应用层协议设计上却容易忽略底层通信的基石——CAN控制器的模式配置与位时序调校。我见过不少项目在实验室里点对点通信一切正常一旦挂到真实的长距离、多节点网络上就会出现间歇性的丢帧、错误帧甚至整个节点“离线”排查起来费时费力。问题的根源常常就藏在工作模式的选择和那几个看似简单的位时序参数里。今天我们就以德州仪器TI的Tiva™ TM4C123系列微控制器为例深入聊聊CAN控制器的几种关键工作模式Loopback, Silent, Basic到底该怎么用以及如何像老中医“把脉”一样精准地计算出适合你当前硬件环境的位时序参数。这不是一份照本宣科的寄存器手册翻译而是结合了我多年在车载控制器和工业网关开发中踩过的坑、总结出的经验希望能帮你从“能用”走向“用得稳、用得明白”。2. CAN控制器核心工作模式深度解析CAN控制器的工作模式决定了它如何与物理总线交互是进行模块自检、系统调试和故障诊断的利器。TM4C123的CAN控制器主要通过CANTST测试寄存器来配置这些模式。2.1 回环模式硬件自检的利器回环模式是开发初期最常用的功能之一。当你手头只有一个CAN节点或者不想连接真实总线就能测试CAN控制器收发功能是否正常时它就成了首选。工作原理与配置 在回环模式下控制器内部将发送引脚CANnTX的信号直接路由到接收引脚CANnRX的输入端。这意味着控制器自己发送的每一帧报文都会被自己当作来自总线的报文接收回来。要启用此模式只需将CANTST寄存器中的LBACK位设置为1。这里有一个至关重要的细节为了确保自测试的独立性控制器在此模式下会忽略应答错误。在标准的CAN通信中发送节点会在帧的“应答间隙”位监听总线如果至少有一个其他节点在此期间拉低总线显性位则表示发送成功。但在回环模式下由于没有其他真实节点这个位永远是隐性逻辑1本应产生应答错误。控制器特意忽略此错误使得自发自收的流程能够顺利完成。同时控制器完全无视外部CANnRX引脚的实际电平但你仍然可以在CANnTX引脚上用示波器或逻辑分析仪监测到发出的波形这为硬件链路检查提供了便利。典型应用场景与实操心得驱动验证在编写或移植CAN底层驱动时首先在回环模式下测试。你可以编写代码让控制器发送一帧数据然后立即在接收中断或轮询中检查是否能收到相同ID和数据的内容。这是验证发送、接收、中断、缓冲区操作等软件逻辑是否正确的最快方法。硬件隔离测试当怀疑是外部CAN收发器如TJA1050或总线物理层出现故障时可以先将控制器设置为回环模式。如果此时自发自收正常则基本可以断定MCU内部的CAN控制器和软件驱动是好的问题出在外部电路或总线上。注意事项回环模式不能用于测试总线的负载能力、不同节点间的仲裁、真正的错误处理机制如错误帧生成与恢复。它只是一个“自说自话”的封闭测试环境。2.2 静默模式总线上的“隐形监听者”静默模式有时也叫“监听模式”。在此模式下控制器可以接收总线上的报文但自身绝不会向总线发送任何内容包括数据帧、远程帧、过载帧甚至错误帧。它的CANnTX引脚会始终保持隐性高电平状态。工作原理与配置 单独启用静默模式是通过设置CANTST寄存器的SILENT位。此时控制器成为一个纯粹的接收器。这对于分析总线流量、进行网络监控而不干扰现有系统运行至关重要。例如你想在正在运行的汽车CAN网络上接入一个诊断工具就必须确保你的工具节点不会因为软件bug而向总线乱发报文静默模式就是这道安全锁。2.3 回环与静默组合模式安全的闭环测试这是回环模式和静默模式的结合体通过同时设置LBACK和SILENT位来启用。这是最安全、最推荐的自测试模式。工作逻辑 在此模式下控制器内部处于回环状态同时物理上断开与外部总线的主动连接。具体表现为CANnRX引脚与内部控制器逻辑断开外部总线信号无法进入。CANnTX引脚被强制驱动为隐性电平对外呈现高阻态取决于收发器确保不会向真实总线输出任何显性位干扰。为什么说它最安全想象一下你的开发板通过CAN收发器连接着一条正在控制重要设备如电机、阀门的活跃总线。如果你错误地只使用了普通回环模式而软件又配置失误理论上控制器仍然能通过CANnTX影响总线。但在组合模式下CANnTX被钳位物理上杜绝了干扰总线的任何可能性。你可以在完全不影响生产线或车辆运行的情况下安心地调试你的CAN节点代码。2.4 基本模式绕过消息RAM的直通操作基本模式是一个相对底层的调试模式通过设置CANTST寄存器的BASIC位启用。在此模式下控制器绕过了通常用于存储多个报文对象的“消息RAM”而是直接使用两套接口寄存器CANIF1和CANIF2作为唯一的发送和接收缓冲区。发送流程将待发送报文的数据、ID、控制信息等写入CANIF1系列寄存器。设置CANIF1CRQ寄存器的BUSY位为1发起发送请求。此时CANIF1寄存器组会被锁定。控制器等待总线空闲然后将CANIF1的内容加载到内部移位寄存器并开始发送。发送完成后硬件自动清除BUSY位释放CANIF1寄存器锁。接收流程控制器接收到一帧报文后会不经任何验收过滤直接将其内容从移位寄存器转存到CANIF2寄存器组。同时你也可以随时通过设置CANIF2CRQ的BUSY位手动触发一次将当前移位寄存器内容转存到CANIF2的操作用于实时监控总线上的原始数据流。应用价值与局限价值基本模式剥离了消息对象管理的复杂性让你可以以最直接的方式与CAN控制器的核心收发引擎交互。它非常适合用于理解CAN协议底层时序、调试硬件问题或者编写极简的、不需要复杂邮箱管理的演示代码。局限由于没有验收过滤你会收到总线上所有的报文需要软件进行筛选。同时它缺乏标准模式下消息对象提供的自动重传、中断掩码等高级功能不适合用于实际的多报文、高可靠性的应用场景。可以把它看作一个“裸奔”的调试接口。2.5 发送控制功能物理层诊断的“手术刀”CANTST寄存器中的TX[1:0]字段提供了对CANnTX引脚的软件直接控制这是一个强大的硬件诊断工具。00: 正常模式引脚由CAN控制器协议逻辑控制。01: 采样点监控模式。控制器会在位采样时刻将采样到的电平值输出到CANnTX引脚方便用示波器观察实际采样点位置是调试位时序的终极手段。10: 强制输出显性位逻辑0。11: 强制输出隐性位逻辑1。后两种模式结合读取CANnRX引脚的状态可以构成一个简单的“总线短路测试”或“收发器故障检测”工具。例如你可以强制CANnTX输出显性位然后读取CANnRX如果读回的不是显性位则可能意味着TX到RX之间的通路包括外部收发器存在开路或故障。重要警告TX[1:0]的测试功能会干扰所有CAN协议功能。只要TX[1:0]不为00控制器就无法进行正常的报文收发也无法进入回环、静默或基本模式。在启用任何通信模式前务必确保TX[1:0]已清零。3. 位时序配置CAN网络稳定的数学基石如果说工作模式是“策略”那么位时序就是“内功”。配置不当的位时序是导致CAN网络在复杂电磁环境或长距离传输下不稳定的罪魁祸首。它直接决定了网络的最大通信距离和节点时钟容差。3.1 位时间分解四个段的故事一个CAN位时间被划分为四个连续的段它们共同作用确保所有节点能在正确的时间点对总线电平进行采样。同步段固定为1个时间份额。期望的边沿从隐性到显性或反之应该出现在此段内。如果边沿出现在此段之外则产生相位误差。传播时间段用于补偿信号在物理总线上的传输延迟。这个延迟包括发送节点收发器的环路延迟、信号在双绞线上的传播延迟约5ns/米、接收节点收发器的延迟。此段长度必须大于等于整个网络的最大环路延迟。相位缓冲段1 相位缓冲段2这两个段位于采样点前后用于吸收节点间由于时钟源微小差异带来的相位误差。通过“再同步”机制可以临时微调这两个段的长度将采样点“拉回”正确位置。采样点位于相位缓冲段1结束之时。时间份额是这些段的基本时间单位其计算公式为tq (BRP) / fsys。其中BRP是波特率预分频器在CANBIT寄存器中配置fsys是CAN控制器的系统时钟频率。3.2 寄存器映射与参数计算在TM4C123中位时序参数通过CANBIT寄存器配置。这里有一个关键点硬件对寄存器值的解释是“编程值 功能值 - 1”。功能参数描述可编程范围寄存器字段编程值计算BRP波特率预分频器1-64 (可扩展)BRP[5:0]BRP - 1Sync同步段1 tq (固定)无固定Prop传播时间段1-8 tq包含在TSEG1中Prop - 1Phase1相位缓冲段11-8 tq包含在TSEG1中Phase1 - 1Phase2相位缓冲段21-8 tqTSEG2[2:0]Phase2 - 1SJW再同步跳转宽度1-4 tqSJW[1:0]SJW - 1其中TSEG1寄存器字段对应的是Prop Phase1的总时间份额数。因此TSEG1编程值 (Prop Phase1) - 1TSEG2编程值 Phase2 - 1一个位时间的总时间份额数 (TSEG1编程值 1) (TSEG2编程值 1) 1 TSEG1 TSEG2 33.3 位时序参数计算实战指南计算位时序不是简单的数学题而是一个在多个约束条件下寻找最优解的过程。下面结合手册中的例子拆解其计算逻辑。已知条件与目标CAN控制器时钟频率fsys 25 MHz目标波特率bit_rate 1 Mbps目标位时间t_bit 1 / bit_rate 1 µs网络物理参数总线驱动器延迟t_drv 50 ns接收电路延迟t_rcv 30 ns总线长度40m信号传播速度按5.5 ns/m估算延迟t_line 40 * 5.5 220 ns计算步骤详解步骤1确定总传播延迟和Prop段总环路传播延迟t_prop_delay 2 * (t_drv t_rcv) t_line。为什么要乘以2因为信号要从发送节点A传到接收节点B再让B的应答信号传回AA才能确认总线状态。这是最坏情况。t_prop_delay 2*(50ns 30ns) 220ns 160ns 220ns 380nsProp段必须大于等于这个值。我们取整到下一个时间份额的整数倍。但此时我们连tq都还不知道。所以我们需要先假设一个总时间份额数。步骤2估算总时间份额数和tqCAN位时间通常由8-25个tq组成。对于1Mbps的高速总线为了精度我们倾向于使用较少的tq。假设总时间份额数n 8~12。 则tq t_bit / n 1µs / n。 我们需要tq * Prop t_prop_delay。先假设n10则tq100ns那么Prop至少需要380ns / 100ns 3.8 - 4 tq。 剩下给Sync Phase1 Phase2的是10 - 4 6 tq。Sync固定占1 tq所以Phase1 Phase2 5 tq。通常两者相等或相差1可以设为Phase12, Phase23或Phase13, Phase22。 但手册例子中取了更激进的n5我们来验证其合理性。步骤3跟随手册例子的计算流程确定总tq数t_bit 1 µs 选择n 5 tq。则tq t_bit / n 200 ns。计算BRPtq BRP / fsysBRP tq * fsys 200ns * 25MHz 5。编程值 5 - 1 4。计算Prop段总传播延迟t_prop_delay 380 ns。需要Prop_tq 380ns / 200ns 1.9取整为2 tq。所以Prop 2 tq。分配剩余时间份额总5 tq减去Sync (1 tq)和Prop (2 tq)剩余2 tq给Phase1 Phase2。两者通常相等故Phase1 1 tq,Phase2 1 tq。计算TSEG1和TSEG2TSEG1 Prop Phase1 2 1 3 tq。编程值 3 - 1 2。TSEG2 Phase2 1 tq。编程值 1 - 1 0。计算SJWSJW应取min(4, Phase1, Phase2) min(4, 1, 1) 1 tq。编程值 1 - 1 0。得到寄存器值BRP4,SJW0,TSEG12,TSEG20。组合到CANBIT寄存器中位域TSEG2[14:12],TSEG1[11:8],SJW[7:6],BRP[5:0]得到0x0204。为什么取n5在满足Prop延迟要求的前提下使用更少的tq意味着每个tq更长对时钟精度的要求相对宽松后面会讲。但tq也不能太少否则相位缓冲段没有调整空间。n5是满足1Mbps和给定延迟条件下的一个较优解它在速度和稳定性之间取得了平衡。3.4 振荡器容差计算你的晶振够准吗这是很多工程师会忽略的一步。CAN总线要求所有节点以相同的标称波特率工作但每个节点的晶振都有误差。位时序配置决定了网络能容忍多大的时钟误差。计算公式df ≤ min( Phase1, Phase2 ) / [ 2 * (13 * t_bit - Phase2) ]其中df是单个节点的振荡器频率相对误差。以上述1Mbps配置为例t_bit1µs,Phase1Phase21tq200ns,Phase2在式中取时间值200ns。df ≤ 200ns / [2 * (13*1µs - 200ns)] 200ns / [2 * (13000ns - 200ns)] 200ns / 25600ns ≈ 0.0078 0.78%这意味着为了在这个1Mbps、40米总线、n5 tq的配置下稳定工作每个节点的晶振频率误差必须小于±0.78%。这是一个比较严格的要求。如果使用精度为±1%的普通晶振就可能出现同步失败导致偶尔的错误帧。如何改善增加总时间份额数n在t_bit不变的情况下增加n会减小tq从而增加Phase1和Phase2的tq数即使时间长度不变或变化不大。从上式分母看t_bit固定增加Phase2的tq数即数值使分母略微减小但分子min(Phase1, Phase2)以tq数计增加通常能显著提高容差。代价是tq分辨率下降。使用更高精度的振荡器如±0.5%或更好的温补晶振。降低波特率或缩短总线距离减少t_prop_delay从而可以减少Prop段为Phase1/2分配更多tq。手册中的100Kbps例子由于位时间长达10µs在n10 tq的配置下Phase1Phase24tq4µs计算出的容差远大于1%因此对晶振要求非常宽松。3.5 配置流程与注意事项进入初始化模式配置位时序前必须将CANCTL寄存器的INIT和CCE位均置1。INIT使控制器停止通信CCE允许写入CANBIT寄存器。计算并写入CANBIT根据上述方法计算BRP、TSEG1、TSEG2、SJW的编程值并写入CANBIT寄存器。退出初始化模式清除CANCTL寄存器的INIT位CCE位会自动清零。控制器等待11个连续的隐性位总线空闲后开始使用新的位时序参数进行同步和通信。验证配置完成后可以通过发送测试帧并监控错误计数器CANERR寄存器或使用示波器观察采样点位置如果支持来验证配置是否合理。4. 关键寄存器详解与编程实战理解了原理最终要落到代码上。TM4C123的CAN控制器寄存器较多我们聚焦与模式和时序最相关的几个。4.1 控制与状态寄存器掌控全局CANCTL (控制寄存器)INIT位写1进入初始化模式停止通信允许配置CANBIT等。配置完成后写0恢复正常。CCE位配置更改使能。只有在INIT1时将此位置1才能写CANBIT。TEST位写1使能测试模式才能使用CANTST寄存器配置回环、静默等功能。DAR位禁用自动重传。调试时可用于防止一个错误帧导致控制器不断重发阻塞总线。IE,SIE,EIE分别控制全局中断、状态中断发送/接收成功、错误中断的使能。CANSTS (状态寄存器)LEC[2:0]最后一次错误代码。这是最重要的调试信息之一。它会指示发生的是位错误、格式错误、应答错误还是CRC错误。读取后成功传输一帧会自动清零也可软件写0x7来手动复位。TXOK,RXOK成功发送/接收标志位需软件写0清除。EWARN错误计数器警告标志任一错误计数器96。EPASS错误被动状态标志任一错误计数器127。BOFF总线关闭状态标志发送错误计数器255。这是一个严重状态控制器会自动进入初始化模式并需要执行总线关闭恢复序列。重要特性CANSTS寄存器是读敏感的。读取该寄存器会自动清除CANINT中断标识寄存器中对应的中断挂起标志。这意味着你的中断服务程序ISR通常需要读取CANSTS来获取状态并清除中断源。4.2 测试与位时序寄存器功能核心CANTST (测试寄存器)BASIC,SILENT,LBACK分别控制基本模式、静默模式、回环模式。TX[1:0]如前所述控制CANnTX引脚功能。正常通信时必须为00。CANBIT (位时序寄存器)BRP[5:0]波特率预分频器编程值。SJW[1:0]再同步跳转宽度编程值。TSEG1[3:0]传播段与相位缓冲段1之和的编程值。TSEG2[2:0]相位缓冲段2的编程值。4.3 编程示例初始化与模式配置以下是一个基于TM4C123 DriverLib库的示例代码片段展示了如何初始化和配置CAN控制器。#include stdint.h #include stdbool.h #include inc/hw_memmap.h #include driverlib/can.h #include driverlib/sysctl.h void CAN_InitAndConfig(void) { uint32_t ui32SysClock; tCANBitClkParms sBitClkParms; // 1. 使能CAN控制器和外设时钟 SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN0); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); // 假设CAN0使用PB4/PB5 // 等待外设就绪 while(!SysCtlPeripheralReady(SYSCTL_PERIPH_CAN0)); // 2. 配置GPIO引脚为CAN功能 GPIOPinConfigure(GPIO_PB4_CAN0RX); GPIOPinConfigure(GPIO_PB5_CAN0TX); GPIOPinTypeCAN(GPIO_PORTB_BASE, GPIO_PIN_4 | GPIO_PIN_5); // 3. 初始化CAN控制器进入初始化模式 CANInit(CAN0_BASE); // 4. 配置位时序参数 (以1Mbps, 系统时钟25MHz为例) ui32SysClock SysCtlClockGet(); // 获取系统时钟频率假设已配置为25MHz sBitClkParms.ui32SyncPropPhase1Seg 3; // TSEG1 Prop Phase1 3 tq sBitClkParms.ui32Phase2Seg 1; // TSEG2 Phase2 1 tq sBitClkParms.ui32SJW 1; // SJW 1 tq sBitClkParms.ui32QuantumPrescaler 5; // BRP 5 // 计算并设置位时序函数内部会处理“编程值功能值-1”的转换 CANBitTimingSet(CAN0_BASE, sBitClkParms); // 5. 配置回环模式用于自测试 CANTestModeSet(CAN0_BASE, CAN_TEST_LBACK); // 或者配置为回环静默组合模式更安全 // CANTestModeSet(CAN0_BASE, CAN_TEST_LBACK | CAN_TEST_SILENT); // 6. 退出初始化模式开始正常运行 CANEnable(CAN0_BASE); // 此函数会清除INIT位 // 7. 可选配置中断 CANIntEnable(CAN0_BASE, CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS); // ... 注册中断服务程序等 } // 在回环模式下进行自发自收测试的函数 bool CAN_LoopbackSelfTest(void) { tCANMsgObject sTxMessage; uint32_t pui32MsgData[2]; // 准备发送消息 sTxMessage.ui32MsgID 0x123; // 标准ID sTxMessage.ui32MsgIDMask 0; sTxMessage.ui32Flags MSG_OBJ_TX_INT_ENABLE; // 使能发送中断 sTxMessage.ui32MsgLen 8; pui32MsgData[0] 0x11223344; pui32MsgData[1] 0x55667788; sTxMessage.pui8MsgData (uint8_t *)pui32MsgData; // 发送消息 CANMessageSet(CAN0_BASE, 1, sTxMessage, MSG_OBJ_TYPE_TX); // 此处应等待发送完成中断或轮询状态 // 在中断服务程序或轮询中检查是否收到ID为0x123数据相同的数据帧 // ... return true; // 简化返回 }5. 常见问题排查与调试技巧实录即使按照手册配置在实际硬件调试中依然会遇到各种问题。下面是一些典型问题及排查思路。5.1 节点无法通信或错误帧频发现象可能原因排查步骤完全无通信总线电平一直为隐性约2.5V或显性0V。1. CAN控制器未正确初始化INIT位未清零。2. 位时序配置错误节点无法同步。3. 波特率与其他节点不一致。4. 物理层故障终端电阻缺失、总线短路/开路、收发器供电或使能问题。1. 检查CANCTL寄存器INIT位是否为0。2. 使用示波器测量总线波形看是否有正常的差分信号。对比发送波形与理论位宽。3. 确保所有节点CANBIT配置计算正确特别是BRP和fsys。4. 测量CANH、CANL对地电压。空闲时应均为2.5V左右压差为0。检查120Ω终端电阻是否在总线两端正确连接。能发送但收不到应答或自己发出的帧自己也收不到非回环模式。1. 应答错误。发送节点未在ACK间隙看到显性位。2. 节点处于“静默模式”或“总线关闭”状态。3. 验收过滤设置过于严格屏蔽了收到的报文。1. 检查CANSTS的LEC字段看是否为ACK错误0x3。2. 检查CANSTS的BOFF位和CANTST的SILENT位。3. 检查接收消息对象的掩码和标识符设置。可先设置为接收所有报文掩码全0进行测试。间歇性出现错误帧LEC显示位错误或式错误。1. 位时序配置不合理采样点位置不佳在边沿附近采样。2. 总线电磁干扰严重。3. 节点时钟误差过大超出网络容限。1.这是最可能的原因。重新计算位时序确保Prop段覆盖了最大延迟并留出足够的相位缓冲段。尝试将采样点后移增加Phase1减少Phase2通常采样点在位时间的75%-90%之间较为稳健。2. 检查布线确保使用双绞线远离电源等干扰源。3. 测量节点晶振实际频率计算误差是否在容差范围内。5.2 回环模式测试正常但正常模式失败这个问题非常典型它几乎将问题范围锁定在物理层或与其他节点的交互上。检查物理连接回环模式不经过外部收发器。如果回环成功但正常模式失败首先怀疑CAN收发器电路、总线终端电阻和布线。用万用表测量收发器的VCC、GND、STB使能引脚用示波器对比控制器CANnTX引脚和收发器CANH/CANL输出看波形是否正常转换。检查模式设置确认已从回环模式LBACK1切换回正常模式LBACK0,SILENT0,TX[1:0]00。一个常见的疏忽是在回环测试后忘记清除CANTST寄存器的TEST位或调用库函数退出测试模式。只要TEST1控制器就处于测试模式可能影响正常功能。验证总线多节点仲裁回环模式不测试仲裁。在正常多节点网络中确保你的节点ID是唯一的并且软件处理了发送失败仲裁丢失的情况。5.3 位时序配置的“软”故障这类问题最隐蔽表现为长时间工作后偶发错误或在温度变化时出现通信不稳定。采样点过于靠前如果Phase1太短采样点靠近位起始位置此时信号可能还未稳定振铃容易采样到错误值。增加Phase1将采样点向后推移。传播段时间不足Prop段必须大于等于网络最大环路延迟。如果总线很长或节点很多需要重新计算延迟并增加Prop即增加TSEG1。一个粗略估算信号在双绞线中传播速度约为光速的2/3即~0.2米/纳秒。40米总线单程延迟约200ns环路延迟约400ns这还不算收发器延迟。SJW设置过小SJW决定了每次再同步可以调整的最大相位。如果节点间时钟偏差较大SJW太小可能无法完全补偿相位误差导致累积误差最终引发错误。在满足SJW ≤ min(Phase1, Phase2)的前提下可以适当增大SJW。使用工具辅助如果条件允许使用专业的CAN总线分析仪如Vector CANalyzer, PEAK PCAN-View等可以直观地看到总线负载、错误帧统计、甚至解码出的报文并能进行“比特率检测”帮你验证实际波特率是否与预设一致。5.4 调试心得寄存器查看与信号测量善用调试器查看寄存器在IDE的调试模式下实时查看CANSTS、CANERR、CANINT等寄存器。CANERR中的发送错误计数器TEC和接收错误计数器REC的变化趋势能告诉你错误是发生在发送侧还是接收侧是持续恶化还是偶发事件。测量关键信号CANnTX(MCU引脚)在发送时应能看到标准的数字波形其高低电平时间比例应符合你配置的位时序。CANH/CANL(总线侧)在空闲时应为2.5V左右压差0V。显性位时CANH约3.5VCANL约1.5V压差2V。用示波器的双通道差分测量功能或直接测量CANH-CANL的波形最为准确。采样点测量配置CANTST寄存器的TX[1:0]01进入采样点监控模式。此时CANnTX引脚会在内部采样点时刻输出采样到的总线电平。用示波器同时测量CANnTX和CANH/CANL差分信号可以精确看到采样点在位时间中的实际位置这是调试位时序的“金标准”。配置CAN控制器尤其是位时序是一个需要理论计算结合实践验证的过程。没有一套参数能放之四海而皆准必须根据你的具体硬件晶振精度、收发器延迟、PCB布局和网络环境总线长度、节点数量、干扰情况进行调整。开始时可以借鉴参考设计或成熟项目的配置但在遇到稳定性问题时一定要有能力回归到基本原理从延迟、容差这些根本约束出发进行量化的分析和计算。记住稳定的CAN通信是可靠嵌入式系统的基石多花些时间在底层配置上是绝对值得的。