当前位置: 首页 > news >正文

CAN控制器工作模式与位时序配置实战指南

1. CAN控制器工作模式深度解析

在嵌入式系统,尤其是汽车电子和工业控制领域,控制器局域网(CAN)总线因其高可靠性和实时性而成为首选通信协议。一个稳定可靠的CAN网络,其基石在于CAN控制器的正确配置与使用。很多工程师在初次接触CAN时,往往只关注数据收发,而忽略了控制器本身丰富的工作模式。这些模式并非摆设,它们是开发、调试和部署阶段不可或缺的利器。今天,我就结合多年的实战经验,深入聊聊CAN控制器的几种关键工作模式,特别是环回模式和基础模式,以及如何通过它们来简化开发流程、定位棘手问题。

1.1 环回模式:硬件自检的利器

环回模式,顾名思义,就是让数据“自己发,自己收”。当你将CAN控制器配置为环回模式时,控制器内部会执行一个关键操作:它将发送引脚CANnTX的信号直接路由到接收引脚CANnRX的输入端。这意味着,控制器发送的每一帧报文,都会被自己当作来自总线的报文接收回来。

这个模式的核心价值在哪里?它实现了在完全不需要外部CAN节点或物理总线的情况下,对控制器本身的发送、接收、验收过滤以及中断逻辑进行完整的自检。想象一下,你正在开发一个全新的ECU(电子控制单元),PCB刚贴好,或者整个CAN网络尚未搭建完成,此时如何验证你的CAN驱动代码是否正确?环回模式就是答案。

具体配置通常通过设置控制器的测试寄存器(例如TI Tiva系列中的CANTST.LBACK位)来实现。一旦进入环回模式,控制器会忽略来自外部CANnRX引脚的实际电平,同时也会忽略应答错误(因为在自环中,没有其他节点来发送显性位应答)。你发送的报文只要通过了内部验收过滤(如果使能了的话),就会被存入接收缓冲区,并可以触发接收中断。这样,你只需在代码中启动发送,然后等待接收中断,并比对发送与接收的数据是否一致,即可验证从软件到控制器硬件的整个数据通路是否畅通无阻。

注意:环回模式下,你仍然可以在CANnTX引脚上用示波器或逻辑分析仪测量到实际的发送波形。这对于验证位时序配置是否正确(例如波特率、采样点)非常有帮助,相当于一个“自发自收”的信号发生器。

1.2 静默模式与环回静默组合模式

静默模式是另一个重要模式。在此模式下,控制器会断开内部收发器与CANnTX引脚的联系,并将CANnTX引脚强制置为隐性电平(逻辑1)。同时,控制器本身成为一个纯粹的“监听者”,它可以正常接收总线上的报文,但绝不会向总线上发送任何内容,包括错误帧或应答位。这常用于网络监控节点,或者用于检测总线是否出现持续显性错误(总线锁死)。

环回模式与静默模式的组合,则创造了一个更强大的调试环境。当同时设置LBACKSILENT位时,控制器行为如下:

  1. CANnRX引脚被断开,控制器不接收外部信号。
  2. CANnTX引脚被强制置为隐性电平,不影响外部总线。
  3. 控制器内部进行自发自收的环回操作。

这个组合模式的精妙之处在于,它让你可以在一个正在运行的、多节点的真实CAN网络旁,安全地、隔离地对单个节点进行完整的自测试。你的测试节点不会向真实总线发送任何干扰信号,因此不会影响其他节点的正常通信。同时,你又可以完整地验证该节点自身的CAN控制器功能、驱动逻辑和应用层协议处理是否正确。这在系统集成和现场问题排查阶段极其有用。

1.3 基础模式:轻量级通信与底层访问

基础模式为我们打开了另一扇门。通常,一个功能完整的CAN控制器会配备一块消息RAM(Message RAM),用于存储多个具有独立ID、掩码和属性的消息对象(Message Object)。这种邮箱结构非常高效,适合管理复杂的多帧通信。然而,在某些极端简单的应用场景下,或者在你希望以最直接的方式操作控制器时,消息RAM的管理机制可能显得有些“重”。

