在线时间4069 小时
UID3441752
注册时间2017-11-21
NXP金币753015
TA的每日心情 | 开心 2024-3-26 15:16 |
---|
签到天数: 266 天 [LV.8]以坛为家I
管理员
- 积分
- 32032
- 最后登录
- 2024-4-26
|
最近有客户反映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的输入时钟以适配您需要的波特率。
|
|