AnsweredAssumed Answered

i.MX6ULL CAN的使用问题

Question asked by li hu on Nov 21, 2019
Latest reply on Jan 20, 2020 by changjing chi

硬件:i.MX6ull

软件:yocot_uboot_2016 + yocot_kernel_4.1.15   

 

NXP的工程师们,我在使用i.MX6ULL的CAN的时候遇到了很奇怪的问题。现在将问题的描述如下:

首先,要使用CAN接口,高版本内核需要先适配其设备树。

<1>imx6ull-14x14-xxx.dts

   &flexcan1 {
      pinctrl-names = "default";
      pinctrl-0 = <&pinctrl_flexcan1>;
      xceiver-supply = <&reg_can_3v3>;
      status = "okay";
   };

   &flexcan2 {
      pinctrl-names = "default";
      pinctrl-0 = <&pinctrl_flexcan2>;
      xceiver-supply = <&reg_can_3v3>;
      status = "okay";
   };

   

   pinctrl_flexcan1: flexcan1grp{
      fsl,pins = <
         MX6UL_PAD_UART3_RTS_B__FLEXCAN1_RX 0x1b020
         MX6UL_PAD_UART3_CTS_B__FLEXCAN1_TX 0x1b020
      >;
   };

   pinctrl_flexcan2: flexcan2grp{
      fsl,pins = <
         MX6UL_PAD_UART2_RTS_B__FLEXCAN2_RX 0x1b020
         MX6UL_PAD_UART2_CTS_B__FLEXCAN2_TX 0x1b020
      >;
   };

<2>imx6ull.dtsi这个文件不用修改

   flexcan1: can@02090000 {
      compatible = "fsl,imx6ul-flexcan", "fsl,imx6q-flexcan";
      reg = <0x02090000 0x4000>;
      interrupts = <GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH>;
      clocks = <&clks IMX6UL_CLK_CAN1_IPG>,
         <&clks IMX6UL_CLK_CAN1_SERIAL>;
      clock-names = "ipg", "per";
      stop-mode = <&gpr 0x10 1 0x10 17>;
      status = "disabled";
   };

   flexcan2: can@02094000 {
      compatible = "fsl,imx6ul-flexcan", "fsl,imx6q-flexcan";
      reg = <0x02094000 0x4000>;
      interrupts = <GIC_SPI 111 IRQ_TYPE_LEVEL_HIGH>;
      clocks = <&clks IMX6UL_CLK_CAN2_IPG>,
         <&clks IMX6UL_CLK_CAN2_SERIAL>;
      clock-names = "ipg", "per";
      stop-mode = <&gpr 0x10 2 0x10 18>;
      status = "disabled";
   };

<3>驱动程序为flexcan.c,此处无需任何改动

======================================

>>> 编译生成uboot.imx、zImage、dtb

>>> 烧写成功,系统启动 !!!

======================================

系统启动后,通过ifconfig -a查看can0、can1已经存在,只是没有启动

按照“i.MX_Linux_Reference_Manual”中的指导,执行以下命令:

ip link set can0 down

ip link set can0 up type can bitrate 500000

can1也是一样的操作,至此can0、can1 all becomes ready !!!

下面硬件连接can0与can1,HH相连,LL相连。执行以下命令:

candump can1 &

cansend can0 123#1122334455667788

 

问题来了,为什么can1口接收不到任何数据?我用示波器测量了cpu直接出来的pins,也没有任何波形。

 

尝试了各种角度,依旧没有找到问题的原因。

a.怀疑pin脚功能被定义错误,仔细检查了uboot和kernel中并没有出现复用其他功能的情况,读取寄存器的值也是正常的      0x20

b.尝试替换官方evk的zImage和dtb后,上述问题依然存在

c.can0发送,can1接收的过程中,ifconfig观察RX、TX的数据变化,遇到了不正常的现象

开始发送接收前:

开始后:

 

 

需要的话,附件为我的内核config文件和dts文件,请查阅。

请NXP的FAE or AE ,帮忙解决下这个问题,谢谢。

Outcomes