AnsweredAssumed Answered

Unable to send CAN frames on imx6dlsabresd

Question asked by Sheng Kai Kao on Oct 27, 2016
Latest reply on Apr 11, 2018 by Amit Kulkarni

Hello!

I'm using imx6dlsabresd board and trying to enable the CAN bus.

My kernel version is 4.1.15

In the device tree imx6qdl-sabresd.dtsi I have included the followings:

 

reg_can_xcvr: regulator@5 {
compatible = "regulator-fixed";
reg = <5>;
regulator-name = "CAN XCVR";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_flexcan_xcvr>;
gpio = <&gpio4 21 GPIO_ACTIVE_HIGH>;
enable-active-low;
};

 

&can1 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_flexcan1>;
xceiver-supply = <&reg_can_xcvr>;
trx-stby-gpio = <&gpio4 5 GPIO_ACTIVE_LOW>;
status = "okay";

};

 

pinctrl_flexcan1: flexcan1grp {
fsl,pins = <
MX6QDL_PAD_GPIO_7__FLEXCAN1_TX 0x1b0b0
MX6QDL_PAD_GPIO_8__FLEXCAN1_RX 0x1b0b0
MX6QDL_PAD_GPIO_19__KEY_COL5 0x1b0b0
>;
};

 

pinctrl_flexcan_xcvr: flexcan-xcvrgrp {
fsl,pins = <
MX6QDL_PAD_DISP0_DAT0__GPIO4_IO21 0x1b0b0 /* Flexcan XCVR enable */
>;
};

 

and in imx6qdl.dtsi have included:


can1: flexcan@02090000 {
compatible = "fsl,imx6q-flexcan";
reg = <0x02090000 0x4000>;
interrupts = <0 110 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clks IMX6QDL_CLK_CAN1_IPG>,
<&clks IMX6QDL_CLK_CAN1_SERIAL>;
clock-names = "ipg", "per";
stop-mode = <&gpr 0x34 28 0x10 17>;
status = "okay";
};

 

The CAN bus can be enabled by "ip link set canX up type can bitrate 125000"

However, whenever I tried to send a frame, it failed.

I use "ip -details -statistics link show can0" and it says:

 

2: can0: <NO-CARRIER,NOARP,UP,ECHO> mtu 16 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 10
link/can promiscuity 0
can state BUS-OFF (berr-counter tx 0 rx 0) restart-ms 0
bitrate 125000 sample-point 0.875
tq 500 prop-seg 6 phase-seg1 7 phase-seg2 2 sjw 1
flexcan: tseg1 4..16 tseg2 2..8 sjw 1..4 brp 1..256 brp-inc 1
clock 30000000
re-started bus-errors arbit-lost error-warn error-pass bus-off
0                0               0             1                0                1
RX: bytes packets errors dropped overrun mcast
      16       2            0          0           0            0
TX: bytes packets errors dropped carrier collsns
      0        0             0          0           0            0

 

then I tun off can0 and turn on again,

 

2: can0: <NOARP,UP,LOWER_UP,ECHO> mtu 16 qdisc pfifo_fast state UP mode DEFAULT group default qlen 10
link/can promiscuity 0
can state ERROR-ACTIVE (berr-counter tx 0 rx 0) restart-ms 0
bitrate 125000 sample-point 0.875
tq 500 prop-seg 6 phase-seg1 7 phase-seg2 2 sjw 1
flexcan: tseg1 4..16 tseg2 2..8 sjw 1..4 brp 1..256 brp-inc 1
clock 30000000
re-started bus-errors arbit-lost error-warn error-pass bus-off
0                0                0            1               0             1
RX: bytes packets errors dropped overrun mcast
      16       2           0         0            0          0
TX: bytes packets errors dropped carrier collsns
       0       0            0         1            0          0

 

I was sending a frame and it was dropped; instead I received two packets?

I have no idea how to deal with this problem. 

Any help would be greatly appreciated.

Outcomes