基础模式正是为了绕过这个消息RAM而设计。在此模式下(通过设置CANTST.BASIC位启用),控制器使用两组固定的接口寄存器(通常称为IF1和IF2)来直接进行数据收发。

  • 发送流程:你需要将待发送报文的ID、数据长度码(DLC)、数据场内容等,直接写入到发送接口寄存器(如CANIF1ARB1/2CANIF1MCTLCANIF1DAx/DBx)中。然后,通过置位CANIF1CRQ.BUSY来请求发送。控制器会在总线空闲时,自动将这些寄存器的内容加载到发送移位寄存器并开始发送。发送完成后,BUSY位会被硬件清零。在BUSY位置位期间,这些接口寄存器被锁定,防止软件误写。
  • 接收流程:接收接口寄存器(如CANIF2xxx系列)被用作接收缓冲区。当控制器接收到一帧报文时,会直接将移位寄存器中的内容转存到这些寄存器中,且不经过任何验收过滤。软件可以通过查询状态位或中断,来读取这些寄存器以获取报文内容。你也可以通过置位CANIF2CRQ.BUSY来手动触发一次从移位寄存器到接口寄存器的数据捕获,用于实时监控总线上的原始数据流。

基础模式的应用场景非常明确:

  1. 资源受限系统:对于ROM/RAM资源极其紧张的MCU,基础模式省去了管理消息RAM的代码开销。
  2. 协议分析或桥接工具:当你需要制作一个简单的CAN监控器或网关,需要捕获并转发所有报文(无过滤)时,基础模式非常直接。
  3. 底层驱动开发与调试:它提供了一种最接近硬件移位寄存器的操作方式,有助于深入理解CAN控制器的收发电平时序。

实操心得:在基础模式下,由于没有验收过滤,你会收到总线上所有的帧,包括错误帧。这要求你的应用软件必须具备更强的帧处理与过滤能力。同时,因为收发都依赖软件频繁操作寄存器,其通信效率和处理延迟通常不如使用消息RAM邮箱结构的中断驱动方式。因此,它更适合低波特率、低帧频或对实时性要求不高的场景。

1.4 发送控制功能:物理层诊断的“后门”

除了上述模式,CAN控制器通常还提供一个非常底层的“发送控制”功能。通过配置测试寄存器中的TX[1:0]字段,软件可以强行控制CANnTX引脚的电平状态:

  • 00:由CAN控制器正常驱动(用于正常通信和环回模式)。
  • 01:在采样点时刻输出一个显性脉冲。这主要用于在位定时测试中,监控内部采样点的精确位置
  • 10:强制驱动CANnTX为显性电平(逻辑0)。
  • 11:强制驱动CANnTX为隐性电平(逻辑1)。

后两种强制驱动功能,结合可读取的CANnRX引脚状态,构成了一个强大的物理层诊断工具。例如,你可以将节点从总线上断开,然后执行以下测试:

  1. 将自身CANnTX配置为强制显性,然后读取CANnRX,应读到显性。这可以测试本节点CAN收发器的驱动回路是否正常。
  2. 将自身CANnTX配置为强制隐性,然后读取CANnRX。如果总线上有其他节点正在驱动显性,CANnRX应读到显性;如果总线空闲,应读到隐性。这可以测试本节点CAN收发器的接收回路以及总线终端电阻、布线是否正常。

重要警告:发送控制功能会完全覆盖CAN协议功能。在正常报文传输、环回模式、静默模式或基础模式下,必须确保TX[1:0]字���被清除为00,否则控制器将无法进行正常的CAN通信。

2. 位时序配置:CAN网络稳定的数学基石

如果说工作模式是CAN控制器的“行为模式”,那么位时序配置就是决定其“生理节奏”的核心。一个配置不当的位时序,轻则导致通信偶尔出错、性能下降,重则使网络完全无法通信。很多间歇性的、难以复现的CAN通信故障,其根源往往就在于位时序参数配置的细微偏差。

2.1 位时间与波特率:从时钟到比特

