This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] PROCESSOR-SDK-AM62X:在内核中启用 TCAN1044V CAN

Guru**** 1872900 points
Other Parts Discussed in Thread: TCAN1044-Q1
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1308660/processor-sdk-am62x-enable-tcan1044v-can-in-the-kernel

器件型号:PROCESSOR-SDK-AM62X
主题中讨论的其他器件:TCAN1044-Q1、TCAN1043

您好、TI 支持、

我们拥有 AM62X 定制板,它具有2X TCAN1044-Q1 CAN 收发器,并将其映射到 MCAN0和 MCU_CAN0。 我使用的是 SDK 09_00_00_03。 我没有找到适合它的 Linux 驱动程序。

请帮助我如何启用内核中的 CAN 接口。

我启用了 以下内核标志  

请查找 CAN DTS 文件更改  

//添加了 mcan0的相位
&main_mcan0{
pinctrl-names ="默认";
pinctrl-0 =<&main_mcan0_pins_default>;
状态="可以";
};

&MCU_mcan1{
pinctrl-names ="默认";
pinctrl-0 =<&mcu_mcan0_pins_default>;
状态="可以";
};

//为 mcan0引脚多路复用添加

MAIN_mcan0_PINS_DEFAULT:MAIN_mcan0_PINS_DEFAULT{
PINCCTRL-SINGLE、PINS =<
AM62X_IOPAD (0x1dc、PIN_INPUT、0)/*(E15) AM62X_MCAN0_RX_G */
AM62X_IOPAD (0x1d8、PIN_OUTPUT、0)/*(C15) AM62X_MCAN0_TX\G */
>;
};
//针对 MCU_CAN0引脚添加
MCU_mcan0_PINS_DEFAULT:mcu_mcan0_PINS_DEFAULT{
PINCCTRL-SINGLE、PINS =<
AM62X_IOPAD (0x038、PIN_INPUT、0)/*(B3) AM62X_MCU_MCAN0_RX_G */
AM62X_IOPAD (0x034、PIN_OUTPUT、0)/*(D6) AM62X_MCU_MCAN0_TX\G */
>;
};

MAIN_GPIO0 (&M) {
 p59
     GPIO-HOG;
     GPIO =<59 GPIO_ACTIVE_LOW>;
     输出低电平;
     线路名称="MCAN1_STB";
    };

};

 我发现 k3-am62-mcu.dtsi 中不存在 mcu_mcan0节点

在内核中观察到以下日志:

root@am62xx-evm:~# dmesg | grep can
[15.635177] HugeTLB: 0 KiB vmemmap 可以被释放用于1.00 GiB 页
[ 15.648535] HugeTLB: 0 KiB vmemmap 可以被释放用于32.0 MIB 页面
[15.661882] HugeTLB:0 KiB vmemmap 可以被释放用于2.00 MIB 页面
[15.675229] HugeTLB: 0 KiB vmemmap 可以被释放用于64.0 KiB 页面
[16.470584] CAN:控制器局域网核心
[ 16.875630] m_can_platform 4e00000.can: m_can device registered (IRQ=0,version=32)
[ 16.886603] m_can_platform 20701000.can: m_can device registered (IRQ=248, version=32)


root@am62xx-EVM:~# ip link set CAN1 type CAN bitrate 500000
root@am62xx-EVM:~# IP link set up CAN1
root@am62xx-EVM:~#  cansend CAN1 123#11223344556677

m_can_platfrom 20701000.can CAN1:bus-off

root@am62xx-EVM:~#  cansend CAN1 123#11223344556677

root@am62xx-EVM:~#  cansend CAN1 123#11223344556677

root@am62xx-EVM:~# ip link set CAN0 type CAN bitrate 500000
root@am62xx-evm:~# ip link set up CAN0
root@am62xx-EVM:~#  cansend CAN0 123#11223344556677

m_can_platfrom 20701000.can CAN0:bus-off

root@am62xx-EVM:~#  cansend CAN0 123#11223344556677

root@am62xx-EVM:~#  cansend CAN0 123#11223344556677

当我给第一次 cansnd 命令得到总线关闭时,然后下一次没有得到总线关闭,但数据不发送

root@am62xx-EVM:~#

谢谢。

