Tiva C系列CAN驱动开发:消息对象与FIFO缓冲配置实战
2026/7/27 7:18:21 网站建设 项目流程

1. 项目概述:从寄存器手册到实战配置

如果你正在开发基于Tiva C系列微控制器的CAN总线应用,比如车载ECU、工业网关或者机器人关节控制器,那么你肯定绕不开消息对象和FIFO缓冲这两个核心概念。手册上那几十页关于CANIFnMSK1CANIFnARB2EOBNEWDAT寄存器的描述,读起来就像天书,更别提还要把它们组合成一个能稳定跑起来的通信节点了。

我最早接触CAN驱动开发时,也在这堆寄存器配置上栽过跟头。配置错了,节点要么收不到数据,要么疯狂报错,调试起来让人头皮发麻。后来经过几个项目的打磨,我才慢慢摸清了TI这套CAN控制器的门道。它的设计其实非常精巧,通过一套统一的“消息对象”抽象,配合两个接口寄存器组(IF1和IF2),就能灵活地实现从简单单帧收发到复杂FIFO缓冲队列的所有功能。关键在于,你不能孤立地看某个寄存器,必须理解它们在整个数据流中的角色和联动关系。

这篇文章,我就结合手册里的核心章节,拆解消息对象的配置逻辑、验收过滤的掩码玩法,以及如何用多个消息对象搭建一个高效的FIFO缓冲区。我会避开那些照本宣科的翻译,直接告诉你每个配置步骤背后的意图、常见的坑点,以及我在实际项目中验证过的配置代码片段。无论你是要配置一个接收特定ID的传感器数据,还是要处理来自多个节点的周期性广播消息,这里面的思路都能直接套用。

2. 核心机制解析:消息对象、接口寄存器与消息RAM

在深入配置细节之前,我们必须先理清TI CAN控制器的硬件架构。否则,配置寄存器就像在黑暗中摸索,知其然不知其所以然。

2.1 消息对象:通信的基本单元

你可以把消息对象理解为一个预定义好的“信箱”。每个信箱有固定的容量(最多8字节数据)和一套专属的“管理规则”。Tiva的CAN控制器最多提供32个这样的信箱(消息对象1到32)。每个消息对象在物理上对应着消息RAM中的一块存储区域,这块区域存储了以下关键信息:

  • 标识符:这个信箱的“地址”。可以是11位标准ID或29位扩展ID。
  • 控制字:定义了这个信箱的行为模式,比如是用于发送还是接收,是否启用中断,是否属于一个FIFO缓冲区等。
  • 数据:实际存放的8字节数据。
  • 状态位:如NEWDAT(新数据到达)、INTPND(中断挂起)、TXRQST(发送请求)等,用于硬件自动管理通信状态。

消息对象的编号(1-32)本身隐含了优先级。消息对象1的优先级最高,消息对象32的优先级最低。这个优先级用于控制器内部仲裁:当多个消息对象同时请求发送时,编号小的会先被处理。请注意,这个优先级独立于CAN总线仲裁。总线仲裁是基于消息ID的数值,数值小的ID优先级高。而消息对象编号优先级是控制器内部调度发送顺序的机制。举个例子,即使消息对象2的CAN ID比消息对象1的CAN ID数值更小(总线优先级更高),如果它们同时请求发送,控制器依然会先发送消息对象1的内容。

2.2 接口寄存器:CPU与消息RAM的桥梁

CPU不能直接读写消息RAM。所有操作都必须通过两套完全相同的接口寄存器来完成:CANIF1CANIF2。你可以把它们想象成两个通往消息RAM的“传送带”或“工作台”。

  • 作用CANIF1CANIF2寄存器组是CPU配置和访问消息对象的唯一窗口。你想设置某个消息对象的ID、掩码、数据,或者读取收到的数据,都必须先把相关参数写入对应的接口寄存器,然后通过一个“执行”命令,让消息处理器将数据搬移到目标消息对象中,或者从目标消息对象中读取到接口寄存器。
  • 为何有两套:为了提高效率,支持流水线操作。例如,你可以用IF1寄存器组准备下一个要配置的消息对象参数,同时用IF2寄存器组读取上一个已接收消息的数据,两者互不干扰。
  • 核心寄存器组:每套接口寄存器都包含以下关键部分:
    • 命令请求寄存器:指定要操作的消息对象编号。
    • 命令掩码寄存器:指定要执行的操作类型(读/写)以及要更新消息对象的哪些部分(如数据、仲裁场、控制位等)。
    • 仲裁寄存器:存放消息标识符和方向位。
    • 掩码寄存器:存放验收过滤用的掩码。
    • 消息控制寄存器:存放数据长度、中断使能、缓冲区结束标志等控制信息。
    • 数据寄存器:存放8字节的载荷数据。