CAN总线上的每一位(bit)的持续时间称为位时间(Bit Time)。位时间的倒数就是我们所熟悉的波特率(Bit Rate),例如1 Mbps的波特率对应1 µs的位时间。

关键在于,CAN网络中的每个节点都使用自己独立的时钟源(通常是MCU的系统时钟分频而来)。这些时钟的频率不可能完全一致,且会随着温度、电压和器件老化而漂移。CAN协议的精妙之处在于,它允许每个节点独立配置自己的位时间参数,只要最终计算出的标称位时间一致,节点间就能实现同步通信。这种同步能力,是通过一种名为“位同步”的机制来实现的,它能够动态微调每个位的采样点位置,以补偿节点间的时钟差异。

位时间被划分为四个不重叠的段,如下图所示:

| Sync_Seg | Propagation_Seg | Phase_Seg1 | Phase_Seg2 | |----------|-----------------|------------|------------| | 固定1tq | 可编程长度 | 可编程长度 | 可编程长度 | |<--------------- TSEG1 --------------->|<- TSEG2 ->| |<------------- 一个完整的位时间 (Nominal Bit Time) ------------>|
  • 同步段(Sync_Seg):固定为1个时间份额(Time Quantum, tq)。CAN协议规定,期望的位边沿(从隐性到显性或反之)应该发生在这个时间段内。这是所有节点进行硬同步的基准点。
  • 传播段(Propagation_Seg):用于补偿信号在CAN总线物理网络上的传输延迟。这个延迟包括发送器环路延迟、接收器环路延迟以及信号在双绞线上的传播延迟(约5 ns/m)。其长度必须是整数个tq。
  • 相位缓冲段1(Phase_Seg1)和相位缓冲段2(Phase_Seg2):这两个段位于采样点前后,用于吸收节点间的时钟相位误差。通过重同步机制,可以临时延长Phase_Seg1或缩短Phase_Seg2,来调整采样点的位置,确保在干扰下仍能在正确的位置采样位值。采样点(Sample Point)位于Phase_Seg1结束的时刻。

时间份额tq是整个位时间配置的基本单位,其计算公式为:tq = (BRP + 1) / f_CAN其中,BRP是波特率预分频器(Baud Rate Prescaler)的编程值,f_CAN是CAN控制器的输入时钟频率(通常来源于系统时钟)。

因此,一个位时间所包含的tq总数N为:N = 1 (Sync_Seg) + TSEG1 + TSEG2其中,TSEG1TSEG2是写入CANBIT寄存器的值,它们与实际段长的关系是:Phase_Seg1 = TSEG1 - Propagation_Seg + 1Phase_Seg2 = TSEG2 + 1。注意,很多控制器(如文档中提到的)要求写入的值是段长-1

2.2 同步跳转宽度:容错能力的调节器

同步跳转宽度(Synchronization Jump Width, SJW)定义了在一次重同步中,采样点可以被移动的最大tq数。它限制了控制器为了追赶总线边沿,所能调整的相位缓冲段的长度。SJW不能大于Phase_Seg1或Phase_Seg2中的较小者,通常协议规定其最大值为4。

SJW是网络鲁棒性的关键参数。一个较大的SJW意味着控制器能容忍更大的瞬时时钟偏差或更陡峭的边沿抖动,但过大的SJW会过度扭曲位波形,可能影响稳定性。通常,在波特率较高或网络环境较差时,需要适当增大SJW。

2.3 配置错误的深远影响

文档中特别警告:“即使位时序配置中的微小错误不会导致立即失败,CAN网络的性能也可能显著降低。” 这是最容易被忽视的一点。

一种常见的问题是采样点位置设置不合理。例如,采样点过于靠前(在相位缓冲段中占比太小),留给信号稳定和边沿补偿的余地就小,在电磁干扰下容易采样到错误的电平。更隐蔽的问题是,在仲裁期间,当两个或多个节点同时发送时,一个节点的采样点如果与其他节点偏差过大,可能导致它在仲裁中误判自己获胜,从而持续发送,最终被其他节点以错误帧轰下总线,使其错误计数增加,甚至进入“错误被动”或“总线关闭”状态。

