深入解析MCAN模块:内部环回、时间戳与ECC安全机制

1. MCAN模块核心功能概述

在嵌入式系统,尤其是汽车电子和工业控制领域,控制器局域网(CAN)总线是连接各个电子控制单元(ECU)的神经系统。它的核心价值在于高可靠性和实时性,能够在复杂的电磁环境中稳定地传输关键的控制与状态信息。然而,随着系统复杂度的提升,对CAN节点的要求早已超越了“能通信”的层面,我们更关注其“如何可靠地通信”、“如何诊断自身状态”以及“如何保障数据安全”。这正是德州仪器(TI)等厂商推出的模块化控制器局域网(MCAN)模块的价值所在。它并非简单的CAN控制器,而是一个集成了高级诊断、精确时间管理和内存安全机制的增强型解决方案。

简单来说,MCAN在标准CAN协议栈的基础上,引入了三个至关重要的“增强包”:内部环回模式时间戳生成ECC安全机制。内部环回模式就像给通信模块装上了一面“镜子”,让它能自我审视,在不打扰总线邻居的情况下完成功能自检。时间戳机制则为每一帧数据的收发贴上了精确的“时间标签”,这对于分析网络延迟、诊断偶发性故障、实现时间同步系统(如AUTOSAR中的Time Sync)至关重要。而ECC安全机制则是数据的“贴身保镖”,在内存层面实时侦测并纠正因宇宙射线、电磁干扰等引起的比特翻转错误,为功能安全(如ISO 26262 ASIL等级)要求提供了硬件基础。

理解这三个特性,对于设计高可靠、易维护的嵌入式网络节点来说,是绕不开的必修课。无论你是正在调试车载网关的工程师,还是设计工业PLC的开发者,掌握MCAN的这些高级功能,都能让你在排查通信异常、优化网络性能、提升系统鲁棒性时,拥有更清晰的思路和更强大的工具。接下来,我们将逐一拆解这三个核心机制,不仅告诉你它们“是什么”,更会深入探讨“为什么”要这样设计,以及在实际项目中“如何用”才能发挥最大效用。

2. 内部环回模式:独立自检的“安全屋”

2.1 模式原理与配置方法

内部环回模式(Internal Loop Back Mode)是MCAN模块提供的一种自测试功能。其核心思想是让模块的发送端(Tx)和接收端(Rx)在内部形成闭环,完全与外部物理引脚(MCAN_TXMCAN_RX)隔离。在这种模式下,模块自己发送的报文会被自己接收,从而在不连接任何外部CAN节点、甚至不连接物理总线的情况下,验证整个数字信号处理通路(从协议引擎到收发器前端逻辑)是否工作正常。

从硬件连接上看,当启用内部环回模式时,MCAN_RX引脚在模块内部被断开,MCAN_TX引脚则被强制置为隐性电平(逻辑‘1’,对应CAN总线的空闲状态)。这意味着模块对外呈现为“静默”状态,不会向总线发送任何显性位干扰网络,也不会从总线接收任何外部报文。所有的通信活动都被限制在模块内部,形成了一个与世隔绝的“安全屋”。

配置内部环回模式需要设置两个关键的寄存器位:

  1. MCAN_TEST[4] LBCK (Loop Back Mode): 将此位置‘1’,使能环回功能。
  2. MCAN_CCCR[5] MON (Bus Monitoring Mode): 将此位置‘1’,使模块进入监控模式。在监控模式下,模块不会主动向总线发送报文,这正是环回测试所需的。

注意:必须同时设置LBCK=1MON=1才能正确启用内部环回模式。仅设置LBCK=1MON=0,模块可能仍会尝试参与总线仲裁和发送,这不符合“热自测试”不干扰总线的要求。

2.2 应用场景与实操步骤

内部环回模式最主要的应用场景是“热自测试”(Hot Selftest)。想象一下,一个正在运行的汽车引擎控制系统,CAN网络上的各个ECU都在持续交换着油门、转速、温度等关键数据。此时,如果你想测试某个ECU的MCAN模块是否完好,绝不能把它从总线上拔下来,也不能让它发送测试帧干扰其他ECU。内部环回模式就是为此而生。

