iMX6UL配置MCP2515模块(SPI转CAN)——基于迅为iTOP-iMX6UL开发板

摘要:
mcp2515_时钟{compatible=“fixed Clock”;时钟频率=<//此引脚不使用status=“okay”;gpio mosi=<//Add SPI_MISO引脚//cs gpios=&lt,//修改SPI_cs对应的引脚num芯片集=<
写在前面

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

iMX6UL配置MCP2515模块(SPI转CAN)——基于迅为iTOP-iMX6UL开发板第1张

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

iMX6UL配置MCP2515模块(SPI转CAN)——基于迅为iTOP-iMX6UL开发板第2张

硬件连接

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

iMX6UL配置MCP2515模块(SPI转CAN)——基于迅为iTOP-iMX6UL开发板第3张

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

iMX6UL配置MCP2515模块(SPI转CAN)——基于迅为iTOP-iMX6UL开发板第4张

iMX6UL配置MCP2515模块(SPI转CAN)——基于迅为iTOP-iMX6UL开发板第5张

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

MCP2515iMX6UL
SPI_SCKGPIO5_IO11
SPI_CSGPIO1_IO09
SPI_MOSIGPIO5_IO10
SPI_MISOGPIO3_IO07
MCP2515_INTGPIO1_IO31
修改设备树

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

iMX6UL配置MCP2515模块(SPI转CAN)——基于迅为iTOP-iMX6UL开发板第6张

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

iMX6UL配置MCP2515模块(SPI转CAN)——基于迅为iTOP-iMX6UL开发板第7张

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

iMX6UL配置MCP2515模块(SPI转CAN)——基于迅为iTOP-iMX6UL开发板第8张

   clocks {

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

                };

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

iMX6UL配置MCP2515模块(SPI转CAN)——基于迅为iTOP-iMX6UL开发板第9张

   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相关的引脚,如下图所示(有注释的部分为所做的添加)。

iMX6UL配置MCP2515模块(SPI转CAN)——基于迅为iTOP-iMX6UL开发板第10张

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了),如下图所示。

iMX6UL配置MCP2515模块(SPI转CAN)——基于迅为iTOP-iMX6UL开发板第11张

iMX6UL配置MCP2515模块(SPI转CAN)——基于迅为iTOP-iMX6UL开发板第12张

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

iMX6UL配置MCP2515模块(SPI转CAN)——基于迅为iTOP-iMX6UL开发板第13张

iMX6UL配置MCP2515模块(SPI转CAN)——基于迅为iTOP-iMX6UL开发板第14张

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

iMX6UL配置MCP2515模块(SPI转CAN)——基于迅为iTOP-iMX6UL开发板第15张
iMX6UL配置MCP2515模块(SPI转CAN)——基于迅为iTOP-iMX6UL开发板第16张

  ⑦然后分别进入设备树文件“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”相关的语句,如下图所示。

iMX6UL配置MCP2515模块(SPI转CAN)——基于迅为iTOP-iMX6UL开发板第17张

裁剪内核

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

iMX6UL配置MCP2515模块(SPI转CAN)——基于迅为iTOP-iMX6UL开发板第18张

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

iMX6UL配置MCP2515模块(SPI转CAN)——基于迅为iTOP-iMX6UL开发板第19张

  保存,并退出。

编译和烧写

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

目前存在的问题

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

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

免责声明:文章转载自《iMX6UL配置MCP2515模块(SPI转CAN)——基于迅为iTOP-iMX6UL开发板》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇1015 德才论 (25)(25 分)点击状态栏回到顶部两种实现下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Python实现网页自动化-浏览器查找元素(二)

前言 在上一节中(https://mp.weixin.qq.com/s/lqYEjiqA4eLI59GkDEpKcg)已经部署了Selenium+chromedriver的开发环境,在真正的开发之前,还需要学会利用浏览器来查找网页元素。 因为Selenium是通过程序来自动操控网页的控件元素,比如单击某个按钮、输入文本框内容等,若网页中有多个同类型的元素,...

Asp.net(asp,jsp)+JavaScript动态实现添加数据行

           在应用程序的开发中,有些输入信息是动态的,比如我们要注册一个员工的工作经历,比如下图 如果做成死的,只能填写三个,如果是四个呢?或者更多呢,那不是添加不上去了吗,所以这样固然不好,我们可以用动态添加表格行实现,如下图,添加一行,输入一行信息,这样比较灵活 下面我们就来看看如何在asp和asp.net中结合javascript来实现...

Preference 使用详解

极力推荐文章:欢迎收藏Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容: Perference 简介 Perference 使用方法 使用XML定义Preference 使用Fragment 定义Preference...

【安全】CSRF、XSS攻击了解与防范

============================== 目录   一、了解CSRF攻击及防范   二、了解XSS攻击及防范 =============================== 一、了解CSRF攻击及防范 1、了解csrf   中文叫跨站请求伪造,指攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击...

ag-grid实时监测复选框变化

监测复选框变化  1.最终效果:     点击复选框,页面显示已选中多少条          2. 实现步骤:     1. 在ag-grid中添加: @selection-changed="onSelectionChanged" <ag-grid-vue class="table ag-theme-b...

Spring Data JPA整合REST客户端Feign时: 分页查询的反序列化报错的问题

Type definition error: [simple type, class org.springframework.data.domain.Page]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot con...