4. CAN/CAN-FD控制器寄存器级配置

在AURIX TC3xx系列中,CAN/CAN-FD通信由MCMCAN(MultiCAN+)模块实现。与早期MultiCAN模块不同,MCMCAN采用Bosch M_CAN IP核,寄存器组织更接近标准CAN-FD控制器模型。寄存器级配置的核心目标只有一句话:让控制器在正确的位时间上采样到正确的电平,并把符合过滤条件的报文准确送入FIFO,再通过中断通知CPU。本节围绕这一目标,按“位定时—采样点—过滤器—FIFO—中断”的顺序展开,并给出可直接参考的配置示例。

一、位定时寄存器:NBTP与DBTP

MCMCAN将标称位定时与数据位定时分开管理。标称位定时寄存器NBTP用于仲裁段(含CAN-FD的仲裁相位),数据位定时寄存器DBTP用于数据段。两者结构相似,关键字段包括:

  • NTSEG1 / DTSEG1:传播段+相位缓冲段1,决定采样点之前的时间;
  • NTSEG2 / DTSEG2:相位缓冲段2,决定采样点之后的时间;
  • NSJW / DSJW:同步跳转宽度,用于重同步时允许的调整量;
  • NBRP / DBRP:波特率预分频,决定时间份额tq的长度。

位时间 = tq × (1 + SEG1 + SEG2),其中tq = (BRP+1) / fCAN。以TC3xx常见配置为例,假设CAN时钟fCAN=80 MHz,目标标称波特率500 kbit/s、采样点80%:取NBRP=1(tq=2/80MHz=25 ns),则位时间=2 μs=80 tq。要求采样点80%,即SEG1占总位时间的80%,SEG2占20%。取NTSEG1=63、NTSEG2=16,则1+63+16=80,采样点=(1+63)/80=80%。NSJW取16(不超过SEG2)。

数据段若目标2 Mbit/s、采样点75%:取DBRP=0(tq=12.5 ns),位时间=500 ns=40 tq。取DTSEG1=29、DTSEG2=10,则1+29+10=40,采样点=(1+29)/40=75%。DSJW取10。注意:CAN-FD要求数据段采样点通常不低于70%,且SEG2不宜过小,否则重同步能力不足。

二、采样点与同步机制

采样点位置由SEG1与SEG2的比例决定,但实际能否稳定采样还取决于同步。硬同步发生在帧起始(SOF)下降沿,控制器将位时间起点对齐到该边沿;重同步发生在后续边沿,通过调整SJW范围内的相位误差来补偿。若相位误差超过SJW,则会产生位错误或错误帧。因此SJW不能为0,工程上常取SEG2的1/2到全部。对于长总线或存在晶振偏差的多节点网络,建议将采样点统一设置在75%~80%,并保证所有节点SJW一致,避免“采样点漂移”导致的偶发错误。

MCMCAN 位定时与采样点配置示意(标称500 kbit/s / 数据2 Mbit/s) 标称位时间 NBTP(80 tq,2 μs) NTSEG1 = 63(传播段+相位缓冲1) NTSEG2 = 16 采样点 80% tq = 25 ns,NBRP = 1,NSJW = 16 数据位时间 DBTP(40 tq,500 ns) DTSEG1 = 29 DTSEG2 = 10 采样点 75% tq = 12.5 ns,DBRP = 0,DSJW = 10 硬同步对齐SOF边沿;重同步在SJW内调整相位误差,SJW过小会导致位错误

三、过滤器配置:SIDFC / XIDFC / RXF0C / RXF1C

MCMCAN的过滤分为标准帧(11位ID)和扩展帧(29位ID)两套。标准帧过滤器配置寄存器SIDFC指向标准过滤器元素列表,扩展帧由XIDFC指向扩展过滤器列表。每个过滤器元素包含:

  • SFT / XFT:过滤类型,0=范围过滤(Range),1=双ID过滤(Dual ID),2=经典位掩码(Classic Mask),3=禁用;
  • SFID1/SFID2 或 EFID1/EFID2:两个ID值,含义随过滤类型变化;
  • SFEC / EFEC:过滤动作,0=禁用,1=存入RXFIFO0,2=存入RXFIFO1,3=拒绝,7=存入专用RX Buffer。

