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>;

&spm=1001.2101.3001.5002&articleId=155835491&d=1&t=3&u=d520507dc2434e15b29b3e77e1f91cf5)
446

被折叠的 条评论
为什么被折叠?



