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 = <®_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 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文件即可。
iMX6UL配置MCP2515模块(SPI转CAN)——基于迅为iTOP-iMX6UL开发板的更多相关文章
- 基于迅为-i.MX6Q开发板制作镜像方法
在“/home/imx6”目录(在前面编译 android 系统的时候新建过这个目录,如果没有可以自己新建一个)下,使用命令“mkdir minilinux/”新建 minilinux 目录,使用命令 ...
- 【基于mini2440开发板的交叉编译环境及内核树配置.
在学习linux驱动开发过程中,交叉编译环境的配置及内核树的生成无疑是对linux不是十分了解的新人面前的一堵墙.高高大大的墙...笔者在初探这一方向时,就在这2个问题上苦恼了很久.查阅无数资料,大多 ...
- 分布式文件系统 - FastDFS 配置 Nginx 模块及上传测试
也不说废话,直接干 上一篇 分布式文件系统 - FastDFS 在 CentOS 下配置安装部署 中安装了 FastDFS 后,并配置启动了 Tracker 和 Storage 服务,已经可以上传文件 ...
- springboot2.0 JPA配置自定义repository,并作为基类BaseRepository使用
springboot2.0 JPA配置自定义repository,并作为基类BaseRepository使用 原文链接:https://www.cnblogs.com/blog5277/p/10661 ...
- FastDFS 配置 Nginx 模块,并实现分布式同步-Linux
1.搭建虚拟机 a.复制虚拟机文件 首先复制我们之前安装好的fastdfs虚拟机,因为我们现在要设置它的IP为21,改名为CentOS-fastdfs - 21. b.设置网络 生成新的MAC地址 设 ...
- Maven最佳实践 划分模块 配置多模块项目 pom modules
所有用Maven管理的真实的项目都应该是分模块的,每个模块都对应着一个pom.xml.它们之间通过继承和聚合(也称作多模块,multi-module)相互关联.那么,为什么要这么做呢?我们明明在开发一 ...
- maven 配置多模块项目 pom modules
所有用Maven管理的真实的项目都应该是分模块的,每个模块都对应着一个pom.xml.它们之间通过继承和聚合(也称作多模块,multi-module)相互关联.那么,为什么要这么做呢?我们明明在开发一 ...
- Arduino 基于 ESP8266 配置WIFI模块
Arduino 基于 ESP8266 配置WIFI模块 使用ESP8266作为服务器,使用浏览器访问该服务器,从而控制LED灯 选择 [文件]->[示例]->[ESP8266WIFI]-& ...
- vsftpd架设(配置pam模块)
Vsftpd 是很安全的ftp软件 VSFTPD的目录结构 /usr/sbin/vsftpd: VSFTPD的可执行文件 /etc/rc.d/init.d/vsftpd:启动脚本 /etc/vsftp ...
随机推荐
- SpringCloud升级之路2020.0.x版-3.Eureka Server 与 API 网关要考虑的问题
本系列为之前系列的整理重启版,随着项目的发展以及项目中的使用,之前系列里面很多东西发生了变化,并且还有一些东西之前系列并没有提到,所以重启这个系列重新整理下,欢迎各位留言交流,谢谢!~ 之前我们提到了 ...
- Hadoop 3.1.1 - Yarn - 使用 CGroups
在 Yarn 上使用 CGroups CGroups 是一种将任务及其子任务聚集和划分进一个垂直的分组的策略,并提供在此结构上的特别的操作.CGroups 是 Linux 内核功能,自内核版本 2.6 ...
- WordPress如何配置邮件发送?
WordPress配置了邮件发送最直接的用处就是可以通过邮件找回密码,当然还有其他的用处,比如Wordpress有新用户注册,订单状态.评论等发生变化时给管理员发送邮件提醒等. 经过大量用户实践反馈, ...
- 什么是CIDR?
英文缩写: CIDR (Classless InterDomain Routing) 中文译名: 无类别域间路由选择 IP地址有"类"的概念,/8掩码是A类,/16掩码是B类,/2 ...
- 解决 OnDropFiles 可能无响应的问题【转】
大多数程序都有接收拖放文件的功能,即是用鼠标把文件拖放到程序窗口上方,符合格式的文件就会自动被程序打开.最近自己对编写的程序增加了一个拖放文件的功能,在 Windows XP.Windows Serv ...
- k8s之Service详解-Service使用
实验环境准备 在使用service之前,首先利用deployment创建出3个pod,注意要为pod设置app=nginx-pod的标签 创建deployment.yaml,内容如下 apiVersi ...
- 慕慕生鲜上线&&腾讯云服务器配置准备
1.购买服务器并配置环境 1.1 购买 618购买了腾讯云服务器三年最低配置(1核2G 1Mbps 50G云盘),一时激动忘记了购买前领优惠券,痛失25元. 1.2 环境配置 系统是 CentOS L ...
- Java调用Zookeeper
watch机制 Zookeeper watch是一种监听通知机制,可以随时监听一些数据的变化,从而实现数据的及时性. Zookeeper所有的读操作getData(), getChildren()和 ...
- Git连接github以及gitee等使用教程
Git连接github以及gitee等使用教程 一.初始化本次仓库 在想要放置仓库的文件夹出git bash输入命令 git init 二.生成ssh 在github或者gitee注册账户, 在本地生 ...
- 源码安装nginx开启SSL功能
编译安装nginx的环境 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 下载nginx安装包 cd /usr/ ...