2. CMS32硬件平台:MCU概述、CAN控制器与收发器选型
各位同学,咱们直接进入正题。做CAN总线开发,硬件平台是根基。你软件写得再花哨,硬件底子不行,通信一样抓瞎。这一章,我就带你把CMS32这颗芯片的CAN相关硬件摸透。
2.1 CMS32系列MCU概述
CMS32系列,说白了就是专为工业控制和汽车电子设计的32位ARM Cortex-M0+内核MCU。我最早接触这个系列是在一个车载网关项目上,当时选型看中的就是它集成了双CAN控制器,而且价格实在。
它的几个关键特点,我列出来给你看:
| 特性 | 说明 | 我的评价 |
|---|---|---|
| 内核 | ARM Cortex-M0+,最高48MHz | 够用,功耗低 |
| CAN控制器 | 内置2路CAN 2.0B控制器 | 双路独立,很实用 |
| 存储 | 64KB Flash,8KB SRAM | 中等容量,CAN协议栈够用 |
| 工作温度 | -40℃ ~ +125℃ | 车规级,放心用 |
| 封装 | LQFP48 / LQFP64 | 手工焊接友好 |
我个人习惯,选MCU先看CAN控制器路数。如果你只需要单路CAN,CMS32有性价比更高的型号。但如果你要做CAN网关或者需要冗余通信,那双路控制器就是刚需。
小提示: CMS32的CAN控制器挂载在APB总线上,时钟源可以选择PCLK。我建议你初始化时把CAN时钟配到最高,这样波特率设置更灵活。
2.2 CAN控制器内部结构
CMS32的CAN控制器,内部结构其实挺清晰的。我画了一张图,你一看就明白:
你看这个结构,数据流向很清楚:CPU通过APB总线配置控制器,数据先经过发送/接收缓冲区,再通过验收滤波器过滤,最后从CAN TX/RX引脚出去。
这里有个坑,我曾经踩过——验收滤波器的配置。CMS32的验收滤波器支持两种模式:
- 单滤波模式:32位标识符+屏蔽码,适合标准帧和扩展帧混用
- 双滤波模式:两个16位滤波器,适合只收标准帧的场景
我建议你刚开始调试时,先把验收滤波器设成「接收所有帧」模式,等通信调通了再细化滤波规则。不然你滤波器配错了,总线上一帧数据都收不到,你还以为是硬件坏了。
警告: CMS32的CAN控制器复位后,验收滤波器默认是全部屏蔽的。也就是说,你不配置滤波器,一帧数据都收不到。很多新手在这里卡半天。
2.3 CAN收发器选型:TJA1050 vs SN65HVD230
MCU内部的CAN控制器输出的是TTL电平的CAN TX/RX信号,不能直接挂到CAN总线上。你需要一个收发器,把信号转换成CAN总线的差分电平。
市面上收发器很多,我重点讲两款我用得最多的:TJA1050和SN65HVD230。
| 参数 | TJA1050 | SN65HVD230 |
|---|---|---|
| 工作电压 | 4.75V ~ 5.25V | 3.0V ~ 3.6V |
| 速率 | 最高1Mbps | 最高1Mbps |
| 待机模式 | 支持(STB引脚) | 支持(S引脚) |
| 斜率控制 | 不支持 | 支持(Rs引脚) |
| 工作温度 | -40℃ ~ +125℃ | -40℃ ~ +125℃ |
| 典型应用 | 工业控制、车载 | 低功耗、便携设备 |
怎么选?我个人的经验是这样的:
- 如果你的系统是5V供电,比如工业PLC、车载设备,直接上TJA1050。它皮实耐造,我有个项目在发动机舱里跑了三年没出过问题。
- 如果你的系统是3.3V供电,比如电池供电的便携设备,用SN65HVD230。它可以直接和3.3V的MCU对接,省掉电平转换。
这里有个细节,SN65HVD230的Rs引脚可以接电阻来调节斜率。我建议你接一个10kΩ电阻到地,这样既能抑制EMI,又不影响最高速率。
实战经验: 我曾经在一个项目中,TJA1050的CANH和CANL引脚忘记接终端电阻,结果总线通信时好时坏。查了两天才发现是终端电阻没焊。记住:CAN总线两端各需要1个120Ω终端电阻。
2.4 典型硬件连接
最后,我给你一个典型的CMS32 + TJA1050硬件连接图:
CMS32 MCU TJA1050
+--------+ +--------+
| CAN_TX |----------->| TXD |
| CAN_RX |<-----------| RXD |
| | | |
| VCC_3V3| | VCC_5V |
| GND |------------| GND |
+--------+ +--------+
|
+-----+-----+
| |
CANH CANL
| |
+----120Ω---+ (终端电阻)
| |
CAN_H CAN_L (接总线)
注意几个要点:
- CMS32的CAN_TX/RX引脚要配置为复用功能,不是普通GPIO
- TJA1050的VCC是5V,CMS32的VCC是3.3V,电平不匹配?不用担心,TJA1050的输入阈值兼容3.3V逻辑
- 终端电阻一定要加,不加的话信号反射会导致误码