2.3 消息处理器:默默无闻的搬运工

消息处理器是一个硬件状态机,它负责在CAN总线事件(如收到帧、发送完成)和消息RAM之间同步数据,并根据消息对象的配置自动更新状态位(如设置NEWDAT)。当CPU通过接口寄存器发起操作时,消息处理器就执行实际的读写动作。这种设计让CPU从繁琐的位时序和缓冲区管理中解放出来,只需关注高层逻辑。

理解了这三者的关系,我们再来看配置流程,就会清晰很多:CPU通过接口寄存器“吩咐”消息处理器,去对消息RAM中某个编号的消息对象进行“布置”或“查看”

3. 消息对象的详细配置流程

手册给出了配置发送和接收消息对象的步骤。这里我以更常见的接收消息对象为例,详细拆解每一步,并补充手册里没明说的“潜规则”。

3.1 第一步:下达命令意图

首先,我们需要告诉消息处理器:“我接下来要写一个消息对象,请准备好”。这是通过配置CANIFnCMASK寄存器实现的。

这个寄存器就像一个多功能开关,每一位控制着在后续“执行”命令时,哪些部分会被写入消息对象。对于接收配置,我们通常需要写入仲裁场(ID)、控制场和数据场(虽然接收时数据场是只读的,但配置时通常也会选择写入以初始化)。一个典型的配置如下:

  • WRNRD位:必须设置为1,表示这是一次“写”操作。
  • MASK位:设置为0x07。这表示:
    • DATA_ADATA_B位为1:允许更新数据寄存器部分(即使初始数据为0)。
    • ARB位为1:允许更新仲裁寄存器(即写入我们要接收的ID)。
    • CONTROL位为1:允许更新消息控制寄存器。
    • CLRINTPNDTXRQST位通常保持为0,在接收配置中不需要。

注意WRNRD位非常关键。如果你配置了半天发现不生效,第一个要检查的就是这里。写操作是1,读操作是0,千万别搞反了。我曾在调试时因为疏忽将其设为0,导致配置根本无法写入消息RAM,排查了很久。

3.2 第二步:设置验收过滤的“筛子”

验收过滤是CAN控制器减轻CPU负载的核心功能。它允许硬件在接收时,只将符合特定规则的帧存入消息对象,不符合的直接丢弃。这个规则由CANIFnMSK1CANIFnMSK2CANIFnARB1CANIFnARB2共同决定。

掩码寄存器的原理: 掩码寄存器中的每一位,对应着仲裁寄存器中标识符的每一位。掩码位为1,表示“这一位我需要严格匹配”;掩码位为0,表示“这一位我不关心,是0是1都可以接收”。

例如,假设我们使用11位标准ID,并设置:

  • 仲裁寄存器CANIFnARB2ID[28:18]位(对应标准ID[10:0])为0x5A0(二进制101 1010 0000)。
  • 掩码寄存器CANIFnMSK2MSK[12:2]位为0x7FF(二进制111 1111 1111)。

这意味着所有11位ID都必须完全等于0x5A0的帧才会被接收。这是一种精确匹配。

如果我们把掩码改为0x7E0(二进制111 1110 0000),即低5位掩码为0。那么,只要ID的高6位是101 101(即0x5A),低5位任意,都会被接收。这样,我们就实现了一个ID组过滤,可以接收0x5A00x5AF这个范围内的所有ID。

配置要点

  1. UMASK:这是总开关!在CANIFnMCTL寄存器中。只有将UMASK位置1,你在MSK寄存器中设置的掩码规则才会生效。否则,控制器会接收所有消息,失去过滤功能。这是新手最容易忽略的一点。
  2. MXTDMDIR:这两个位在CANIFnMSK2寄存器中。它们分别控制是否对扩展标识符位(XTD)和方向位(DIR)进行过滤。如果你只处理标准帧,通常将MXTD设为1(要求XTD=0),MDIR设为0(不关心方向)。如果处理扩展帧,需要根据实际情况设置。
  3. 掩码值0x0000:手册提到,将掩码设置为0x00会使所有消息通过过滤。这在调试初期非常有用,可以先把所有数据收上来,确认物理层通信正常。

