| 
在线时间4871 小时
UID3441752
注册时间2017-11-21
NXP金币71916 
 TA的每日心情|  | 开心 2025-7-11 08:53
 | 
|---|
 签到天数: 301 天 连续签到: 2 天 [LV.8]以坛为家I 管理员   
 
	积分41028 
最后登录2025-10-31 | 
 
| 最近有客户反映LPC546xx上CAN example不太容易看懂,尤其是波特率配置:SDK默认的CAN波特率为500Kbps, 客户想改成比较低的波特率(10Kbps)总是失败,无法修改成功。 
 
 这篇文章就来解决这个小问题。
 
 
 SDK中的CAN Example 
 SDK中CAN的example主要有两个:目录位于:\SDK_2.6.0_LPCXpresso54608\boards\lpcxpresso54608\driver_examples\mcan
 
 分别为:
 ·Interrupt transfer
 ·loopback
 
 
 loopback为回环测试,只用一个开发环境(一套板子)就可以烧进去看现象调试。但是没有真实的CAN信号发射/接收过程。interrupt_transfer则是两个板子对传CAN帧,需要两个板子并且连接好2根跳线进行测试。具体可以看example目录下的readme说明,这里不再赘述。
 本篇文章基于interrupt_transfer代码,并且只用一个USB转CAN 转换器当作另外一套板子(小编板子也不富裕啊-_-!).硬件环境如下:
 CAN PHY是一个CAN物理层转接小板,输入MCU的CAN_TX CAN_RX信号,输出CANH CANL信号。USB转CAN为某宝上购买的USB-CAN转换器,并且自带上了上位机,可以方便的收发CAN帧,调试比较方便。
 
 
 其中CAN PHY 连接到LPC54608评估板的J10-2(CAN_RXD)和 J10-4(CAN_TXD)上(与interrupt_transfer example一致)。硬件环境搭建非常古朴。相信接触过CAN的人一看就懂,不再多说。
 
 
 波特率配置 SDK中默认的波特率为500Kbps,建议修改代码前先用500Kbps测试下硬件环境是不是都是OK的。
 
 
 SDK实例中并没有一个特别明确的像SetCANBaudRate这样的API,不过稍加研究就能发现,可以通过mcanConfig.baudRate来修改CAN波特率:比如我们修改为10K波特率的话,只要做如下修改即可:
 baudRateA指的是非数据域的波特率,baudRateD指的是数据域的波特率(CANFD), 本篇文章不讨论CANFD,所以baudRateA和baudRateD都设置为一样的值,并且要在MCAN_GetDefaultConfig函数之后。
 
 
 改成这个样子下载下去后,会发现发送和接收都会失败,小编经过debug后发现,是因为波特率分频系统,无法将MCAN的输入时钟分成很准的10Khz的整倍数。所以我们需要修改MCAN的输入时钟(修改MCAN0function clock)频率
 
 
 SDK 中对应的API是: CLOCK_SetClkDiv(kCLOCK_DivCan0Clk, 6, true); 就像注释上写的一样,SDK将MCAN0 function clock设置为30Mhz: /* Set MCAN clock 180/6=30MHz.*/
 
 
 默认的30Mhz MCAN0 function clock是无法正确产生10Kbps CAN波特率的,需要调整为1Mhz(波特率的10-100倍即可,但是要注意分频系数只能在1-255之间):
 
 
 这样就可以顺利产生10Khz的CAN波特率了。硬件测试表明interrupt example可以正常收发CAN帧了。
 
 总结 
 综上所述,问题的症结在于输入时钟不是所需波特率的整数倍,不能准确分频得到目标波特率,因此需要修改输入的时钟频率。
 另外笔者发现在SDK2.7.0中是可以直接配到10K波特率并正常输出的,但是如果配成20K波特率,还是会出问题,所以必须调整MCAN的输入时钟以适配您需要的波特率。
 
 
 
 | 
 |