这种错误是间歇性的、与数据负载和网络流量相关的,极难通过简单的发送-接收测试发现。它通常只在多节点、高负载、长距离的复杂网络环境中才会暴露出来。因此,位时序配置不是一项“配通了就行”的任务,而是一项需要精确计算和验证的工程。

3. 位时序参数计算实战指南

理论总是抽象的,我们通过两个典型的例子,来手把手计算位时序参数。这里以常见的CAN控制器寄存器映射为例,其CANBIT寄存器包含BRPSJWTSEG1TSEG2四个字段,需要写入的值是功能值-1

3.1 高速率场景计算(1 Mbps, CAN时钟25 MHz)

目标:在f_CAN = 25 MHz的系统下,实现1 Mbps的通信速率。

  1. 计算标称位时间t_bit = 1 / 1 Mbps = 1 µs
  2. 选择时间份额数N:通常,位时间包含8-25个tq。对于1 Mbps高速率,为了精度和稳定性,我们选择较少的tq数,例如N=10。则tq = t_bit / N = 1 µs / 10 = 100 ns
  3. 计算BRPBRP = tq * f_CAN - 1 = 100ns * 25MHz -1 = 2.5 - 1 = 1.5。BRP必须是整数,因此需要调整。我们重新选择N=8,则tq=125nsBRP=125ns*25MHz -1=3.125-1≈2(取整后为2)。验证:tq = (2+1)/25MHz = 120nst_bit = 8 * 120ns = 960ns ≈ 1.04 Mbps,误差在可接受范围。或者选择N=5tq=200nsBRP=200ns*25MHz-1=5-1=4。我们采用后者,因为它能整除,更精确:t_bit = 5 * 200ns = 1 µs, 完美。
  4. 估算传播段Prop:假设网络参数:驱动器延迟50ns,接收器延迟30ns,总线长度20米(延迟约100ns)。总物理延迟约180ns。Prop需要补偿这个延迟,并向上取整到tq的整数倍。180ns / 200ns = 0.9,向上取整为1 tq。所以Prop = 1 tq
  5. 分配相位缓冲段Sync_Seg固定为1 tq。剩余tq数给Phase_Seg1Phase_Seg2N - Sync - Prop = 5 -1 -1 = 3 tq。 通常希望采样点位于位时间的50%-90%之间,对于高速率,常设置在75%-80%左右。这里我们分配:Phase_Seg1 = 2 tqPhase_Seg2 = 1 tq。则采样点位于Sync + Prop + Phase_Seg1 = 1+1+2 = 4 tq处,即位时间的80%,这是一个合理的值。
  6. 计算TSEG1和TSEG2TSEG1 = Prop + Phase_Seg1 - 1 = 1 + 2 - 1 = 2TSEG2 = Phase_Seg2 - 1 = 1 - 1 = 0
  7. 确定SJWSJWmin(4, Phase_Seg1, Phase_Seg2) = min(4, 2, 1) = 1 tq。所以SJW寄存器值 = 1 - 1 = 0
  8. 汇总寄存器值BRP=4SJW=0TSEG1=2TSEG2=0。假设寄存器布局为[TSEG2, TSEG1, SJW, BRP],则CANBIT = (0<<12) | (2<<8) | (0<<6) | 4 = 0x0204

3.2 低速率场景计算(100 Kbps, CAN时钟50 MHz)