典型的自测试流程如下:

  1. 保存现场:在进入测试前,先读取并保存MCAN模块的关键配置寄存器(如MCAN_CCCR,MCAN_NBTP等)和当前状态。因为测试模式会改变模块行为,测试完成后需要恢复原状。
  2. 配置环回模式:将MCAN模块置于初始化模式(MCAN_CCCR[0] INIT = 1),以确保可以安全配置寄存器。然后,依次设置MCAN_TEST[4] LBCK = 1MCAN_CCCR[5] MON = 1
  3. 退出初始化模式:将MCAN_CCCR[0] INIT位清零,使模块进入正常工作状态(但处于环回模式)。
  4. 执行自检通信
    • 发送测试帧:通过软件向MCAN的Tx Buffer或Tx FIFO写入一帧或多帧测试报文,并触发发送请求。这些报文的ID和数据内容应是预先定义好的。
    • 检查接收:在接收端(Rx Buffer或Rx FIFO)轮询或等待中断,检查是否收到了刚刚发送的测试报文。
    • 验证内容:比较接收到的报文ID、数据长度码(DLC)、数据场内容是否与发送的完全一致。同时,可以检查时间戳(如果使能)和接收状态标志。
  5. 恢复现场:测试完成后,再次进入初始化模式,将MCAN_TEST[4] LBCKMCAN_CCCR[5] MON位清零,并恢复步骤1中保存的原始配置。最后退出初始化模式,让MCAN模块重新接入真实的CAN网络。

实操心得与避坑指南:

  • 中断处理:在环回测试中,应使能发送完成中断(TC)和接收中断(RF0N/RF1N/DRX)。通过中断而非轮询方式能更高效地完成测试。但要注意,测试前需清除所有 pending 的中断标志,避免旧中断干扰测试判断。
  • 错误帧检测:即使在环回模式下,MCAN的协议错误检测(如位填充错误、CRC错误)仍然有效。如果自测试中收到了错误帧,说明模块内部的协议处理逻辑可能存在问题,这是一个重要的故障指示。
  • 与外部环回的区别:切勿将内部环回与通过外部收发器(如TJA1050)的环回模式混淆。外部环回需要TX和RX引脚在PCB上短接,信号会经过收发器的模拟电路。内部环回则完全在数字域内进行,不依赖外部硬件,测试的是MCAN IP核本身。
  • 波特率设置:环回测试时使用的波特率应与实际应用一致。这可以验证在目标波特率下,模块的位定时逻辑是否正常。

3. 时间戳生成机制:为每一帧数据贴上“精确时钟”

3.1 内部时间戳计数器详解

时间戳功能为CAN帧的发送和接收时刻提供了一个精确的参考点。MCAN模块内部集成了一个16位、可自动回绕(wrap-around)的计数器作为时间戳源。其工作原理如下:

  1. 时钟源与预分频:计数器并非直接使用CAN模块的系统时钟,而是由CAN位时间(Bit Time)驱动。寄存器MCAN_TSCC[19:16] TCP字段用于配置预分频值(1到16)。例如,如果TCP = 4,则时间戳计数器每4个CAN位时间递增一次。这种设计使得时间戳的精度与当前通信波特率直接关联,更适用于网络时序分析。
  2. 计数器操作:计数器的当前值可以通过MCAN_TSCV[15:0] TSC字段读取。向MCAN_TSCV寄存器执行写操作(通常写0)会将计数器复位清零。当计数器从0xFFFF增加到0x0000(溢出)时,会置位中断标志MCAN_IR[16] TSW,提示软件计数器已回绕。
  3. 时间戳捕获:在一帧报文开始发送或开始接收的瞬间(具体是帧起始SOF位),当前计数器的值会被捕获,并存储到相应报文存储单元的时间戳字段中:
    • 对于接收:时间戳存入接收缓冲区(Rx Buffer)或接收FIFO元素(Rx FIFO Element)的RXTS[15:0]字段。
    • 对于发送:时间戳存入发送事件FIFO元素(Tx Event FIFO Element)的TXTS[15:0]字段。

为什么在SOF时刻捕获?因为SOF是帧同步的唯一明确边界。在数据场或CRC场捕获会因位填充而变得复杂,SOF时刻最为清晰和一致,确保了所有节点对同一帧的时间基准是一致的。

3.2 外部时间戳计数器及其应用