3.3 第三步:设定要接收的标识符

这一步是配置CANIFnARB1CANIFnARB2寄存器。

  • ID[28:0]位:填入你要接收的29位扩展ID,或左对齐后的11位标准ID(标准ID放在ID[28:18]位)。
  • XTD位:1表示扩展帧,0表示标准帧。
  • DIR位:对于接收对象,必须清零,表示这是一个接收邮箱。
  • MSGVAL位:必须置1。这个位是消息对象的“使能”开关。只有MSGVAL=1的消息对象才会被消息处理器纳入管理。很多配置失败是因为忘了置位这个标志。

3.4 第四步:精细控制消息对象行为

这是配置的核心,在CANIFnMCTL寄存器中完成:

  • DLC[3:0]:设置期望接收的数据帧长度。即使实际接收的帧长度小于此值,也会按此长度在数据寄存器中呈现,不足部分为未定义值。通常设置为8
  • EOB位:单消息对象必须置1。表示这是一个独立的消息对象,不是FIFO缓冲区的一部分。这是区分单对象和FIFO的关键。
  • RXIE位:接收中断使能。如果置1,当该消息对象成功接收到一帧数据后,INTPND位会被硬件自动置1,从而可能产生中断(需配合全局中断使能)。根据你的应用需求(轮询还是中断)决定是否开启。
  • UMASK位:如前所述,使能掩码过滤。
  • RMTEN位:远程帧使能。对于普通的数据接收对象,通常清零。如果置位,当收到匹配的远程帧时,控制器会自动将该对象的TXRQST位置位,触发一次数据回复。这在主从问答式通信中会用到。

重要警告:手册特别强调,在配置过程中,要小心不要意外设置NEWDATMSGLSTINTPNDTXRQST这些状态位。这些位应由硬件或特定的软件操作来管理。在初始化配置时,确保它们为0。

3.5 第五步:执行配置

最后,将目标消息对象的编号写入CANIFnCRQ寄存器的MNUM字段。这个写操作就像一个“执行”按钮,消息处理器会立刻根据CANIFnCMASK的指示,将当前接口寄存器组(CANIFnARB,CANIFnMCTL,CANIFnDAT等)中的内容,写入消息RAM中编号为MNUM的消息对象里。

至此,一个接收消息对象就配置完成了。一旦总线上出现符合过滤条件的帧,它就会被自动存入该对象,并置位NEWDAT

4. FIFO缓冲机制的构建与应用

当需要处理来自同一ID或同一ID组的高速、连续数据流时(例如,接收一个传感器的周期性高速采样数据),单个消息对象可能不够用。因为如果CPU来不及读取,新数据就会覆盖旧数据(如果NEWDAT已置位),导致丢帧。这时,就需要FIFO缓冲机制

4.1 FIFO的本质:串联的消息对象链

FIFO缓冲并不是一个独立的硬件模块,而是通过软件配置,将多个消息对象逻辑上串联起来形成的一个队列。第一个进入队列的数据放在编号最小的消息对象里,依次向后填充。

配置FIFO的关键步骤

  1. 选择多个连续的消息对象:例如,将消息对象10、11、12、13配置成一个4帧深度的FIFO。
  2. 统一配置:这些消息对象必须具有完全相同的标识符和掩码设置。这样,它们才能响应同一个CAN ID。
  3. 设置EOB位:这是核心。队列中最后一个消息对象(编号最大)的EOB位必须置1,而前面所有消息对象的EOB位必须清零EOB=0告诉控制器:“我不是终点,后面还有兄弟”。EOB=1则标识了队列的末尾。
  4. 利用隐式优先级:由于消息对象编号小的优先级高,在硬件存储时,会优先使用编号最小的、且NEWDAT位为0(空闲)的消息对象。这自然形成了FIFO的“队首”。

4.2 数据流与CPU读取策略