目标:在f_CAN = 50 MHz的系统下,实现100 Kbps的通信速率。

  1. 计算标称位时间t_bit = 1 / 100 Kbps = 10 µs
  2. 选择时间份额数N:选择N=20。则tq = t_bit / N = 10 µs / 20 = 500 ns
  3. 计算BRPBRP = tq * f_CAN - 1 = 500ns * 50MHz -1 = 25 - 1 = 24。验证:tq = (24+1)/50MHz = 500ns, 正确。
  4. 估算传播段Prop:假设网络参数:驱动器延迟200ns,接收器延迟80ns,总线长度100米(延迟约500ns)。总物理延迟约780ns。780ns / 500ns = 1.56,向上取整为2 tq。所以Prop = 2 tq
  5. 分配相位缓冲段:剩余tq数:N - Sync - Prop = 20 -1 -2 = 17 tq。分配给Phase_Seg1Phase_Seg2。为了使采样点位于位时间中后部(例如~85%),我们分配Phase_Seg1 = 11 tqPhase_Seg2 = 6 tq。采样点位于1+2+11=14 tq, 即70%处。对于低波特率,采样点可以稍靠前。
  6. 计算TSEG1和TSEG2TSEG1 = Prop + Phase_Seg1 - 1 = 2 + 11 - 1 = 12TSEG2 = Phase_Seg2 - 1 = 6 - 1 = 5
  7. 确定SJWSJWmin(4, Phase_Seg1, Phase_Seg2) = min(4, 11, 6) = 4 tq。所以SJW寄存器值 = 4 - 1 = 3
  8. 汇总寄存器值BRP=24SJW=3TSEG1=12TSEG2=5CANBIT = (5<<12) | (12<<8) | (3<<6) | 24。计算:TSEG2占3位(假设),120xC50x50x5<<12 = 0x50000xC<<8 = 0xC000x3<<6=0xC024=0x18。总和0x5000 + 0xC00 + 0xC0 + 0x18 = 0x5CD8。注意,文档中低速率例子给出的结果是0x34F1,这是因为其NProp和相位段分配与我的示例不同,但计算方法是相通的。

注意事项:以上计算中,Prop的估算至关重要。对于长距离网络,必须根据最坏情况下的信号往返延迟来计算。Phase_Seg2的长度必须大于控制器的信息处理时间(IPT,通常为0-2个tq)。在最终确定参数后,最好使用专业的CAN总线分析仪或带有CAN错误检测功能的工具,在实际网络负载下验证通信质量,特别是错误帧计数。

4. 关键寄存器详解与配置流程

理解了原理和计算后,我们来看看如何通过寄存器来具体配置。这里以典型寄存器为例进行说明。

4.1 控制与状态寄存器:模式切换与状态监控

  • CAN控制寄存器(CANCTL):这是控制器的总开关。

    • INIT位:置1使控制器进入初始化模式,在此模式下才能配置CANBIT等关键寄存器。配置完成后需清零以进入正常工作模式。
    • CCE位:配置更改使能位。只有在INIT=1CCE=1时,才能写入CANBIT寄存器。
    • TEST位:测试模式使能。置1后才能配置环回、静默等测试功能。
    • IESIEEIE:分别控制全局中断、状态变化中断(收发成功)和错误中断的使能。
  • CAN状态寄存器(CANSTS):这是系统的“仪表盘”。

    • LEC字段:记录最后一次发生的错误类型(位错误、格式错误、应答错误等)。软件可以通过写入0x7来手动清除此字段,以检测后续是否发生新错误。
    • TXOK/RXOK:成功发送/接收一帧后置位,需软件写0清除。
    • EWARN:当发送或接收错误计数器任一超过96(警告阈值)时置位。
    • EPASS:当错误计数器超过127,节点进入“错误被动”状态时置位。
    • BOFF:当发送错误计数器超过255,节点进入“总线关闭”状态时置位。此时控制器自动将INIT置1,停止一切总线活动。只有在软件清除INIT后,且控制器检测到总线连续出现11个隐性位(空闲)达129次后,才能恢复通信。

4.2 位时序寄存器(CANBIT)与配置流程

这是位时序配置的核心。配置必须遵循严格的流程:

  1. CANCTL.INIT置1,请求进入初始化模式。等待硬件确认进入(通常通过状态位)。
  2. CANCTL.CCE置1,允许配置位时序。
  3. 将计算好的BRPSJWTSEG1TSEG2值写入CANBIT寄存器。务必注意这些字段的取值是“功能值-1”
  4. 根据需要,配置其他寄存器(如验收过滤、中断使能等)。
  5. 清除CANCTL.CCE位(可选)。
  6. 清除CANCTL.INIT位,让控制器退出初始化模式,进入正常工作模式。

