Other Parts Discussed in Thread: TCAN4550
器件型号: TCAN4550
我们在 CAN 模式和比特率的动态切换过程中遇到 TCAN 器件问题。
最初、CAN 接口配置为高速 (HS) 模式、比特率为 500kbps。 取消初始化接口后、我们将其重新配置为 CAN-FD 模式、标称比特率为 1Mbps、数据比特率为 3Mbps。 但是、在这种情况下:
*CAN-FD 数据(64 字节)传输不起作用。
*1 Mbps 的传统 CAN 通信也失败
*500 kbps 的传统 CAN 通信正在工作,即使接口已使用更新的配置重新初始化。
经过调查、我们观察到 tcan4x5x 驱动器的动态开关无法正常工作。 通过查看驱动器和寄存器行为可以发现、MCAN_CCCR.寄存 器中的初始化位 (INIT 和 CCE) 仅在驱动器加载期间设置一次。 由于这些位在运行时重新配置期间不会重新启用、因此默认情况下不支持模式和比特率的动态切换。
为了解决该问题、我们修改了 m_can.c 驱动器、如下所示:
diff -Arun a/drivers/net/can/m_can/m_can.c B/drivers/net/can/m_can.c
--- a/drivers/net/can/m_can/m_can.c 2026年03月17日 11:17:38.166965563 +0530
++ B/drivers/net/can/m_can/m_can.c 2026年04月01日 18:20:24.215708731 +0530
@@–1253,6 +1253,7 @@
CCCR &=~μ s (CCCR.TEST | CCCR.MON | CCCR.BRSE | CCCR.FDOE |
CCCR.NISO);
+ cccr =(CCCR.INIT | CCCR.CCE);
/*只有 3.2.x 实现了 NISO 位*/
if (cdev->can.ctrlmode & can_CTRLMODE_FD_non_iso)
CCCR |= CCCR.NISO;
@@–1265,6 +1266,8 @@
if (cdev->can.ctrlmode & can_CTRLMODE_LISTENONLY)
CCCR |= CCCR.MON;
+ m_can_write (cdev、m_can_ccr、CCCR.INIT);
+ m_can_write (cdev、m_can_ccr、(CCCR.INIT | CCCR.CCE);
/*写入配置*/
M_can_write (cdev、M_can_ccr、cccr);
M_CAN_WRITE (cdev、M_can_test、test);
发生这些变化后、CAN 模式和比特率之间的动态切换现在可以按预期工作。
我们希望您对这一修改进行审查、并确认它不会引入任何意外的副作用。
此外、我们想了解为什么驱动程序中默认未启用此功能。 是否有特定的设计限制或硬件限制可阻止动态重新配置而无需明确重新进入 INIT_CCE 模式?