写入过程

  1. 当一帧匹配的数据到达,消息处理器从为这个FIFO分配的消息对象中,寻找编号最小的、NEWDAT=0的那个。
  2. 将数据存入,并置位该对象的NEWDAT
  3. 由于它的EOB=0,该对象会被“锁定”,消息处理器不会再向它写入,直到CPU读取并清除了NEWDAT
  4. 下一帧数据到来,会存入下一个编号的、NEWDAT=0的消息对象。
  5. 如果数据到达速度过快,CPU来不及读取,所有前面的对象NEWDAT都为1,那么数据只会被写入最后一个EOB=1的对象,并不断覆盖。这会触发MSGLST(消息丢失)标志。

读取过程: CPU读取FIFO时,必须从编号最小的对象开始顺序读取。这是保证数据顺序的关键。

  1. 读取消息对象N:通过接口寄存器,将对象N的内容读到CPU,并在命令掩码寄存器中设置CLRINTPND位,以在读取的同时清除该对象的NEWDATINTPND。这一步非常重要,它释放了该消息对象,使其可以接收新数据。
  2. 检查EOB位:读取后,检查该对象的EOB位。如果EOB=0,说明它不是队列末尾,应该继续读取下一个对象N+1。如果EOB=1,说明已读到队列末尾,本次读取完成。
  3. 顺序保证:手册明确指出,由于硬件总是寻找NEWDAT=0的最小编号对象进行写入,而CPU按顺序读取和释放,因此FIFO中消息的物理存储顺序可能与接收顺序不完全一致。但通过这种“顺序读、顺序释放”的软件策略,可以从逻辑上保证先入先出的顺序。

4.3 中断处理与FIFO

对于FIFO,通常只需使能第一个消息对象(编号最小)的接收中断(RXIE)。当该对象收到数据时产生中断,CPU进入中断服务程序后,按上述顺序读取整个FIFO,直到遇到EOB=1的对象。在读取每个对象时,通过设置CLRINTPND来清除中断标志。

5. 中断处理与测试模式

5.1 中断处理机制

CAN控制器的中断源主要分为两类:状态中断消息中断

  • 状态中断:由CANSTS寄存器的变化引起,如错误警告(EWARN)、总线关闭(BOFF)、错误码(LEC)变化等。优先级最高。
  • 消息中断:由某个消息对象的INTPND位置位引起。多个消息中断同时发生时,消息对象编号小的优先级高

中断处理流程

  1. 判断中断源:读取CANINT寄存器。其INTID字段指示最高优先级的中断源。0x0000表示无中断,0x8000表示状态中断,1-32表示对应编号的消息对象中断。
  2. 处理消息中断
    • 根据INTID值,将对应的消息对象编号写入CANIFnCRQ,将其内容加载到接口寄存器。
    • 在写入CANIFnCRQ前,先配置CANIFnCMSK寄存器,通常设置CLRINTPND位为1。这样,在读取消息数据的同时,硬件会自动清除该消息对象的INTPNDNEWDAT位,既读取了数据又完成了中断响应。
    • 也可以读取CANMSGnINT寄存器来查看所有中断挂起的消息对象位图。
  3. 处理状态中断:读取CANSTS寄存器即可清除状态中断标志。

注意:全局中断使能位CANCTL.IE是总开关。即使某个消息对象的RXIE或状态中断使能位(SIE,EIE)已打开,如果IE=0,也不会向CPU产生中断请求,但CANINT寄存器依然会更新,可以通过轮询方式检查。

5.2 测试模式:强大的自检与调试工具

测试模式通过设置CANCTL.TEST位进入,提供了多种离线调试和自检功能,极大方便了开发。

  • 静默模式:设置CANTST.SILENT=1。在此模式下,CAN控制器只接收,不发送任何显性位(包括ACK位、错误帧)。它像一个“监听者”,完全不影响总线。常用于总线监控或分析网络流量,而不用担心自己的节点干扰网络。
  • 环回模式:设置CANTST.LBACK=1。控制器将自身发送的报文直接环回到接收端,并存入消息对象(如果通过验收过滤)。它忽略来自总线的ACK。这是最常用的自检方式,可以在不连接其他CAN节点的情况下,完整测试本节点的软硬件:应用程序发送一帧数据,然后能在自己的接收邮箱里收到这帧数据,说明从CPU到CAN控制器、驱动器的整个路径是通的。
  • 环回+静默模式:同时设置LBACKSILENT。此时控制器与外部物理总线断开,在内部进行环回测试,完全不影响外部运行的总线系统。适合在系统在线时进行自我诊断。
  • 基本模式:设置CANTST.BASIC=1。此模式绕过消息RAM,直接使用CANIF1寄存器作为发送缓冲区,CANIF2寄存器作为接收缓冲区。没有验收过滤,报文直接搬运。它简化了通信过程,适用于最底层的驱动调试或性能测试。