对于CAN FD(灵活数据速率)模式,MCAN核心需要一个外部时间戳计数器。这是因为CAN FD的波特率可能在帧内切换(BRS位),使用基于CAN位时间的内部计数器在变速段会引入复杂性。外部时间戳提供了一个更稳定、统一的时基。

  1. 配置与连接:通过设置MCAN_TSCC[1:0] TSS字段来选择外部时间戳源。外部计数器是一个独立的16位向上计数器,它使用MCAN的接口时钟(MCAN_ICLK)作为参考时钟。一个24位的预分频器(MCANSS_EXT_TS_PRESCALER)允许你对MCAN_ICLK进行分频,以获得所需的时间戳分辨率。
  2. 中断机制:外部时间戳计数器也支持回绕中断。当计数器溢出时,会产生MCAN_IRQ_TS中断。MCAN提供了脉冲中断电平中断两种类型供选择,其逻辑由一组中断状态、使能和清除寄存器(如MCANSS_IRS,MCANSS_IE,MCANSS_IES等)管理。图23-6清晰地展示了其交互逻辑:溢出事件置位状态寄存器,如果使能寄存器也置位,则产生电平中断;同时,每次溢出事件会使一个内部计数器递增,向EOI(End Of Interrupt)寄存器写入操作会递减该计数器,只要计数器大于0,就会持续产生脉冲中断。这种设计方便了不同实时操作系统的中断处理需求。
  3. 应用价值
    • 网络延迟测量:在分布式系统中,比较发送时间戳和接收时间戳,可以精确计算报文在总线上的传输延迟。
    • 故障诊断:当发生通信错误时,精确的时间戳有助于关联不同ECU的日志,定位是哪个节点在什么时刻率先出现了异常,是分析偶发性故障的利器。
    • 时间同步:在需要全局时间基准的系统中(如AUTOSAR的Time Sync over CAN),主节点可以定期发送包含其时间戳的同步报文,从节点根据接收时间戳和自身的本地时间戳,计算并校正时钟偏移和漂移。

配置示例:使用内部时间戳假设CAN波特率为500kbps,一个位时间为2微秒。我们希望时间戳分辨率为10微秒。

  • 计算预分频值:所需分辨率 / 位时间 = 10us / 2us = 5。因此,设置MCAN_TSCC[19:16] TCP = 5(实际写入值4,因为预分频器值为1~16,对应TCP字段值0~15,所以5个位时间对应TCP=4)。
  • 使能时间戳:确保相关接收缓冲区、FIFO或发送事件FIFO的配置中,时间戳捕获功能是开启的(通常对应元素结构体中的一个控制位)。
  • 处理溢出:时间戳计数器约每65536 * 10us = 655.36ms溢出一次。在需要长时间连续记录的应用中,软件需要处理溢出中断,维护一个扩展的高位时间戳(例如,一个32位的软件计数器,低16位来自硬件,高位在每次硬件溢出中断时加1)。

4. ECC安全机制:内存数据的“守护神”

4.1 ECC包装器与SECDED原理

在要求高可靠性的系统中,内存中的软错误(Soft Error)是一个不可忽视的风险。这些错误通常由α粒子、宇宙射线中子等引起的比特翻转(Bit Flip)导致。ECC(Error Correction Code)包装器就是为MCAN的消息存储器(Message RAM)提供的一层硬件保护罩。

MCAN采用的ECC方案是SECDED(Single Error Correction, Double Error Detection)。顾名思义,它具有两种能力:

  1. 单错校正(SEC):当存储器中任何一个比特发生翻转时,ECC逻辑不仅能检测到错误,还能精确地定位并纠正它,恢复出原始数据。这个过程对软件完全透明。
  2. 双错检测(DED):当存储器中任意两个比特同时发生翻转时,ECC逻辑能够检测到发生了错误,但无法确定具体是哪两个比特出错,因此无法纠正。此时,它会报告一个不可纠正错误(通常触发中断)。

延迟写回(Lazy Write Back)策略:这是MCAN ECC实现中的一个关键优化。当ECC逻辑检测到一个可纠正的单比特错误时,它并不会立即停止系统访问去纠正内存。而是将这个错误信息(包括出错地址)记录在一个内部的FIFO队列中。ECC逻辑会等待一个“访问间隙”(即没有主机CPU或CAN核心访问该内存区域的时候),再将纠正后的数据写回内存并刷新该位置。如果在延迟写回完成之前,有一个新的写操作覆盖了那个出错的内存条目,那么这个待处理的纠正操作就会被丢弃,因为新数据已经写入。这种策略最大限度地减少了对内存访问性能的影响。

4.2 ECC聚合器与软件交互流程

ECC包装器负责“检测和纠正”,而ECC聚合器(ECC Aggregator)则负责“管理和报告”。它将多个ECC RAM模块的状态聚合起来,为软件提供一个统一的访问和监控接口。