纳雷什

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!  

    有任何关于这一点的更新吗?

    谢谢,

    纳雷什

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您能否提供有关该接口如何连接到其他 CAN 设备的示意图?

    我有两个链接供您查看。 第一个可能对您更有用。 我以为有一个页面是关于你提到的 dtsi 支持,但我目前没有看到它,我会检查一下,然后在一天左右回到你. 第二个是内核用户指南、其中包含了您正在使用的命令。

    MCAN 操作指南

    内核用户指南

    此致、

    舒耶勒

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Schuyler:

    感谢您提供信息。

    当我发出下面的命令,它的抛出错误

    IP 链路设置 CAN0类型 CAN 比特率50000 FD ON 
    RTNETLINK 应答:不支持的操作

    我刚才只启用了 MCAN ,暂时禁用 MCU_CAN0。
    以下是 MCAN0 (CAN0为节点)的日志:



    请帮我解决这个问题。

    谢谢。

    纳雷什

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Nareesh、

    k3-am62-mcu.dtsi 上不存在 MCAN 节点、该节点实际上也存在。 请访问: https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/tree/arch/arm64/boot/dts/ti/k3-am62-mcu.dtsi?h=ti-linux-6.1.y-cicd#n164。

    可能适用于 TCAN1044的器件树绑定是 ti、tcan104x-can.YAML、适用于 TCAN104x CAN 收发器 Phy。

    总线关闭可能是某处的连接错误、也可能是为 CAN 收发器供电的方式。 您是否会使用 AM62x SK 为 CAN 收发器供电? 如果是、默认情况下 J3接头上的3.3V 和5V 电源轨未启用、这可能是您的问题。

    此处提供与 CAN 收发器的连接的原理图或说明也会对您有所帮助。

    ~朱迪斯

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Judith、您好!

    感谢您提供相关信息。

    在第一篇文章我提到了 DTS 文件信息,你能不能查看?

    示例:  

    #包含

    transceiver1: can-phy {
    兼容="ti、tcan1043";
    #phy-cells =<0>;
    最大位速率=<5000000>;
    STANDBY-GPIO =<&WAKEUP_GPIO1 16 GPIO_ACTIVE_LOW>;
    ENABLE-GPIO =<&MAIN_GPIO1 67 GPIO_ACTIVE_HIGH>;
    MUX 状态=<&mux0 1>;
    };

    我观察到 ti、tcan104x-can.yAML 文件、其中  tcan1043 驱动程序不存在

    我可以知道 多路复用器设置是什么-> 多路复用 器状态=<&mux0 1>;来自设备树吗?

    对于我的板备用 GPIO 那里,没有启用 GPIO ?

    我猜是 STB 信号导致的总线关闭错误吗?  

    我们是否需要将 STB 信号连接到 GND?

    谢谢。

    纳雷什

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Nareesh、

    兼容的驱动程序="ti、tcan1043";在 Linux 中是否存在、请参阅 drivers/phy-can-收 发器。 如您所见、待机和使能信号是可选的 、如果您不需要它们、您可以从器件树中省略。

    请问您的用例是什么? 您的是否需要启用这些信号?

    您使用的是 TI EVM 还是定制电路板?

    我不擅长处理硬件或 TCAN 收发器、但我最好猜测:

    多路复用状态器件树属性为: "MUX 控制器节点、用于将信号从控制器路由到收发器"。

    如果观察 AM64 GP EVM、您会看到以下情况:我们有一个多路复用器来确定 CAN 信号路由的位置、但多路复用器上的"S"选择引脚使用10K 电阻器接地。 因此、我们不会在器件树节点中包含多路复用器状态=<&mux0 1>;。 在您的情况下、这可能有所不同、SoC 和 CAN 收发器之间是否有多路复用器?

    STB 路由到 IO 扩展器、其中信号名为 MCAN0_STB_3V3、 因此、对于 STB、我们使用:STANDBY-GPIO =<&exp1 9 GPIO_ACTIVE_HIGH>;。 同样的逻辑也可用于启用 GPIO。



    请回答以下问题:

    1.对于我的板备用 GPIO 那里,没有启用 GPIO ?
    2.
    我猜是由于 STB 信号导致的总线关闭错误吗?
    3.是否需要将 STB 信号连接到 GND?

    为了回答这些问题、我们需要更多有关硬件布局的信息。

    ~朱迪斯

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Judith、您好!

    感谢您提供信息。

    将 STB 信号连接到 GND 后,

    我们能够通过 CAN 分析器发送和接收 CAN 交易。

    请查找用于 MCAN0测试的以下步骤:

    我们尝试了以下比特率和数据速率组合: 比特率=125kbps、数据速  率=2mbps /比特率=500kbps、数据速率=2mbps /比特率=500kbps、数据速率=5mbps。

    • ifconfig -A CAN0 down   
    • IP 链路设置 CAN0类型 CAN 比特率50000
    • IP 链路设置 CAN0类型 CAN 比特率50000 FD ON -   ,此抛出 RTNETLINK :操作不受支持。
    • IP 链路设置 CAN0类型 CAN 比特率1000000比特率4000000 FD ON
    • ifconfig -A CAN0 up

      发送 CAN 2.0帧 -工作中

    • CANSend CAN0 123#DEADBEEF

          在 CAN 分析仪上,我能够接收数据, 从发送数据从 CAN 分析仪 和接收数据板.

          发送 CAN FD 帧  -不工作  

    • CANSend CAN0 113#2AAAAAAAA

          使用 BRS 发送 CAN FD 帧 -不工作  

    • CANSend CAN0 143#1AAAAAAAAAAA

    仅供参考、  我在下面的器件树 中添加了 k3-am625-sk.dts 的"/"节点中 的 CAN 信息。 请让我知道 ,我是对吗?  使用/不使用这些设备树更改,执行上述测试。

    Transceiver1:CAN-phy0{
    兼容="ti、tcan1043";
    #phy-cells =<0>;
    最大位速率=<5000000>;
    pinctrl-names ="默认";
    pinctrl-0 =<&main_mcan0_pins_default>;

    };

    请帮助我为什么 在执行此命令时出现此故障=> IP 链路设置 CAN0类型 CAN 比特率50000 FD 在   

    谢谢。

    纳雷什

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Nareesh、

    好的、Processor SDK 中有一个名为 k3-am62x-sk-mcan.dtso 的示例覆盖层。 如果您喜欢、可以参考这个覆盖层: git.ti.com/.../k3-am62x-sk-mcan.dtso

    在您的收发器节点中:

    transceiver1: can-phy0 {
    compatible = "ti,tcan1043";
    #phy-cells = <0>;
    max-bitrate = <5000000>;
    pinctrl-names = "default";
    pinctrl-0 = <&main_mcan0_pins_default>;
    
    };


    最后两行应该会进入 MCAN 节点、如下所示:
    &main_mcan0 {
        pinctrl-names = "default";
        pinctrl-0 = <&main_mcan0_pins_default>;
        phys = <&transceiver1>;
        status = "okay";
    };


    ~朱迪斯

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您在第一篇文章中的每个节点都是正确的、似乎您也有:

    &main_gpio0 {
      p59{
              gpio-hog;
              gpios = <59 GPIO_ACTIVE_LOW>;
              output-low;
             line-name = "MCAN1_STB";
           };
    
    };



    因此、以下内容应该适合您:

    待机 GPIO =<&exp1 GPIO_ACTIVE_HIGH>;


    但如果您只是想将 STB 连接到 GND、也可以。 根据数据表: www.ti.com/.../tcan1044-q1.pdf、这样收发器只能在正常模式下工作

    ~朱迪斯

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Judith、您好!

    感谢您提供信息、

    如果我在 DTS 文件中按如下方式进行配置,则 CAN0节点不显示。

    root@am62xx-evm:~# ifconfig -a
    LO Link encap:本地回送
    iNet 地址:127.0.0.1掩码:255.0.0.0
    上环回运行 MTU:65536 Metric:1
    Rx 数据包:250错误:0已丢弃:0超限:0帧:0
    TX 数据包:250个错误:0丢弃:0溢出:0载波:0
    冲突:0队列 txelen:1000
    RX 字节:16424 (16.0 KiB) TX 字节:16424 (16.0 KiB)

    wwan0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
    POINTOPOINT NOARP MTU:1500公制:1
    Rx 数据包:0错误:0丢弃:0溢出:0帧:0
    TX 数据包:0错误:0丢弃:0溢出:0载波:0
    冲突:0队列 txelen:1000
    RX 字节:0 (0.0 B) TX 字节:0 (0.0 B)

    wwan1 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
    POINTOPOINT NOARP MTU:1500公制:1
    Rx 数据包:0错误:0丢弃:0溢出:0帧:0
    TX 数据包:0错误:0丢弃:0溢出:0载波:0
    冲突:0队列 txelen:1000
    RX 字节:0 (0.0 B) TX 字节:0 (0.0 B)

    =>在内核 menuconfig 中 也启用 trnascever 节点,driver -> phys substsem -> CAN 收发器

    DTS 文件配置:  

    //为 mcan0添加

    main_pmxo{
    MAIN_mcan0_PINS_DEFAULT:MAIN_mcan0_PINS_DEFAULT{
    PINCCTRL-SINGLE、PINS =<
    AM62X_IOPAD (0x1dc、PIN_INPUT、0)/*(E15) AM62X_MCAN0_RX_G */
    AM62X_IOPAD (0x1d8、PIN_OUTPUT、0)/*(C15) AM62X_MCAN0_TX\G */
    //AM62X_IOPAD (0x0ec、PIN_INPUT、7)/*(AA24) STB0 */
    >;
    };

    };

    &main_mcan0{
    pinctrl-names ="默认";
    pinctrl-0 =<&main_mcan0_pins_default>;
    PHY =<&transceiver1>;
    状态="可以";
    };

    在/节点下添加以下内容

    Transceiver1:CAN-phy0{
    兼容="ti、tcan1043";   //我累了两个名字 tcan1043 , tcan1042
    #phy-cells =<0>;
    最大位速率=<5000000>;
    pinctrl-names ="默认";
    pinctrl-0 =<&main_mcan0_pins_default>;

    };

    TCAN1044是我们的 CAN 芯片组 tcan1043 &tcan1042?

    我不知道该怎么说?

    请在这个问题上帮助我。

    谢谢。

    纳雷什