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接反了,或者终端电阻没焊。下面这张图是我总结的标准连接方案:

CAN总线硬件连接架构图 CAN总线硬件连接架构图 i.MX6ULL FlexCAN控制器 SN65HVD230 CAN收发器 CAN_TX CAN_RX 120Ω终端 CAN_H CAN总线 STM32MP1 bxCAN控制器 TJA1050 CAN收发器 检查清单: 1. CAN_TX/CAN_RX是否交叉连接?控制器TX→收发器TX,控制器RX→收发器RX 2. 终端电阻是否在总线两端各焊一个120Ω? 3. 收发器电源去耦电容是否靠近VCC引脚放置? 4. 共模扼流圈是否预留位置?强干扰环境必备

3.4 硬件连接检查清单

每次拿到新板子,我都会按下面这个清单过一遍。别嫌麻烦,这一步省了,后面调试能省十倍时间。

  1. 电源检查:用万用表量收发器VCC引脚,确认电压在规格范围内。SN65HVD230是3.3V±0.3V,TJA1050是5V±0.25V。
  2. 信号线检查:CAN_TX和CAN_RX有没有接反?用示波器看波形,空闲时CAN_H和CAN_L都应该是2.5V左右。
  3. 终端电阻:总线两端各有一个120Ω电阻。用万用表量CAN_H和CAN_L之间的电阻,正常应该是60Ω(两个120Ω并联)。
  4. 地线连接:所有节点的GND必须共地。浮地会导致共模电压超标,严重时烧收发器。
  5. 去耦电容:收发器VCC引脚旁边必须放一个0.1μF陶瓷电容,距离不超过5mm。我见过有人偷懒没放,结果总线信号毛刺多到没法看。

警告:千万不要在CAN总线上使用星型拓扑。CAN总线要求是直线型,分支长度越短越好。分支超过30cm,信号反射就会导致通信失败。我曾经在一个项目里吃过这个亏,现场改了三天才找到原因。

3.5 实战:检查原理图的关键点

拿到原理图,我一般先看这几个地方:

  • CAN控制器引脚:i.MX6ULL的FlexCAN有TXD和RXD两个引脚,确认它们连到了收发器的对应引脚。别信原理图上的网络标号,一定要顺着线走一遍。
  • 收发器模式引脚:SN65HVD230的S引脚(待机模式)如果悬空,内部上拉会让它进入待机状态。需要正常工作时,必须拉低。我习惯用GPIO控制,这样软件可以动态管理功耗。
  • 隔离方案:工业环境强烈建议用隔离CAN收发器,比如ISO1050。非隔离方案在雷击或电机启停时很容易烧器件。

我的经验:第一次上电前,先别急着跑驱动。用示波器抓一下CAN_TX引脚的波形,手动发几个显性位看看。如果波形干净、幅值正确,再往下走。这一步能帮你快速定位是硬件问题还是软件问题。