实战SPI转CAN:从设备树配置到Linux驱动调试全解析(附CSM300移植指南)

1. 理解SPI转CAN的核心需求

在实际的嵌入式开发中,我们经常会遇到一个棘手的问题:主控芯片的CAN接口数量不够用。比如一些SOC芯片原生只支持1-2路CAN,但在工业控制、汽车电子这些领域,CAN总线节点数量需求往往远超这个数字。更麻烦的是,有些芯片的CAN控制器甚至存在硬件缺陷,会出现丢帧或者错帧的情况。

这时候SPI转CAN方案就派上用场了。我最早接触这个方案是在一个车载项目上,当时主控的CAN接口不够用,硬件工程师推荐了CSM300这颗芯片。CSM300是一款专门做SPI转CAN的桥接芯片,它内部集成了微处理器、CAN收发器和隔离电路,相当于一个完整的CAN节点解决方案。

这种方案最大的优势是灵活。你不需要更换主控芯片,只需要通过SPI接口连接CSM300,就能扩展出额外的CAN通道。而且SPI接口在大多数SOC上都是现成的,软件上只需要编写相应的设备驱动就能搞定。

2. 硬件设计要点

2.1 电平匹配问题

CSM300有CSM300和CSM300A两个版本,主要区别是工作电压不同。CSM300是5V,CSM300A是3.3V。这个选择很重要,因为涉及到电平匹配问题。

我记得有一次调试,SOC端是1.8V电平,直接连CSM300A的3.3V接口,结果SPI通信完全不通。后来用示波器一量,发现1.8V的电平在CSM300A这边根本识别不到。解决办法是在中间加了电平转换芯片,比如TXS0108E这类双向电平转换器。

2.2 关键引脚连接

CSM300有几个重要的控制引脚需要特别注意:

  • MODE引脚:必须接高电平,选择SPI模式
  • RST引脚:复位引脚,低电平有效
  • CFG引脚:模式选择,高电平是数据传输模式,低电平是配置模式
  • CTL0/CTL1:主机控制引脚,用于选择操作模式
  • INT引脚:中断输出,数据到达时会产生下降沿

在实际布线时,这些控制引脚最好都用GPIO单独控制,不要直接拉高或拉低。我遇到过因为CTL0引脚没控制好,导致芯片一直处于配置模式,无法正常收发数据的情况。

2.3 隔离设计

CSM300内部已经有2500VDC的隔离,这是它的一个很大优势。但是在实际设计中,CAN总线端的滤波和防护还是不能省。建议在CANH和CANL线上加共模电感和TVS管,特别是工业现场应用,总线上的干扰很厉害。

3. 设备树配置详解

3.1 基础节点定义

设备树配置是驱动开发的第一步,也是很容易出错的地方。先来看一个完整的设备树配置示例:

csm300@0 {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_csm300>;
    gpios = <&gpio 114 0    /* ctl0 */
             &gpio 113 0    /* ctl1 */
             &gpio 76 0     /* rst */
             &gpio 107 0>;  /* cfg */
    interrupt-parent = <&gpio>;
    interrupts = <196 IRQ_TYPE_LEVEL_LOW>;
    compatible = "zhiyuan,csm300";
    spi-max-frequency = <500000>;
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值