使用建议:在驱动开发初期,强烈建议先使用环回模式验证你的基础发送和接收代码。确认无误后,再切换到正常模式进行网络联调。静默模式则在分析复杂的总线问题时非常有用。

6. 位时序配置:通信稳定的基石

位时序配置是CAN通信稳定性的底层保障。配置不当会导致偶尔的错误帧,在仲裁时尤其容易出问题,可能使节点进入错误被动状态。

6.1 位时间分段与参数计算

一个位时间被划分为4段:

  1. 同步段:固定为1个时间份额,用于总线边沿同步。
  2. 传播时间段:用于补偿网络中的物理延迟(总线长度、收发器延迟等)。
  3. 相位缓冲段1相位缓冲段2:位于采样点前后,用于通过重同步补偿时钟偏差。

我们需要配置的寄存器是CANBIT,它包含以下字段,其写入值是功能值减1

  • BRP:波特率预分频值。决定时间份额tq = (BRP) / fsys
  • TSEG1:等于(传播段 + 相位缓冲段1 - 1)。
  • TSEG2:等于(相位缓冲段2 - 1)。
  • SJW:同步跳转宽度 - 1,表示一次重同步所能调整的最大时间份额数,不能大于Phase1Phase2

计算步骤(以1 Mbps, CAN时钟25 MHz为例)

  1. 确定位时间t_bit = 1 / 1Mbps = 1 µs
  2. 选择时间份额数:位时间必须是tq的整数倍。通常选择在8-25个tq之间。高速时选少一些以减少抖动。假设我们选n = 5tq
  3. 计算tqBRPtq = t_bit / n = 0.2 µsBRP = tq * fsys = 0.2e-6 * 25e6 = 5。写入寄存器的值为BRP - 1 = 4
  4. 估算传播段:计算总线最大往返延迟(收发器延迟x2 + 线缆传输延迟)。假设总和为400 ns。Prop = ceil(400 ns / 200 ns) = 2 tq
  5. 分配相位缓冲段:剩余时间份额 =n - Sync - Prop = 5 - 1 - 2 = 2 tq。平分给Phase1Phase2,各得1 tq
  6. 计算TSEG1TSEG2
    • TSEG1 = Prop + Phase1 - 1 = 2 + 1 - 1 = 2
    • TSEG2 = Phase2 - 1 = 1 - 1 = 0
  7. 确定SJWSJW = min(4, Phase1, Phase2) = 1。写入值为SJW - 1 = 0
  8. 最终寄存器值CANBIT = (TSEG2<<20) | (TSEG1<<16) | (SJW<<10) | BRP = (0<<20) | (2<<16) | (0<<10) | 4 = 0x0204

6.2 配置经验与避坑指南

  1. 采样点位置:通常建议采样点位于位时间的75%-90%之间。采样点 = (Sync + Prop + Phase1) / (Sync + Prop + Phase1 + Phase2)。上例中为(1+2+1)/5 = 80%,是合理的。
  2. SJW设置SJW影响时钟容错能力。在保证稳定的前提下,可以适当设置大一些(如2或3),以容忍更大的晶振误差。但不得超过Phase1Phase2
  3. 网络一致性:同一个CAN网络中,所有节点的标称波特率必须相同,但它们的BRPTSEG1TSEG2可以因系统时钟不同而不同。关键在于计算出的位时间必须一致。
  4. 使用工具验证:网上有很多CAN位时序计算器(如canbitrate.ixxat.org)。在手动计算后,可以用这些工具进行验证,它们还能计算出最终的时钟容差,确保网络鲁棒性。
  5. 从较低波特率开始调试:在硬件调试初期,建议先使用较低的波特率(如125kbps或500kbps)。较低的波特率对硬件(如线缆、终端电阻)的要求更低,更容易建立稳定通信。待通信稳定后,再尝试提高波特率。

7. 常见问题排查与调试心得

