3. CAN驱动与CAN接口层集成

在MICROSAR通信栈中,CAN驱动(Can模块)与CAN接口层(CanIf模块)是距离硬件最近的两层。Can模块直接操作CAN控制器寄存器与报文RAM,负责位定时、邮箱收发、中断处理;CanIf模块则向上屏蔽具体控制器差异,为PduR、CanTp、Com等上层模块提供统一的L-PDU收发服务。两者集成的质量,直接决定整条CAN通信链路能否正常收发、能否稳定运行在目标波特率上。

Can模块与CanIf模块的职责边界

Can模块属于MCAL层,由EB tresos或DaVinci Configurator生成配置,核心配置对象包括CanController、CanHardwareObject、CanGeneral等。CanController描述一个CAN控制器的位定时、时钟源、处理方式(中断或轮询);CanHardwareObject描述一个硬件邮箱(HOH),并绑定到某个Controller上,同时声明该邮箱是发送还是接收、使用BasicCAN还是FullCAN、关联哪个硬件过滤器。CanIf模块位于ECU抽象层,核心配置对象是CanIfInitCfg中的CanIfHrhCfg(接收句柄配置)和CanIfHthCfg(发送句柄配置),以及CanIfRxPduCfg、CanIfTxPduCfg。CanIf通过HOH(Hardware Object Handle)把上层PDU与Can模块的硬件邮箱关联起来,这个关联关系就是集成工作的核心。

硬件对象Handle映射关系

Handle映射的本质是三层索引的对应:CanIf的HRH/HTH编号 → CanHardwareObject的Handle → 具体Controller上的邮箱。在CanIf配置中,CanIfHrhCfg数组的索引即HRH(Hardware Receive Handle),每个元素包含CanObjectId(即CanHardwareObject的Handle)和CanIfHrhSoftwareFilter等属性。CanIfRxPduCfg中的CanIfRxPduHrhIdRef指向某个HRH,从而把一条接收PDU绑定到某个硬件邮箱。发送方向同理:CanIfTxPduCfg中的CanIfTxPduHthIdRef指向某个HTH,HTH再映射到CanHardwareObject。

实际配置时常见的错误是Handle编号错位:Can模块中CanHardwareObject的Handle从0开始编号,而CanIf中HRH/HTH也是从0开始,但两者顺序不一定一致。例如Can模块中Handle 0是发送邮箱、Handle 1是接收邮箱,而CanIf配置时若把HRH 0映射到CanObjectId 0,就会把接收PDU绑到发送邮箱上,导致接收永远收不到数据。因此集成时必须逐条核对CanObjectId与CanHardwareObject Handle的对应关系。

CanIf 与 Can 硬件对象 Handle 映射关系 CanIf 层(ECU抽象层) CanIfRxPduCfg RxPduHrhIdRef = 0 CanIfHrhCfg[0] CanObjectId = 1 CanIfTxPduCfg TxPduHthIdRef = 0 CanIfHthCfg[0] CanObjectId = 0 Can 层(MCAL) CanHardwareObject Handle = 1(接收) BasicCAN / FullCAN CanHardwareObject Handle = 0(发送) Tx Mailbox CAN Controller(如 M_CAN / FlexCAN) Message RAM · 位定时寄存器 · 中断向量

波特率与采样点参数设置

CAN位定时由CanController中的CanControllerBaudRateConfig决定,关键参数包括波特率(BaudRate)、采样点位置(SamplePoint)、同步跳转宽度(SyncJumpWidth,SJW)以及时间段1/2(TSEG1/TSEG2)。这些参数最终写入控制器的位定时寄存器。以常见的80 MHz CAN时钟、目标500 kbps为例:一个位时间包含同步段(1 Tq)、传播段+相位段1(TSEG1)、相位段2(TSEG2)。若取Tq=25 ns(预分频=2),则每位20 Tq。若采样点设为80%,则TSEG1=15 Tq、TSEG2=4 Tq、SJW取3~4 Tq。配置时需保证:TSEG1 ≥ 传播段 + 相位段1,TSEG2 ≥ 信息处理时间,且采样点通常落在75%~87.5%之间。

采样点设置不当会直接导致通信误码率上升。采样点偏早,对总线延迟和晶振偏差的容忍度下降;采样点偏晚,则容易在仲裁或错误帧期间采到错误电平。工程上建议:500 kbps及以下采样点取87.5%,1 Mbps取75%~80%,长线束或节点数多时适当提前。MICROSAR的Can模块通常提供CanControllerBaudRateConfig中的CanControllerSamplePoint和CanControllerSyncJumpWidth两个百分比参数,由工具自动反算TSEG值,但集成时仍应核对生成的寄存器值是否与目标一致。

回环测试验证集成正确性

回环测试(Loopback)是验证Can/CanIf集成是否正确的第一道关卡。在CanController配置中把CanControllerLoopbackMode设为CAN_LOOPBACK(内部回环)或CAN_SILENT_LOOPBACK(静默回环),控制器发送的报文不经过收发器,直接回到自身接收邮箱。这样可以在不接总线、不接其他节点的情况下,验证发送邮箱→接收邮箱→CanIf→上层的整条路径是否打通。

典型测试流程:配置一个发送HTH和一个接收HRH,接收过滤器设置为接收所有ID或指定ID;调用Can_Write发送一帧标准帧(如ID=0x123,DLC=8,数据0x11~0x88);在接收中断或轮询中检查CanIf_RxIndication是否被调用,并核对收到的ID、DLC、数据是否与发送一致。若收不到,按以下顺序排查:CanController是否进入STARTED状态、HOH的Handle映射是否错位、接收过滤器是否把该ID过滤掉、CanIf的RxPduHrhIdRef是否指向正确的HRH、CanIfRxPduCanId与CanIfRxPduCanIdMask是否匹配。

回环测试通过后,再切换到正常模式接入真实总线。若回环通过但正常模式不通,问题通常出在收发器使能、终端电阻、总线电平或采样点与对端不匹配,而非Can/CanIf配置本身。

集成检查要点

  • CanController的时钟源与预分频是否与硬件实际时钟一致,避免波特率偏差。
  • 每个CanHardwareObject的Handle在CanIf中是否被正确引用,发送/接收方向不能颠倒。
  • 接收过滤器的CanId与Mask是否覆盖目标报文,FullCAN邮箱的ID是否与硬件过滤器一致。
  • CanIfRxPduHrhIdRef、CanIfTxPduHthIdRef是否指向存在的HRH/HTH索引。
  • 中断向量、中断优先级、CanIf的Rx/Tx中断使能是否与Can模块配置匹配。
  • 回环模式下确认CanIf_RxIndication被调用且数据一致,再切换正常模式。

完成上述配置与验证后,Can与CanIf之间的数据通路即已建立。后续CanTp、Com等模块的集成,都建立在这条已经验证过的底层通道之上。