4.3 错误计数器与总线状态管理

CAN错误计数器寄存器(CANERR)包含了发送错误计数器(TEC)和接收错误计数器(REC)的当前值。根据CAN协议,节点的错误状态由这两个计数器决定:

  • 错误主动(Error Active):TEC和REC均小于128。节点可以正常发送和接收,检测到错误时发送主动错误标志(6个连续显性位)。
  • 错误被动(Error Passive):TEC或REC大于等于128。节点可以正常接收,但发送时只能发送被动错误标志(6个连续隐性位),且在发送帧后必须等待一段额外的“暂停发送”时间(8位)。
  • 总线关闭(Bus Off):TEC大于255。控制器自动断开与总线的连接,停止任何发送。必须经过完整的总线关闭恢复序列(129个总线空闲位)才能尝试重新加入网络。

监控这些计数器对于诊断网络健康状态至关重要。一个节点的REC持续增长,可能意味着它收到了大量格式错误或CRC错误的帧,可能是其本地波特率配置有误。一个节点的TEC快速增长,则可能意味着它发送的帧得不到应答(物理层断开),或持续在仲裁中失败(软件逻辑问题),或与其他节点位时序不匹配导致持续产生位错误。

5. 常见问题排查与实战技巧

在实际项目中,CAN通信问题千奇百怪。下面我整理了一份从易到难的排查清单和实战技巧。

5.1 基础通信失败排查

  1. 无通信,无波形

    • 检查物理连接:终端电阻(120Ω)是否在总线两端正确安装?用万用表测量CAN_H和CAN_L之间的电阻,应在60Ω左右。
    • 检查电源与地:确保所有节点共地。测量CAN收发器的电源电压是否正常。
    • 检查引脚配置:确认MCU的CAN_TX和CAN_RX引脚是否与外部CAN收发器的TXD和RXD正确交叉连接?这是一个常见的低级错误。
    • 检查初始化序列:是否严格按照INIT->CCE->配置->退出INIT的流程?配置后CANBIT寄存器值是否与计算一致?
  2. 有波形,但无法收发数据

    • 使用环回模式自检:这是最有效的第一步。将节点配置为环回模式,发送一帧数据,看是否能收到。如果环回成功,说明MCU的驱动、控制器配置基本正确,问题可能出在物理层或网络其他节点。
    • 检查波特率:用示波器测量一个节点发送的波形,计算位时间,看是否与配置的波特率相符。所有节点的波特率必须一致,且位时间各段比例应尽可能接近。
    • 检查验收过滤:是否因为验收过滤器的ID或掩码设置,导致目标帧被屏蔽?可以尝试在测试阶段关闭验收过滤(如果支持),或设置为接收所有帧。

5.2 间歇性错误与稳定性问题

  1. 偶尔出现错误帧

    • 重点检查位时序:特别是采样点SJW。采样点过于靠前或靠后都容易在干扰下出错。使用CAN分析仪(如Vector CANalyzer, PEAK-System PCAN-View)可以实时监控总线错误帧计数和类型,并测量实际采样点。
    • 检查总线负载:过高的总线负载(>70%)可能导致缓冲区溢出或仲裁失败概率增加。优化报文发送周期和优先级。
    • 检查电磁兼容性:总线布线是否远离强干扰源?是否使用了双绞线并良好屏蔽?单点接地是否可靠?
  2. 特定节点频繁进入“错误被动”或“总线关闭”

    • 检查该节点的TEC/REC:通过读取错误计数器寄存器,判断是发送错误多还是接收错误多。发送错误多,检查其发送驱动能力、位时序;接收错误多,检查其本地时钟精度、位时序以及是否处于��络拓扑的末端(信号反射)。
    • 进行“听诊器”测试:将问题节点设置为静默模式,让它只接收。观察其错误计数器是否还在增长。如果停止增长,说明问题可能出在该节点的发送环节。如果继续增长,说明问题在接收环节或网络环境。
    • 对比分析:用示波器同时抓取问题节点和另一个正常节点的TX、RX波形,对比时序差异。

