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_IO31interrupts = <31 0x2>; //中断引脚配置,中断引脚是GPIO1_IO31,参数0x2表示触发方式vdd-supply = <®_can_3v3>; //使用3.3V供电xceiver-supply = <®_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 0x70a1MX6UL_PAD_BOOT_MODE1__GPIO5_IO11 0x70a1MX6UL_PAD_SNVS_TAMPER7__GPIO5_IO07 0x70a1MX6UL_PAD_SNVS_TAMPER8__GPIO5_IO08 0x80000000MX6UL_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_spi”已经被删除了),如下图所示。
⑦然后分别进入设备树文件“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文件即可。
iMX6UL配置MCP2515模块(SPI转CAN)——基于迅为iTOP-iMX6UL开发板相关推荐
- STM32F103C8T6 LD3320语音识别模块非特定识别人声 离线控制 智能家居 开发板
STM32F103C8T6 LD3320语音识别模块非特定识别人声 离线控制 智能家居 开发板 STM32F103C8T6 LD3320语音识别模块非特定识别人声 离线控制 智能家居 开发板 测试单片 ...
- 在Ubuntu配置tftp服务器的简单几步并下载文件到开发板
1.关于TFTP的简单说明: TFTP:简单文件传输协议 是在TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂.开销不大的文件传输服务,端口号为69. 2.使用前查 ...
- (实测可用)STM32CubeMX教程-STM32L431RCT6开发板研究串口通信(SPI flash)
一.开发板平台简介: 1.开发板资源简介 (1)开发板主芯片型号:STM32L431RCT6 (2)开发板主芯片封装:LQFP-64_10x10x05P (3)开发板主芯片内核:ARM® Cortex ...
- 【基于mini2440开发板的交叉编译环境及内核树配置.
在学习linux驱动开发过程中,交叉编译环境的配置及内核树的生成无疑是对linux不是十分了解的新人面前的一堵墙.高高大大的墙... 笔者在初探这一方向时,就在这2个问题上苦恼了很久.查阅无数资料,大 ...
- android 查看gpio状态_iTOP-iMX6开发板-GPIO读写配置文档_V1.0《2》
本文档主要介绍 iMX6 板子 gpio 引脚读写配置.有关平台文件的设备注册的资料可以参 考"iTOP-iMX6-平台文件注册设备"文档.注册的设备名称是"gpio_c ...
- Arduino安装与配置ESP8266开发板(超简单,亲测有效)
文章目录 前言 一.下载Arduino 二. ESP8266环境配置(超简单,亲测有效) 三.下载验证 总结 前言 由于要上数字信号处理课程,需要安装Arduino,并在Arduino中配置ESP82 ...
- 基于DE2 115开发板驱动HC_SR04超声波测距模块【附源码】
目录 1. 实验平台与目的 2. 实验要求 3. 实验原理 3.1. 理论原理 3.2. 硬件模块时序图 4. 系统架构设计 5. 模块说明 5.1. hc_sr_driver端口信号列表 5.2. ...
- Ultra96V2开发板配置pynq以及dpu-pynq
1.准备物品 Ultra96V2开发板x1 一根usb3.0A公对microB移动硬盘数据线x1 32GB SD卡以及读卡器 x1 WiFi 2.烧写镜像 点击PYNQ网站并下载对应的镜像文件,这里我 ...
- Hi3518E开发板上添加RT5370模块
最近在搞摄像头,手上雄迈的3518e板子引出了usb接口,正好也扒出来一块带着rt5370的小板,然后焊点线就行了,剩下的就是搞移植了. 0.准备工作 虚拟机中已正常安装海思交叉工具链且path也ex ...
最新文章
- Tomcat-上传文件路径填坑
- 8种相似度度量方式的原理及实现【笔记自用】【1】
- 记录一次postfix无法收取邮件和mysql异常不能启动
- GDCM:显示GDCM Dict的测试程序
- python3 线程隔离_Python的线程隔离实现方法
- MySQL 日期时间类型
- Flex利用Datagrid来设置全选和单选
- 5月上海见-国际产学研专家集结第六届全球云计算大会中国站
- 一个小想法--理解指针的机制与汇编中的寄存器间接寻址
- 建设规划合理、高效便捷的现代物流中心——浙江嘉兴市局(公司)卷烟物流配送中心建设纪实...
- java xml sql_走进 SQL/XML
- 海森堡bug_海森堡因超速而停下来警察说,你知道你要走多快,海森堡说
- 计算机一级照片可以用红底吗,告别修图软件,教你用Excel给证件照更换多种底色!方便又省钱...
- CSR Audio Sink Application User Guide
- 全球暗网监控工具 TOP 10
- Python快捷创建文件夹和文件详解
- 局域网服务器怎么更改账号,怎么修改访问局域网共享用户名和密码
- java开发的chatGPT机器人系统
- DSt:数据结构的简介、最强学习路线(逻辑结构【数组-链表-栈和队列/树-图-哈希】、物理结构、数据运算【十大排序/四大查找-图三大搜索-树三大遍历】、高级算法【贪心/分治/动态规划】之详细攻略
- 笔记本整机性能测试软件,整机性能测试_笔记本评测-中关村在线