以“只接收ID=0x123和0x456的标准帧,存入RXFIFO0”为例,可配置一个双ID过滤器:SFT=1,SFID1=0x123,SFID2=0x456,SFEC=1。若需要接收ID范围0x100~0x1FF,则用范围过滤:SFT=0,SFID1=0x100,SFID2=0x1FF,SFEC=1。注意过滤器元素必须按4字节对齐写入消息RAM,且SIDFC中的FLSSA字段指向列表起始地址,LSS字段为元素个数。

四、RX FIFO与TX FIFO配置

接收FIFO由RXF0C和RXF1C配置,关键字段包括:

  • F0SA / F1SA:FIFO起始地址(消息RAM偏移);
  • F0S / F1S:FIFO容量(元素个数);
  • F0WM / F1WM:水位标记,达到该值可触发中断;
  • F0OM / F1OM:溢出模式,0=阻塞,1=覆盖旧报文。

发送方面,TXBC配置发送缓冲区/队列/FIFO的起始地址、容量和模式(TFQM)。若使用TX FIFO,报文按写入顺序发送;若使用TX Queue,则按ID优先级发送。发送元素中的T1寄存器包含DLC、FDF(FD格式)、BRS(比特率切换)等控制位,必须与位定时配置匹配。

五、中断使能与状态读取

中断使能寄存器IE、ILS、ILE分别控制中断源使能、线选择和边沿选择。常用中断源包括:

  • RF0N / RF1N:RX FIFO0/1新报文;
  • RF0W / RF1W:RX FIFO0/1水位到达;
  • RF0F / RF1F:RX FIFO0/1溢出;
  • TCF:发送完成;
  • BO:总线离线;
  • EW:错误警告。

中断服务程序中应先读IR寄存器获取中断标志,再读RXF0S或RXF1S的F0GI/F1GI获取当前FIFO填充级别,然后从对应地址读取报文元素。读取后需写RXF0A或RXF1A的F0AI/F1AI确认释放,否则FIFO不会前进。这是初学者最容易遗漏的一步。

配置顺序建议:先写NBTP/DBTP并置CCCR.INIT=1,再配置过滤器与FIFO,最后使能中断并清除CCCR.INIT进入正常模式。任何位定时修改都应在INIT=1状态下进行。

六、配置示例与检查要点

/* 示例:TC3xx MCMCAN0 标称500k/数据2M,采样点80%/75% */
CAN0->NBTP = (1u << 16) | (63u << 8) | (16u << 0);   /* NBRP=1, NTSEG1=63, NTSEG2=16 */
CAN0->DBTP = (0u << 16) | (29u << 8) | (10u << 0);   /* DBRP=0, DTSEG1=29, DTSEG2=10 */
CAN0->SIDFC = (SIDF_START << 2) | 1u;                /* 1个标准过滤器 */
CAN0->RXF0C = (RXF0_START << 2) | (8u << 16) | (4u << 0); /* 8元素, 水位4 */
CAN0->IE  = (1u << 0) | (1u << 1);                  /* RF0N, RF0W */
CAN0->CCCR &= ~(1u << 0);                           /* 清除INIT,进入正常模式 */

配置完成后应逐项检查:用示波器或CAN分析仪测量实际位时间与采样点是否与计算一致;发送一帧已知ID报文,确认只有匹配过滤器的报文进入FIFO;读取RXF0S的F0FL字段确认填充级别;触发水位中断后确认ISR能正确读取并释放。若出现“收不到报文”,优先检查过滤器SFEC是否误设为拒绝、FIFO起始地址是否与消息RAM分配冲突、以及CCCR.INIT是否仍为1。

CAN-FD的BRS位切换要求数据段位定时独立配置。若DBTP未正确设置而报文BRS=1,控制器会以标称位定时采样数据段,导致位错误。务必在发送和接收两端同时验证NBTP与DBTP。

寄存器级配置的本质是把“通信参数”翻译成控制器能执行的时序与存储规则。位定时决定“什么时候采样”,过滤器决定“收哪些”,FIFO决定“放在哪”,中断决定“何时通知”。四者环环相扣,任何一处偏差都会在总线上表现为错误帧、丢帧或CPU无法及时取走报文。建议在工程中把上述参数整理成配置表,随节点DBC或CAN矩阵一起维护,避免不同节点采样点不一致带来的隐性故障。