ECC相关寄存器主要分为三组:

  1. 全局寄存器:如版本寄存器、ECC向量寄存器(MCANSS_ECC_VECTOR)、控制寄存器等。
  2. 控制与状态寄存器:如错误控制寄存器(MCANSS_ECC_ERR_CTRL1/2)和错误状态寄存器(MCANSS_ECC_ERR_STAT1/2)。注意:对这些寄存器的读取需要特殊的触发流程。
  3. 中断寄存器:用于使能、清除和响应ECC单比特错误(SEC)和双比特错误(DED)中断的标准中断模块寄存器。

软件读取ECC状态的典型流程(以查询单比特错误为例):这是一个稍显复杂但必须严格遵守的序列,主要围绕MCANSS_ECC_VECTOR寄存器进行:

  1. 选择目标RAM:向MCANSS_ECC_VECTOR[10:0] ECC_VECTOR字段写入目标ECC RAM的ID。
  2. 触发读操作:向MCANSS_ECC_VECTOR[15] RD_SVBUS位写‘1’,发起一次读状态寄存器的请求。
  3. 指定读地址:向MCANSS_ECC_VECTOR[23:16] RD_SVBUS_ADDRESS字段写入你要读取的状态寄存器地址(例如,MCANSS_ECC_ERR_STAT1的地址偏移)。
  4. 等待操作完成:轮询MCANSS_ECC_VECTOR[24] RD_SVBUS_DONE位,直到它变为‘1’,表示读操作完成。
  5. 读取数据:在下一个MCAN_ICLK周期,从目标状态寄存器(MCANSS_ECC_ERR_STAT1)中读取数据,其中包含了错误状态、出错地址等信息。

ECC错误中断处理流程:

  1. 使能中断:通过写MCANSS_ECC_SEC_ENABLE_SET_REG0MCANSS_ECC_DED_ENABLE_CLR_REG0寄存器来使能SEC或DED中断。
  2. 中断服务程序(ISR): a. 进入ISR后,首先遵循上述“读取ECC状态”的流程,从MCANSS_ECC_ERR_STAT1/2中读取详细的错误信息(错误类型、内存地址等)。这对于记录错误日志、评估系统健康度至关重要。 b. 根据错误类型,写MCANSS_ECC_ERR_STAT1[8] CLR_ECC_SECMCANSS_ECC_ERR_STAT1[9] CLR_ECC_DED位来清除硬件错误状态位。 c.必须轮询该状态位,直到确认其已被清除。这是一个重要的同步点。 d. 写MCANSS_ECC_SEC_EOI_REGMCANSS_ECC_DED_EOI_REG寄存器来清除中断源。 e. 最后,写MCANSS_ECC_EOI[8] ECC_EOI位为‘1’,完成整个中断应答握手。

重要提示:MCAN的ECC聚合器不支持错误统计功能(如记录单比特错误发生的次数)。如果需要这些信息用于可靠性分析或预测性维护,必须由软件在每次处理ECC中断时自行维护计数。

5. 接收处理与验收过滤实战解析

5.1 验收过滤器配置精讲

MCAN的接收处理核心在于其强大且灵活的验收过滤机制。它允许你精确控制哪些报文被接收、存储到哪里,甚至触发特定动作。MCAN支持两套独立的过滤器列表:一套用于标准帧(11位ID),一套用于扩展帧(29位ID)。

过滤器元素(Filter Element)的三种基本类型:

  1. 范围过滤器(Range Filter)

    • 配置:标准过滤器类型SFT='00'或扩展过滤器类型EFT='00'
    • 功能:匹配所有ID落在[SFID1, SFID2](标准帧)或[EFID1, EFID2](扩展帧)区间内的报文。要求SFID2 ≥ SFID1
    • 扩展帧特殊处理:当EFT='00'时,接收到的扩展ID会先与MCAN_XIDAM(扩展ID与掩码)寄存器进行按位与(AND)操作,然后再进行范围比较。这允许你定义一个“掩码化”的范围。若EFT='11',则MCAN_XIDAM不生效。
  2. 特定ID过滤器(Dual ID Filter)

    • 配置SFT='01'EFT='01'
    • 功能:可以配置一个或两个特定的ID进行匹配。如果SFID1 = SFID2(或EFID1 = EFID2),则只过滤一个ID。这种过滤器效率最高。
  3. 经典位掩码过滤器(Classic Bit Mask Filter)

    • 配置SFT='10'EFT='10'
    • 功能:提供最灵活的组过滤。SFID1/EFID1作为过滤ID,SFID2/EFID2作为掩码。掩码位为‘1’表示对应ID位必须严格匹配;掩码位为‘0’则表示“不关心”(该位可以是0或1)。
    • 示例:要过滤所有ID为0x18XX XXXX的扩展帧(即高5位是0x18),可以设置EFID1 = 0x1800 0000EFID2 = 0xF800 0000(掩码高5位为1,其余为0)。

