zoukankan      html  css  js  c++  java
  • iMX6UL配置MCP2515模块(SPI转CAN)——基于迅为iTOP-iMX6UL开发板

    写在前面

      在文章“嵌入式Linux的CAN总线配置——基于迅为iTOP-4412开发板”中我给4412开发板配置了SPI转CAN模块,使用的是不带设备树的内核。在本篇文章中,要使用支持设备树的内核,给iMX6UL开发板配置MCP2515。
      打开iMX6UL开发板的串口终端,输入命令ifconfig -a,可以看到CAN0和CAN1两个设备,这是iMX6UL芯片自带的两路FlexCAN。

      在完成配置MCP2515模块之后,输入命令ifconfig -a,可以看到三路CAN,其中CAN1和CAN2是iMX6UL芯片自带的两路FlexCAN,而CAN0便是通过MCP2515实现的SPI转CAN。

    硬件连接

      将SPI转CAN模块插到iMX6UL开发板的GPIO插槽上。

      需要注意的是,该GPIO插槽中的PIN脚没有支持ECSPI的,所以我们在这里用的SPI是把相应的PIN脚用软件模拟出的SPI。

      通过查看GPIO插槽和SPI转CAN的原理图,可以知道MCP2515和GPIO插槽上PIN脚的对应关系。共需要五个PIN脚,分别是SPI_SCK,SPI_CS,SPI_MOSI,SPI_MISO,以及中断引脚MCP2515_INT。
      再查看核心板的文档,可以获得MCP2515的这五个脚和iMX6UL芯片PIN脚的对应关系,如下表所示。

    MCP2515 iMX6UL
    SPI_SCK GPIO5_IO11
    SPI_CS GPIO1_IO09
    SPI_MOSI GPIO5_IO10
    SPI_MISO GPIO3_IO07
    MCP2515_INT GPIO1_IO31

    修改设备树

      进入内核目录,使用命令vim Documentation/devicetree/bindings/net/can/microchip,mcp251x.txt打开关于MCP2515的设备树帮助文档。

      可以根据该帮助文档的提示信息来仿写一个CAN节点。
      再开一个终端,进入内核目录,使用命令vim arch/arm/boot/dts/imx6ul-14x14-evk_emmc.dts打开开发板对应的设备树文件(设备树文件可能会因开发板型号的不同而不同,请打开你的开发板对应的设备树文件)。在设备树的根节点下,可以看到一个名为“spi4”的设备节点,这个节点对应的就是模拟SPI。

      ①首先在“spi4”节点前增加一个时钟节点,如下图所示。

       clocks {
    
                    mcp2515_clock: mcp2515_clock {
                            compatible = "fixed-clock";
                            #clock-cells = <0>;
                            clock-frequency  = <8000000>; //对应模块上晶振的频率,我的是8MHz的
                            };
    
                    };
    

      ②然后对“spi4”节点做修改,并删除它的子节点“gpio_spi”,然后根据帮助文档自己写一个“can0”节点作为“spi4”节点的子节点,如下图所示(注释部分为所做的修改或添加)。

       spi4 {
                    compatible = "spi-gpio";
                    pinctrl-names = "default";
                    pinctrl-0 = <&pinctrl_spi4>;
                    //pinctrl-assert-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;//这个引脚用不到
                    status = "okay";
                    gpio-sck = <&gpio5 11 0>;
                    gpio-mosi = <&gpio5 10 0>;
                    gpio-miso = <&gpio3 7 0>; //增加SPI_MISO引脚
                    //cs-gpios = <&gpio5 7 0>;
                    cs-gpios = <&gpio1 9 0>; //修改SPI_CS对应的引脚
                    num-chipselects = <1>;
                    #address-cells = <1>;
                    #size-cells = <0>;
    
                    can0: can0@1 {
                    compatible = "microchip,mcp2515";
                    reg = <0>; //地址从0开始
                    clocks = <&mcp2515_clock>; //使用刚刚自己写的时钟
                    interrupt-parent = <&gpio1>; //中断引脚配置,中断引脚是GPIO1_IO31
                    interrupts = <31 0x2>; //中断引脚配置,中断引脚是GPIO1_IO31,参数0x2表示触发方式
                    vdd-supply = <&reg_can_3v3>; //使用3.3V供电
                    xceiver-supply = <&reg_can_3v3>; //使用3.3V供电
    
                    spi-max-frequency = <1000000>; //最后增加spi最大频率设置,设置为1MHz
                    };
            };
    

      ③找到节点“pinctrl_spi4”,在该节点中添加SPI_CS和SPI_MISO相关的引脚,如下图所示(有注释的部分为所做的添加)。

    pinctrl_spi4: spi4grp {
                            fsl,pins = <
                                    MX6UL_PAD_BOOT_MODE0__GPIO5_IO10        0x70a1
                                    MX6UL_PAD_BOOT_MODE1__GPIO5_IO11        0x70a1
                                    MX6UL_PAD_SNVS_TAMPER7__GPIO5_IO07      0x70a1
                                    MX6UL_PAD_SNVS_TAMPER8__GPIO5_IO08      0x80000000
                                    MX6UL_PAD_GPIO1_IO09__GPIO1_IO09        0x80000000 /*SPI_CS*/
                                    MX6UL_PAD_LCD_DATA02__GPIO3_IO07        0x70a1 /*SPI_MISO*/
                            >;
                    };
    

      ④搜索“gpio1 9”和“GPIO1_IO09”,注释掉设备树文件自带的和GPIO1_IO09引脚相关的内容(因为这个脚被我们用做SPI_CS了),如下图所示。

      ⑤搜索“I2C2_SCL”、“LCD_DATA00”、“LCD_DATA02”,注释掉设备树原有的相关语句,如下图所示。

      ⑥搜索“spi_gpio”,把所有和“spi_gpio”相关的语句全部注释掉,否则会编译出错(因为节点“spi_gpio”已经被删除了),如下图所示。


      ⑦然后分别进入设备树文件“arch/arm/boot/dts/topeet_emmc_4_3.dts”、“arch/arm/boot/dts/topeet_emmc_5_0.dts”、“arch/arm/boot/dts/topeet_emmc_7_0.dts”、“arch/arm/boot/dts/topeet_emmc_9_7.dts”、“arch/arm/boot/dts/topeet_emmc_10_1.dts”、“arch/arm/boot/dts/topeet_emmc_1024x600.dts”这六个设备树文件,删除“gpio_spi”相关的语句,如下图所示。

    裁剪内核

      进入内核根目录下,使用命令export ARCH=arm,指定架构。然后使用命令make menuconfig进入内核裁剪界面。
      ①进入“Device Drivers--->SPI support--->”,选中“GPIO-based bitbanging SPI Master”和“Freescale i.MX SPI controllers ”

      ②然后进入“Networking support--->CAN bus subsystem support--->CAN Device Drivers--->CAN SPI interfaces--->”,选中“Microchip MCP251x SPI CAN controllers”。

      保存,并退出。

    编译和烧写

      编译内核和设备树,并将编译出来的内核和设备树文件烧写到开发板中。重启设备,MCP2515设备便可以使用了。

    目前存在的问题

      每次设备重启后,第一次使用命令ifconfig can0 up启动MCP2515会提示没有该设备,再启动一次就能正常启动了。

      设备树源码在这里,下载下来后覆盖掉“arch/arm/boot/dts/”路径下相应的dts文件即可。

    作者:山无言

    E-mail:shanwuyan@outlook.com

    本博客所有文章仅用于学习、研究和交流目的,欢迎非商业性质转载。

    文章如有谬误,欢迎大家指正。

  • 相关阅读:
    城市的划入划出效果
    文本溢出省略解决笔记css
    长串英文数字强制折行解决办法css
    Poj 2352 Star
    树状数组(Binary Indexed Trees,二分索引树)
    二叉树的层次遍历
    Uva 107 The Cat in the Hat
    Uva 10336 Rank the Languages
    Uva 536 Tree Recovery
    Uva10701 Pre, in and post
  • 原文地址:https://www.cnblogs.com/UnfriendlyARM/p/15255263.html
Copyright © 2011-2022 走看看