Skip to main content
Visitor II
May 14, 2024
Solved

Cannot get can0 interface to appear on STM32MP157f-dk2

  • May 14, 2024
  • 6 replies
  • 4441 views

Hello,

I am trying to setup CANbus on the STM32MP157f-dk2 board, but I am unable to get any CAN interface to appear. I have installed the STM32MP1 OpenSTLinux Developer-Package onto the board, and I am using an SN65HVD230 transceiver.

First I tried enabling pins PB12 and PB13 for FDCAN2, and connecting the transceiver to GPIO pins 10 and 36 on the board.

For device tree configuration, I generated a device tree source file with STM32CubeMX and copied the pinctrl and m_can2 bindings from the generated file into "stm32mp157f-dk2.dts" located in the kernel sources. I then compiled the device tree using "make ARCH=arm dtbs". I then copy stm32mp157f-dk2.dtb to the board.

I attached the exact dts file I am using.


For driver configuration, I believe the BOSCH M_CAN driver is enabled by default, so I did not change anything in Menuconfig. Although I doubled checked that the selections were correct.

 

IanY_4-1715666366381.png

IanY_5-1715666429018.png

 


The can0 interface does not appear as an available network interface:

root@stm32mp1:~# ls /sys/class/net
end0  lo  usb0 wlan0


I also checked the log messages to see if the driver was properly set up:

root@stm32mp1:~# dmesg | grep CAN
[    0.310964] CAN device driver interface
[    0.361318] NET: Registered PF_CAN protocol family


Then I checked the device-tree on the board and it seems the device is enabled:

root@stm32mp1:/proc/device-tree/soc/etzpc@5c007000# cat can@4400f000/status
okay


Another thing I have tried is setting up FDCAN1 by adding the m_can1 binding to the end of "stm32mp157f-dk2.dts".

&m_can1 {
pinctrl-names = "default", "sleep";
pinctrl-0 = <&m_can1_pins_b>;
pinctrl-1 = <&m_can1_sleep_pins_b>;
status = "okay";
};

This binding will set the pinctrl to pins PA11 and PA12, which connect to pins 5 and 3 of CN2 on the board. However, I am experiencing the exact same issue in this scenario. I see the same log messages as above, and confirmed that the can@4400e000 status is okay.


I started to wonder if maybe the interface will not be available if there is no transceiver connected? I have tried connecting my SN65HVD230 transceiver, but this does not seem to make any difference.

I am also wondering if there is a problem with how I am modifying the device tree sources? Or perhaps there are issues if some other devices are also using the same pins?

I noticed in the post https://community.st.com/t5/stm32-mpus-products/how-to-setup-fdcan-on-stm32mp157f-dk2/td-p/66594 the op said they removed the i2c pullup resistors connected to pins PA11 and PA12. I am assuming they mean they desoldered those resistors from the board? Is that really necessary?

