CAN的原例程里面时钟使能用的却是UART的时钟使能,是不是有问题呢?
为了实现USB转CAN分析仪调试,实际使用了I.MXRT1050的 Flexcan功能,测试中并没有使用串口,将测试用的串口代码屏蔽之后,发现Flexcan功能也出现异常,如下是调试记录:
初始化FLEXCAN_Reset函数后,一直等待在如下的循环代码里,如下图所示。
/* Wait until FlexCAN reset completes. */
while (0U != (base->MCR & CAN_MCR_SOFTRST_MASK)){
}

程序参考的是SDK里面的 evkbimxrt1050_flexcan_interrupt_transfer 例程,默认的例程是可以用的
经过检查后发现错误产生的原因是因为屏蔽了
BOARD_InitDebugConsole()
这行代码,如果加上这行代码,FlexCAN是正常的,代码可以正常往下执行。

多次测试后发现 BOARD_InitDebugConsole()这个函数在例程里面使用了 CLOCK_EnableClock(kCLOCK_Lpuart1) 或者 CLOCK_EnableClock(kCLOCK_Lpuart2)
只要在程序里面也加上述的 CLOCK_EnableClock ,CAN就可以初始化正常
虽然CAN模块与UART模块的时钟都从PLL3而来,但CLOCK_EnableClock操作的其实是CCM模块的CCM_CCGRx寄存器,而且CAN模块与UART模块是独立的。这是什么造成的?参考手册中都没有提到过这方面
于是检查勘误手册,发现有如下ERR050235里面有描述如果FlexCAN的时钟设置不正确将会影响UART的时钟 。
当选择CAN_CLK_SEL 设置为2的CCM CAN时钟源时,UART时钟门将不会打开,CAN_CLK_ROOT 将关闭。
为避免此问题,只有将CAN时钟选择的CAN_CLK_SEL设置为0或1,或通过配置CCM_CCGRx 寄存器打开UART时钟。
所以在CAN的例程里面采用的是第二种解决办法,打开UART的时钟,也就是SDK例程里面的 CLOCK_EnableClock(kCLOCK_Lpuart1)或者CLOCK_EnableClock(kCLOCK_Lpuart2)
解决方案里面也提到了另外一种方案就是选择将CAN_CLK_SEL设置为0或者1。


ERR050235: CCM: Incorrect clock setting for CAN affects UART clock gating
Description: When selecting the CCM CAN clock source with CAN_CLK_SEL set to 2, the UART clock gatewill not open and CAN_CLK_ROOT will be off. To avoid this issue, set CAN_CLK_SEL to 0 or1 for CAN clock selection, or open the UART clock gate by configuring the CCM_CCGRxregister.
Workaround: There are two workarounds for this issue:
• Set CAN_CLK_SEL to 0 or 1 for CAN clock selection
• If CAN_CLK_SEL is set to 2, then the CCM must open any of UART clock gate by
configuring the CCM_CCGRx register.
参考文档:
1.https://www.nxp.com.cn/docs/en/errata/IMXRT1050CE.pdf