即使理解了所有原理,实际调试中依然会遇到各种问题。下面是我总结的一些常见故障和排查思路。

7.1 根本收不到任何报文

  • 检查物理层:这是第一步也是最重要的一步。用示波器或CAN总线分析仪查看CAN_HCAN_L波形。确保有正确的差分信号,电压电平(隐性约2.5V,显性约3.5V/1.5V)正常,并且总线两端有120欧姆的终端电阻。
  • 检查初始化顺序:确保在配置CAN控制器寄存器前,已使能对应的外设时钟(通过SYSCTL模块),并等待了至少3个系统时钟周期。
  • 检查位时序配置:确认CANBIT寄存器的值计算正确,并且与网络中其他节点匹配。一个节点的位时序错误可能导致其无法正确解析任何帧。
  • 检查验收过滤:尝试将接收消息对象的掩码寄存器CANIFnMSK1/2设置为0x0000UMASK位使能。这将接收所有报文,用于判断是过滤条件设错了还是根本收不到。
  • 检查消息对象有效性:确认CANIFnMCTL寄存器中的MSGVAL位已被置1。一个MSGVAL=0的消息对象是无效的,不会被用于接收。

7.2 能收到部分报文,但目标报文收不到

  • 重点检查掩码和仲裁寄存器:这是最常见的原因。逐位核对你要接收的ID与CANIFnARB寄存器中配置的是否一致(注意标准ID是左对齐的)。再核对CANIFnMSK寄存器,确认你希望匹配的位掩码为1,不关心的位为0。
  • 检查UMASK:再次确认CANIFnMCTL.UMASK是否为1。
  • 检查帧格式:确认CANIFnARB2.XTD位设置正确,与你期望接收的帧格式(标准/扩展)一致。
  • 使用环回模式测试:配置本节点为环回模式,然后自己发送一帧目标ID的报文。如果能在自己的接收对象中收到,说明发送和接收的基础配置是正确的,问题可能出在总线上其他节点或网络拓扑上。

7.3 发送失败或没有ACK

  • 检查发送请求:发送消息对象配置完成后,需要将CANIFnMCTL.TXRQST位置1,才能启动发送。可以通过读取CANTXRQ1/2寄存器来查看哪些消息对象的发送请求正在挂起。
  • 检查总线状态:读取CANSTS寄存器,查看LEC(上次错误代码)、TXOKRXOKEWARNBOFF等位。如果BOFF位为1,说明节点已因严重错误而总线关闭,需要软件干预恢复。
  • 检查终端电阻:没有终端电阻或电阻值不匹配会导致信号反射,破坏通信。确保总线两端各有一个120欧姆电阻。
  • 使用静默模式诊断:将发送节点设置为静默模式,它应该停止发送。如果此时总线恢复正常,说明该节点可能是错误帧的来源(例如,持续发送错误帧导致总线阻塞)。

7.4 FIFO缓冲区工作异常

  • 数据顺序错乱:确保CPU是从低编号到高编号顺序读取FIFO中的消息对象,并且在读取每个对象时都清除了NEWDAT(通过设置CANIFnCMSK.CLRINTPND)。
  • 丢帧:检查是否所有非末尾消息对象的NEWDAT位常为1。这表示CPU读取速度跟不上数据到达速度。需要优化软件读取逻辑,或者增加FIFO深度(使用更多消息对象)。
  • MSGLST位置位:这表明发生了数据覆盖。原因同上,CPU处理太慢,数据被写入了EOB=1的最后一个对象并覆盖。需要检查MSGLST位并在必要时处理。

7.5 调试技巧

  1. 寄存器打印:在初始化后和关键操作后,将重要的CAN寄存器(如CANSTSCANERRCANINTCANTXRQ1/2CANNWDA1/2)的值打印出来。这些状态寄存器包含了丰富的诊断信息。
  2. 利用中断状态寄存器CANINTCANMSGnINT寄存器能快速定位是哪个消息对象产生了中断或收到了新数据。
  3. 分步测试:先配置一个最简单的发送对象(不涉及过滤)和一个最简单的接收对象(掩码全0),在环回模式下测试通。然后再逐步增加复杂度,如添加验收过滤、配置FIFO、启用中断等。
  4. 理解错误计数器CANERR寄存器包含了发送和接收错误计数。当计数值升高时,意味着总线质量可能有问题,或者位时序配置不佳。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询