IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> iMX6UL配置MCP2515模块(SPI转CAN)——基于迅为iTOP-iMX6UL开发板 -> 正文阅读

[嵌入式]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插槽原理图
MCP2515原理图
??通过查看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的设备树帮助文档。
在这里插入图片描述
??我们可以根据该帮助文档的提示信息来仿写一个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文件即可。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-09-12 13:19:13  更:2021-09-12 13:19:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/30 1:09:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码