5.3 高级调试技巧

  1. 利用发送控制功能诊断物理层:如前所述,强制驱动TX为显性或隐性,配合读取RX,可以逐段排查本节点收发器、隔离电路、总线连接器的好坏。
  2. 计算网络的极限长度与速率:根据最慢节点的时钟容差和你配置的位时序参数(特别是PropSJW),利用文档中给出的振荡器容差公式,可以反推出在当前配置下,网络所能容忍的最大时钟偏差。这有助于你判断选择的晶振精度是否满足要求。
  3. 关注总线空闲恢复:节点从总线关闭状态恢复需要检测到129个连续的总线空闲位(11个隐性位)。如果总线上有持续的低级干扰,这个恢复过程可能会被不断打断。监控CANSTS.LEC字段,如果在恢复期间频繁读到Bit 0 Error(期望隐性却读到显性),说明总线可能存在持续显性干扰(如某节点损坏,TX对地短路)。

配置CAN控制器,尤其是位时序,是一项融合了理论计算和工程经验的工作。没有一套参数能放之四海而皆准。最好的方法是:先根据理论计算和器件数据手册推荐值进行初步配置,然后务必在目标硬件和实际网络环境中,使用专业工具进行充分的压力测试和长期稳定性测试。记录下不同配置下的错误帧统计,找到那个在速度、稳定性和容错性之间最佳平衡点的“甜蜜点”。这个过程可能有些繁琐,但它是构建一个坚固可靠的CAN通信系统的必经之路。

http://www.jsqmd.com/news/1241000/

相关文章:

  • 从 0 到生产级:2026 年 6 大 AI Agent 框架横评,附架构对比与落地避坑
  • 露易丝·海的诗歌16
  • Spring Boot与Kafka实现分布式事务的实践方案
  • 嵌入式系统硬件CRC控制器:原理、模式与工程实践详解
  • 预算有限不用选进口,高适配涡街流量计国产品牌盘点 - 仪表人老张
  • 教你制作一场最美大学生军训照摄影大赛投票活动! - 速递信息
  • 数组常用API + 在线筛选列表案例(完整可运行)
  • 企业级漏洞挖掘实战:从SRC入门到DevSecOps体系建设
  • 2026年7月沈阳经济纠纷律师推荐:10家知名律所实力派,用案例说话 - 信息热点
  • Data Agent 来了,企业花几年建的 BI 真能接得住吗?
  • VS2022 编译SOEM
  • 亲子沟通总词不达意?98.7%准确率的录音转写工具帮你复盘对话,让爱不再误解
  • 打破传统防护瓶颈,构筑企业全域Web安全壁垒
  • 【华为OD机试真题 新系统】8、挑选宝石 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)
  • 校园闲置资源转换与共享平台的设计与实现
  • 固定长度、递归字符、语义分块和结构分块怎么选?RAG Chunk策略对比
  • 2026沈阳回收朗格、江诗丹顿高端腕表指南,逸程支持私密上门,全款实时转账 - 融媒生活
  • 大通区中考低分逆袭!2026淮南职业技术学校:75年公办名校就在九龙岗,准军事化管理,家长更放心 - 我叫小周
  • HDMI音频传输实战:从寄存器配置到音画同步的完整指南
  • 黑咖啡如何提升健身效果:科学原理与实用指南
  • TM4C129以太网MAC PPS与DMA寄存器配置实战指南
  • 分布式系统中的资源分配:从边缘计算到中心化平台的价值流动
  • 深入解析MibSPI多缓冲RAM与奇偶校验机制:提升SPI通信可靠性与效率
  • SpringBoot3+Vue3+MySQL 药店管理系统源码 前后端分离实战项目
  • VMware 下 Ubuntu 无法粘贴
  • 前端性能优化项目复盘:Lighthouse评分从45到95的系统性治理经验
  • Unity Addressables内存管理五大误区解析与避坑指南
  • 柱形图的数据可视化原理与工程实践
  • 深入解析ADC转换组:多通道采样、触发机制与高级应用实战
  • Web Audio API实现浏览器端音频录制与处理