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控制器,内部结构其实挺清晰的。我画了一张图,你一看就明白:

CMS32 CAN控制器内部结构 CPU核心 Cortex-M0+ APB总线 外设总线桥 CAN控制器核心 CAN 2.0B 协议引擎 支持标准帧/扩展帧 发送缓冲区 3级深 FIFO 接收缓冲区 2级深 FIFO 验收滤波器 32位屏蔽/标识符模式 CAN TX / RX GPIO复用引脚 中断控制器 NVIC嵌套中断 注意: 验收滤波器可配置为单滤波或双滤波模式

你看这个结构,数据流向很清楚: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  (接总线)

注意几个要点:

  1. CMS32的CAN_TX/RX引脚要配置为复用功能,不是普通GPIO
  2. TJA1050的VCC是5V,CMS32的VCC是3.3V,电平不匹配?不用担心,TJA1050的输入阈值兼容3.3V逻辑
  3. 终端电阻一定要加,不加的话信号反射会导致误码