CAN控制器芯片MCP2510调试记录
配置CAN内核选项
配置CAN相关的内核选项,将下面几项配置添加到defconfig中:
kernel/arch/arm/configs/xxx_defconfig
CONFIG_CAN=y
CONFIG_CAN_RAW=y
CONFIG_CAN_BCM=y
CONFIG_CAN_GW=y
CONFIG_CAN_DEV=y
CONFIG_CAN_CALC_BITTIMING=y
CONFIG_CAN_MCP251X=y
在defconfig添加了配置后就不用手动配置了。要手动配置可以进入kernel目录,打开menuconfig配置。
make ARCH=arm menuconfig
进入这个路径配置can相关配置:Networking support ---> CAN bus subsystem support
修改驱动配置
有两种改法,选其一即可。
- 设备树DTS文件中修改
&spi2 {
status = "okay";
can@0 {
compatible = "microchip,mcp2510";
reg = <0>;
clocks = <&xin16m>;
// GPIO中断
interrupt-parent = <&gpio3>;
interrupts = <10 GPIO_ACTIVE_LOW>; // CAN_INT [21]
// 不同电压支持的SPI最大速率不同,SPI: VDD = 3.0V to 4.5V, 2.5MHz
spi-max-frequency = <2500000>;
pinctrl-names = "default";
pinctrl-0 = <&can_pin_ctrl &can_int>;
// SPI的极性与相位 默认是0,0
//spi-cpha = <1>;
//spi-cpol = <1>;
};
};
&pinctrl {
can {
can_int: can-int {
rockchip,pins = <3 10 RK_FUNC_GPIO &pcfg_pull_up>; // CAN_INT [21]
};
can_pin_ctrl: can-pin-ctrl {
rockchip,pins = <4 27 RK_FUNC_GPIO &pcfg_pull_none>, // CAN_STB [21]
<3 17 RK_FUNC_GPIO &pcfg_pull_up>, // CAN_RST [21]
<3 11 RK_FUNC_GPIO &pcfg_pull_none>, // CAN_RXB0 [21]
<3 12 RK_FUNC_GPIO &pcfg_pull_none>, // CAN_RXB1 [21]
<3 13 RK_FUNC_GPIO &pcfg_pull_up>, // CAN_TXB0 [21]
<3 14 RK_FUNC_GPIO &pcfg_pull_up>, // CAN_TXB1 [21]
<3 15 RK_FUNC_GPIO &pcfg_pull_up>; // CAN_TXB2 [21]
};
};
};
/ {
// 这里是配置MCP2510使用的外部时钟,16MHz
xin16m: xin16m {
compatible = "fixed-clock";
clock-frequency = <16000000>;
clock-output-names = "xin16m";
#clock-cells = <0>;
};
};
-
代码中初始化结构体
不想改设备树文件,可以直接改代码,找到驱动文件drivers/net/can/spi/mcp251x.c,在文件中添加:“static

本文详细记录了在ARM平台上配置CAN控制器MCP2510的过程,包括内核选项设置、设备树DTS修改、代码初始化和SPI通信调试。遇到的问题如接口启动错误、收发包问题通过逐步排查,最终解决于电压不匹配导致的SPI速率降低。
最低0.47元/天 解锁文章
1167

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