Any help would be greatly appreciated!

    This topic has been closed for replies.
    Best answer by IanY

    In "stm32mp157c0dk2-scmi.dtsi" which was included from "stm32mp157f-dk2.dts", I found this binding:
    &rcc {
    compatible = "st,stm32mp1-rcc-secure", "syscon";
    clock-names = "hse", "hsi", "csi", "lse", "lsi";
    clocks = <&scmi_clk CK_SCMI_HSE>,
    <&scmi_clk CK_SCMI_HSI>,
    <&scmi_clk CK_SCMI_CSI>,
    <&scmi_clk CK_SCMI_LSE>,
    <&scmi_clk CK_SCMI_LSI>;
    };


    I then modified the m_can1 binding in "stm32mp157f-dk2.dts" so that the line:
    "clocks = <&rcc CK_HSE>, <&rcc FDCAN_K>;"
    would be replaced with
    "clocks = <&scmi_clk CK_SCMI_HSE>, <&rcc FDCAN_K>;"

    I attached my complete stm32mp157f-dk2.dts file.

    This is the same solution as for this post:
    https://community.st.com/t5/stm32-mpus-products/fdcan-can-not-start-no-clock-found/m-p/613570

    After compiling with this change, the no clock found error went away and the can0 interface became available.

    I still have no idea how the FDCAN_K property is used, or where it is defined.

    6 replies

    IanYAuthor
    Visitor II
    May 16, 2024

    Taking a closer look at this post https://community.st.com/t5/stm32-mpus-products/how-to-setup-fdcan-on-stm32mp157f-dk2/td-p/66594, it appears the op actually put the resisters back on the board, and another user also had success while leaving the resistors in place. So that answers one of my questions.


    I built the kernel according to the instructions on this page: https://wiki.st.com/stm32mpu/wiki/Getting_started/STM32MP1_boards/STM32MP157x-DK2/Develop_on_Arm%C2%AE_Cortex%C2%AE-A7/Modify,_rebuild_and_reload_the_Linux%C2%AE_kernel

    These instructions make no mention of building U-boot, OP-TEE, or T-FA. I have not even extracted the archives for these components, because I am not modifying them.

    I am focusing now on enabling m_can1 as per the example on https://wiki.st.com/stm32mpu/wiki/FDCAN_device_tree_configuration

    by appending these lines to the existing "stm32mp157f-dk2.dts" file in the kernel sources.

    &m_can1 {
    pinctrl-names = "default", "sleep";
    pinctrl-0 = <&m_can1_pins_b>;
    pinctrl-1 = <&m_can1_sleep_pins_b>;
    status = "okay";
    };

    After compiling the dtb and copying it to the board, I checked the kernel logs again with dmesg. This time I searched for "can" in lower case.


    root@stm32mp1:~# dmesg | grep can
    [ 0.372228] can: controller area network core
    [ 0.372360] can: raw protocol
    [ 0.372374] can: broadcast manager protocol
    [ 0.372390] can: netlink gateway - max_hops=1
    [ 2.101847] m_can_platform 4400e000.can: no clock found

    The m_can1 binding defined in "stm32mp153.dtsi" contains this property.
    clocks = <&rcc CK_HSE>, <&rcc FDCAN_K>;

    But when I grep for "rcc CK_HSE" and "rcc FDCAN_K" in the kernel device tree sources, I don't get any results.

    Where is the rcc binding defined? Do I need to modify the device tree sources for U-boot, OP-TEE, or T-FA to configure the RCC?

    IanYAuthorAnswer
    Visitor II
    May 19, 2024

    In "stm32mp157c0dk2-scmi.dtsi" which was included from "stm32mp157f-dk2.dts", I found this binding:
    &rcc {
    compatible = "st,stm32mp1-rcc-secure", "syscon";
    clock-names = "hse", "hsi", "csi", "lse", "lsi";
    clocks = <&scmi_clk CK_SCMI_HSE>,
    <&scmi_clk CK_SCMI_HSI>,
    <&scmi_clk CK_SCMI_CSI>,
    <&scmi_clk CK_SCMI_LSE>,
    <&scmi_clk CK_SCMI_LSI>;
    };


    I then modified the m_can1 binding in "stm32mp157f-dk2.dts" so that the line:
    "clocks = <&rcc CK_HSE>, <&rcc FDCAN_K>;"
    would be replaced with
    "clocks = <&scmi_clk CK_SCMI_HSE>, <&rcc FDCAN_K>;"

    I attached my complete stm32mp157f-dk2.dts file.

    This is the same solution as for this post:
    https://community.st.com/t5/stm32-mpus-products/fdcan-can-not-start-no-clock-found/m-p/613570

    After compiling with this change, the no clock found error went away and the can0 interface became available.

    I still have no idea how the FDCAN_K property is used, or where it is defined.

    Visitor II
    June 29, 2024

    Hi,

    I had the same problem enabling the m_can1. 

    I use the solution that modify the clock, the m_can1 bus is working, howerver, the DSI display is going wrong. 

    I think it might be that the dsi and can share the same clock source.

    Do you have the same problem or have any idea to fix this?

     

    IanYAuthor
    Visitor II
    June 30, 2024

    I had actually removed the display for this project.

    Perhaps if you check the discovery kit user manual UM2534 and the alternate function table in the STM32MP157f datasheet, you could find a different pair of CAN pins exposed on the development board. You could also try enabling m_can2 instead of m_can1.

    Note the m_can1_pins_b property is defined in one of the pin control DTI files included from stm32mp157f-dk2.dts. So if you look in that DTI file you can find other pin combinations for m_can1 and m_can2.

    Explorer
    January 12, 2025

    @IanY wrote:

    I started to wonder if maybe the interface will not be available if there is no transceiver connected?


    So, Is it necessary to connect the transceiver?

    Explorer
    January 31, 2025

    @IanY @xchen  I am trying run CAN. But I have weird problem, which one described below:

    can-communication-on-stm32mp157f-dk2 

    Do you have any idea what can be wrong ?

    Visitor II
    February 6, 2025

    Use m_can2 instead of m_can1.

    Explorer
    February 6, 2025

    @xchento use m_can2, I should change pins to m_can2_pins_a ?

    m_can2_pins_a included PB13 i PB5 pins. PB13 i on CN2 connector , but PB5, according with documentation:

    PB5 is used as ETH_CLK not the default configuration.

    How did you deal with it ? Where the PB5 is located on board  ?

    Are you used  below marked place to connect transceiver (PB5 - RX ) ?

    PB5.jpg

     

    Visitor II
    February 6, 2025

    PB13 and PB12

    Explorer
    February 6, 2025

    @xchen

    Thank you !

    m_can1 and m_can2  works perfectly with DSI display.

    The problem with my display was generated by my wrong written application - I had reciving frames based on while loop which on bloking my program.