回顾一下Linux平台下外挂MCP2515实现CAN通讯
Linux内核本身就已经包含MCP2515器件的驱动,因此只需要简单配置一下相关的硬件接口即可,如SPI接口,中断接口。并使能驱动即可。
mcp2515硬件介绍:
kernel/drivers/net/can/spi/mcp251x.c
以RK3399平台为例,设备树配置如下:
mcp251x_clk: mcp251x-clk {
compatible = "fixed-clock";
#clock-cells = <0>;
clock-frequency = <20000000>;
};
&spi1 {
status = "okay";
max-freq = <48000000>;
mcp2515_2: can@0 {
status = "okay";
compatible = "microchip,mcp2515";
reg = <0x00>;
clocks = <&mcp251x_clk>;
pinctrl-names = "default";
pinctrl-0 = <&can1_pins>;
interrupt-parent = <&gpio2>;
interrupts = <24 IRQ_TYPE_EDGE_FALLING>;//GPIO2_D0
spi-max-frequency = <2000000>;
poll_mode = <0>;
enable_dma = <1>;
vdd-supply = <&vcc3v3_sys>;
xceiver-supply = <&vcc3v3_sys>;
};
};
需要注意的问题点:
1、CAN波特率无法达到1M
需要提高MCP2515的晶振频率,8M无法实现,推荐20M.
2、在高速通讯时报,No buffer space available
需要修改发送缓冲区大小,默认为10 ,可以根据需要扩大,如1000
在static int mcp251x_can_probe(struct spi_device *spi)中添加:
net->netdev_ops = &mcp251x_netdev_ops;
net->flags |= IFF_ECHO;
net->tx_queue_len=1000;
因篇幅问题不能全部显示,请点此查看更多更全内容