1. MCP2515与Linux CAN总线基础
第一次接触CAN总线是在一个工业控制项目里,当时需要让RK3399开发板通过MCP2515芯片与PLC通信。作为嵌入式工程师,我发现很多新手会被CAN总线的专业术语吓到,其实它的核心逻辑特别像我们日常用的微信群——每个设备都是群成员,可以主动发消息(帧),也能接收别人发的消息,而且不需要群主协调。
MCP2515这颗芯片相当于给Linux系统装了个"CAN网卡",它通过SPI接口与主控连接。我常跟团队新人说:"把它想象成USB转串口芯片,只不过转换的是CAN协议"。内核自带的mcp251x驱动已经帮我们处理了大部分脏活累活,我们要做的就像配置WiFi模块一样,告诉系统三件事:
- 用哪个SPI接口(比如SPI1)
- 中断引脚接在哪个GPIO上
- 供电电压是多少
实际接线时最容易踩的坑是时钟线。有次我死活调不通,后来发现是SCK线走了15cm的飞线,SPI时钟频率降到1MHz才稳定。建议使用长度小于10cm的导线,双面板的话最好做阻抗匹配。硬件连接可以参考这个清单:
- INT → GPIO2_D0(下降沿触发)
- SCK → SPI1_CLK(建议加33Ω串联电阻)
- SI/SO → SPI1_MOSI/MISO(注意防短路)
- CS → SPI1_CS0(Active Low)
- VCC → 3.3V(必须加100nF去耦电容)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 设备树配置详解
在RK3399上配置设备树就像给新员工办入职手续,得把工位(寄存器地址)、工作设备(时钟源)、紧急联系方式(中断)都交代清楚。下面这个配置模板我用了不下20次,关键参数都加了注释:
dts复制mcp251x_clk: mcp251x-clk {
compatible = "fixed-clock";
#clock-cells = <0>;
clock-frequency = <20000000>; // 必须20MHz晶振
};
&spi1 {
status = "okay";
max-freq = <48000000>; // SPI控制器上限
pinctrl-names = "default";
pinctrl-0 = <&spi1_clk &spi1_tx &