过滤器动作(SFEC/EFEC):每个过滤器元素匹配后,可以执行多种动作,由SFECEFEC字段控制:

  • 000: 丢弃帧。
  • 001: 存入Rx FIFO 0。
  • 010: 存入Rx FIFO 1。
  • 011: 设置高优先级消息标志,触发中断。
  • 100: 存入专用Rx缓冲区(并可选触发DMA)。
  • 101: 存入Rx缓冲区并触发过滤器事件引脚脉冲(可用于快速DMA响应)。
  • 110: 存入Rx FIFO 0并设置高优先级标志。
  • 111: 存入Rx FIFO 1并设置高优先级标志。

过滤流程:如图23-7和23-8所示,接收到的有效帧会依次与过滤器列表中的元素进行比较。匹配在第一个使能的、符合条件的过滤器元素处停止。如果没有匹配任何元素,则根据全局过滤器配置寄存器(MCAN_GFC)的ANFS/ANFE位决定是接受还是丢弃非匹配帧。

5.2 Rx FIFO与专用Rx缓冲区管理

Rx FIFO管理: MCAN提供两个独立的接收FIFO(Rx FIFO 0和1),每个最多可存储64条报文。其状态由几个关键指针和字段描述:

  • Put Index (FnPI):下一个写入FIFO的位置索引。
  • Get Index (FnGI):下一个从FIFO读取的位置索引。
  • Fill Level (FnFL):当前FIFO中存储的报文数量。
  • Watermark (FnWM):水位线阈值。当FnFL >= FnWM时,会触发水位中断(RF0W/RF1W),提示软件及时读取,防止溢出。

FIFO操作模式

  1. 阻塞模式(默认,FnOM='0'):当FIFO满(FnPI == FnGI)时,新报文被丢弃,并置位“报文丢失”标志(RFnL)。适用于不能容忍数据覆盖的场景。
  2. 覆盖模式(FnOM='1'):当FIFO满时,新报文会覆盖最旧的报文(FnPIFnGI同时递增)。这里有一个关键陷阱:在覆盖模式下,如果CPU读取FIFO的速度跟不上写入速度,可能会出现“读脏数据”的情况。如图23-10所示,当Put Index即将追上Get Index时,软件读取的Get Index指向的数据可能正在被新的写入操作覆盖。解决方案是软件读取时使用一个偏移量,例如从Get Index + 2的位置开始读,牺牲一些数据新鲜度来保证数据一致性。偏移量大小取决于CPU处理FIFO的速度。

专用Rx缓冲区: 除了FIFO,MCAN还支持最多64个专用Rx缓冲区。每个缓冲区可以绑定到一个特定的过滤器元素(通过配置SFEC/EFEC='100''101',并在SFID2/EFID2的低位指定缓冲区索引)。当匹配的报文存入后,对应的“新数据”标志(在MCAN_NDAT1/2寄存器中)会被置位。只要“新数据”标志为1,该缓冲区就会被锁定,不会被新的匹配报文覆盖。软件必须读取数据后,手动写‘1’清除该标志位,才能解锁缓冲区接收下一帧。这种方式为处理高优先级、固定ID的报文提供了确定性的存储位置。

配置示例:设置一个接收标准帧0x123的专用缓冲区

  1. 在Message RAM中规划Rx缓冲区区域,通过MCAN_RXBC.RBSA设置其起始地址。
  2. 配置一个标准ID过滤器元素(例如,列表中的第一个元素):
    • SFT = '01'(特定ID过滤)
    • SFID1 = SFID2 = 0x123
    • SFEC = '100'(存入专用Rx缓冲区)
    • SFID2[5:0] = 0(指定存入Rx缓冲区索引0)
  3. 使能该过滤器列表(通过MCAN_SIDFC.LSS设置列表大小)。
  4. 当ID为0x123的帧到达时,它会被存入Rx缓冲区0,并且MCAN_NDAT1[0]位会被置位,同时可能触发MCAN_IR[19] DRX中断。

