3. 硬件平台准备:目标板卡与CAN收发器选型
做驱动移植,最怕什么?最怕板子还没跑起来,先被硬件坑一把。我这些年踩过的坑,十有七八都出在硬件检查环节。今天咱们就把目标板卡和CAN收发器这块彻底捋清楚。
3.1 目标板卡选型:i.MX6ULL vs STM32MP1
做嵌入式Linux网关,这两款芯片是主流选择。我个人的习惯是:先看项目需求,再定芯片。别一上来就追新,稳定才是王道。
| 对比项 | i.MX6ULL | STM32MP1 |
|---|---|---|
| 内核架构 | 单核Cortex-A7 @ 800MHz | 单核/双核Cortex-A7 + M4协核 |
| CAN控制器 | FlexCAN(2路) | bxCAN(2路) |
| Linux支持 | 非常成熟,主线内核完美支持 | 官方提供Yocto/OpenSTLinux |
| 实时性 | 纯A7,需RT补丁 | M4核可做实时处理 |
| 成本 | 较低,适合批量 | 略高,适合复杂场景 |
我个人更倾向于i.MX6ULL做网关。为什么?它的FlexCAN模块在Linux内核里支持得特别好,驱动代码几乎不用大改。我记得有一次给客户做方案,对方非要用STM32MP1,结果M4核和A7核之间的CAN数据共享折腾了两周。说白了,如果不需要M4做实时控制,i.MX6ULL省心得多。
3.2 CAN收发器选型:TJA1050 vs SN65HVD230
选收发器这事儿,看着简单,其实门道不少。你想想看,控制器负责协议处理,收发器才是真正和物理总线打交道的那位。选错了,通信距离、速率、抗干扰全完蛋。
核心原则:收发器的电源电压必须和板卡IO电平匹配。i.MX6ULL的IO是3.3V,STM32MP1也是3.3V。千万别用5V的收发器直接怼,否则烧IO是迟早的事。
| 参数 | TJA1050 | SN65HVD230 |
|---|---|---|
| 工作电压 | 4.75V ~ 5.25V | 3.0V ~ 3.6V |
| IO电平 | 5V | 3.3V |
| 速率 | 最高1Mbps | 最高1Mbps |
| 待机模式 | 支持(STB引脚) | 支持(S引脚) |
| 适用场景 | 工业环境,长距离 | 低功耗,3.3V系统 |
这里有个坑,我曾经踩过。TJA1050是5V器件,如果直接接3.3V的控制器,TXD/RXD引脚的电平不匹配。虽然有些板子用电阻分压凑合,但信号质量很差,总线出错率飙升。我的建议是:3.3V系统用SN65HVD230,5V系统用TJA1050,别混用。
小技巧:SN65HVD230的S引脚(待机模式)可以接GPIO控制。平时让收发器进入待机,需要通信时再唤醒,能省不少电。我在做车载网关时就用过这招,整机功耗降了30%。
3.3 原理图与硬件连接检查
原理图检查是硬件调试前的最后一道防线。我见过太多人,板子打回来才发现CAN_TX和CAN_RX接反了,或者终端电阻没焊。下面这张图是我总结的标准连接方案:
3.4 硬件连接检查清单
每次拿到新板子,我都会按下面这个清单过一遍。别嫌麻烦,这一步省了,后面调试能省十倍时间。
- 电源检查:用万用表量收发器VCC引脚,确认电压在规格范围内。SN65HVD230是3.3V±0.3V,TJA1050是5V±0.25V。
- 信号线检查:CAN_TX和CAN_RX有没有接反?用示波器看波形,空闲时CAN_H和CAN_L都应该是2.5V左右。
- 终端电阻:总线两端各有一个120Ω电阻。用万用表量CAN_H和CAN_L之间的电阻,正常应该是60Ω(两个120Ω并联)。
- 地线连接:所有节点的GND必须共地。浮地会导致共模电压超标,严重时烧收发器。
- 去耦电容:收发器VCC引脚旁边必须放一个0.1μF陶瓷电容,距离不超过5mm。我见过有人偷懒没放,结果总线信号毛刺多到没法看。
警告:千万不要在CAN总线上使用星型拓扑。CAN总线要求是直线型,分支长度越短越好。分支超过30cm,信号反射就会导致通信失败。我曾经在一个项目里吃过这个亏,现场改了三天才找到原因。
3.5 实战:检查原理图的关键点
拿到原理图,我一般先看这几个地方:
- CAN控制器引脚:i.MX6ULL的FlexCAN有TXD和RXD两个引脚,确认它们连到了收发器的对应引脚。别信原理图上的网络标号,一定要顺着线走一遍。
- 收发器模式引脚:SN65HVD230的S引脚(待机模式)如果悬空,内部上拉会让它进入待机状态。需要正常工作时,必须拉低。我习惯用GPIO控制,这样软件可以动态管理功耗。
- 隔离方案:工业环境强烈建议用隔离CAN收发器,比如ISO1050。非隔离方案在雷击或电机启停时很容易烧器件。
我的经验:第一次上电前,先别急着跑驱动。用示波器抓一下CAN_TX引脚的波形,手动发几个显性位看看。如果波形干净、幅值正确,再往下走。这一步能帮你快速定位是硬件问题还是软件问题。