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一致,避免“采样点漂移”导致的偶发错误。
三、过滤器配置: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不会前进。这是初学者最容易遗漏的一步。
六、配置示例与检查要点
/* 示例: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。
寄存器级配置的本质是把“通信参数”翻译成控制器能执行的时序与存储规则。位定时决定“什么时候采样”,过滤器决定“收哪些”,FIFO决定“放在哪”,中断决定“何时通知”。四者环环相扣,任何一处偏差都会在总线上表现为错误帧、丢帧或CPU无法及时取走报文。建议在工程中把上述参数整理成配置表,随节点DBC或CAN矩阵一起维护,避免不同节点采样点不一致带来的隐性故障。