閬垮潙鎸囧崡涔嬫潈閲嶇瘒 (閬垮潙鎸囧崡3.0鐑韩椤荤煡)

CAN的原例程里面时钟使能用的却是UART的时钟使能,是不是有问题呢?

为了实现USB转CAN分析仪调试,实际使用了I.MXRT1050的 Flexcan功能,测试中并没有使用串口,将测试用的串口代码屏蔽之后,发现Flexcan功能也出现异常,如下是调试记录:

初始化FLEXCAN_Reset函数后,一直等待在如下的循环代码里,如下图所示。

/* Wait until FlexCAN reset completes. */
 while (0U != (base->MCR & CAN_MCR_SOFTRST_MASK)){
}

閬垮潙鎸囧崡涔嬫潈閲嶇瘒,閬垮潙鎸囧崡妗嗘灦ppt

程序参考的是SDK里面的 evkbimxrt1050_flexcan_interrupt_transfer 例程,默认的例程是可以用的

经过检查后发现错误产生的原因是因为屏蔽了

BOARD_InitDebugConsole()

这行代码,如果加上这行代码,FlexCAN是正常的,代码可以正常往下执行。

閬垮潙鎸囧崡涔嬫潈閲嶇瘒,閬垮潙鎸囧崡妗嗘灦ppt

多次测试后发现 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。

閬垮潙鎸囧崡涔嬫潈閲嶇瘒,閬垮潙鎸囧崡妗嗘灦ppt

閬垮潙鎸囧崡涔嬫潈閲嶇瘒,閬垮潙鎸囧崡妗嗘灦ppt

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