6. 发送处理与高级传输控制

6.1 发送缓冲区、FIFO与队列模式

MCAN的发送侧提供了三种灵活的消息组织方式,通过MCAN_TXBC寄存器进行配置:

  1. 专用发送缓冲区(Dedicated Tx Buffers)

    • 特点:每个缓冲区由软件直接、独立控制。软件将待发送报文填入指定缓冲区,然后通过置位MCAN_TXBAR寄存器中对应的ARn位来提交发送请求。
    • 适用场景:周期固定、实时性要求高的报文(如发动机转速、车速)。软件可以精确控制每一帧的发送时机。
    • 优先级:多个缓冲区同时有发送请求时,ID数值最小的报文拥有最高优先级。如果ID相同,则缓冲区编号小的优先。
  2. 发送FIFO(Tx FIFO)

    • 配置MCAN_TXBC[30] TFQM = 0
    • 特点:一个先入先出的缓冲区队列。软件通过Put Index(TFQPI)将报文顺序写入,MCAN硬件按写入顺序(Get IndexTFGI)依次发送。即使报文ID不同,也严格按FIFO顺序发送
    • 适用场景:需要按产生顺序发送的日志报文、诊断响应等,确保时序一致性。
  3. 发送队列(Tx Queue)

    • 配置MCAN_TXBC[30] TFQM = 1
    • 特点:同样是缓冲区队列,但发送顺序不由写入顺序决定,而是由报文ID的优先级决定(ID值小的优先)。这完美契合了CAN总线基于ID仲裁的本质。
    • 适用场景:需要动态产生、且优先级各异的报文混合发送的场景。这是最符合CAN总线特性的发送方式,也是AUTOSAR CAN Driver所要求的模式(至少需要3个队列缓冲区)。

混合模式:MCAN允许将32个发送缓冲区划分为两部分,一部分用作专用缓冲区,另一部分用作FIFO或队列。例如,MCAN_TXBC.NDTB=8设置8个专用缓冲区,MCAN_TXBC.TFQS=24设置24个队列缓冲区。发送仲裁时,硬件会扫描所有有 pending 请求的专用缓冲区和FIFO/队列中的最高优先级报文,选择ID最小的进行发送。

6.2 发送暂停与取消功能

发送暂停(Transmit Pause)

  • 功能:通过置位MCAN_CCCR[14] TXP使能。使能后,MCAN在成功发送完一帧报文后,会主动插入2个位时间的空闲时段,再开始下一帧的仲裁/发送。
  • 设计意图:解决“优先级倒置”问题。在某些固定ID分配的网络上,低优先级的ECU可能因为高优先级ECU持续发送数据而长期无法获得总线访问权。发送暂停功能强制高优先级节点在每帧后“休息”一下,为低优先级节点创造了发送机会。
  • 注意:这破坏了CAN总线严格的优先级仲裁规则,仅在特定网络拓扑和需求下使用,需谨慎评估其对最坏情况响应时间的影响。

发送取消(Transmit Cancellation)

  • 功能:软件可以通过清除MCAN_TXBAR中的请求位,来取消一个尚未开始发送的报文请求。
  • 对FIFO/队列的影响
    • 如果取消的请求正好是Tx FIFO中Get Index指向的报文,则Get Index会递增到下一个有 pending 请求的缓冲区,并重新计算空闲缓冲区数量。
    • 如果取消的是其他位置的请求,则Get Index和空闲计数保持不变。这对于队列模式管理动态变化的发送任务非常有用。

实操心得:发送配置选择

  • 实时性要求极高:使用专用发送缓冲区,并利用ID优先级确保关键报文及时发送。
  • 数据流顺序重要:使用Tx FIFO。
  • 通用、动态的CAN通信:使用Tx Queue,这是最推荐的方式。
  • 兼容AUTOSAR:必须配置至少3个缓冲区的Tx Queue模式。
  • 计算缓冲区地址:无论是哪种模式,缓冲区在Message RAM中的地址都遵循公式:Start Address = MCAN_TXBC.TBSA + Buffer_Index * Element_Size。其中Element_Size根据MCAN_TXESC.TBDS配置的数据场大小决定(参见表23-5,从4个字到18个字不等)。务必在初始化时根据帧的最大数据长度正确配置TBDS,并据此分配足够的Message RAM空间。