回答

收藏

飞凌嵌入式ElfBoard ELF1板卡-开发板适配之SPI-六轴传感器

其他 其他 790 人阅读 | 0 人回复 | 2025-02-08

SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线。SPI的通信以主从方式工作,一般需要4根线,MISO(主设备数据输入)、MOSI(主设备数据输出)、SCLK(时钟)、CS(片选)。i.MX6ULL有4路SPI接口,ELF 1开发板使用了SPI1连接到六轴传感器icm20607上。操作六轴传感器的方式是把初始化的部分封装到驱动中,在应用中只需调用该驱动的读写数据接口,不必关心设备的具体操作。
硬件原理


从原理图中可以看到,六轴传感器相连的引脚分别为:时钟SPI1_SCLK、片选SPI1_SS0、输出SPI1_MOSI、输入SPI1_MISO、中断ICM-20607_INT,分别对应的PAD NAME为,LCD_DATA20、LCD_DATA21、LCD_DATA22、LCD_DATA23(六轴传感器的中断引脚没有用到,所以此处不进行配置)。由于ElfBoard的LCD采用的是RGB565,空出来的8位数据线可以用作其他功能。

IOMUX配置
在arch/arm/boot/dts/imx6ul-pinfunc.h中找到相关宏
MX6UL_PAD_LCD_DATA20__ECSPI1_SCLK
MX6UL_PAD_LCD_DATA21__GPIO3_IO26
MX6UL_PAD_LCD_DATA22__ECSPI1_MOSI
MX6UL_PAD_LCD_DATA23__ECSPI1_MISO
在设备树文件arch/arm/boot/dts/imx6ull-elf1-emmc.dts的IOMUX节点下添加子节点(暂时先不添加中断引脚,目前没有用到中断):
pinctrl_ecspi1: ecspi1grp {
                      fsl,pins = <
                      MX6UL_PAD_LCD_DATA20__ECSPI1_SCLK       0x10b0
                      MX6UL_PAD_LCD_DATA21__GPIO3_IO26         0x10b0
                      MX6UL_PAD_LCD_DATA22__ECSPI1_MOSI       0x10b0
                      MX6UL_PAD_LCD_DATA23__ECSPI1_MISO       0x10b0
                        >;
                };
添加后效果如下:

在添加IOMUX之后,还要检查一下在设备树的其他地方是否把LCD_DATA20,LCD_DATA21,LCD_DATA22,LCD_DATA23复用为其他功能了。我们先在arch/arm/boot/dts/imx6ull-elf1-emmc.dts文件中搜索引脚PAD NAME,在&iomux的子节点pinctrl_lcdif_dat节点下搜索到了这几个引脚的复用,我们需要将这些注释掉:
/*     MX6UL_PAD_LCD_DATA20__LCDIF_DATA20  0x79
      MX6UL_PAD_LCD_DATA21__LCDIF_DATA21  0x79
MX6UL_PAD_LCD_DATA22__LCDIF_DATA22  0x79
MX6UL_PAD_LCD_DATA23__LCDIF_DATA23  0x79     */

添加设备节点
在arch/arm/boot/dts/imx6ull.dtsi中已经存在了spi接口的相关节点ecspi1-ecspi4,我们只需要在arch/arm/boot/dts/imx6ull-elf1-emmc.dts文件中引用相关节点,并在该节点下添加子节点spidev0:
&ecspi1 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_ecspi1>;
        fsl,spi-num-chipselects = <1>;
        cs-gpios = <&gpio3 26 GPIO_ACTIVE_LOW>;
        status = "okay";
        
        spidevicm: icm20607@0{
                compatible = "elf,icm20607";
                spi-max-frequency = <8000000>;
                reg = <0>;
         };
};
添加后的效果如下:

pinctrl-names属性值为“default”,定义了pincrtl的名字为“default”。
pinctrl-0的属性值为<&pinctrl_ecspi1 >,就是引用了之前在IOMUX中定义的pinctrl_ecspi1也就是说,在此处对IOMUX的配置进行了引用,类似函数的调用。
fsl,spi-num-chipselects的属性值为<1>,表示spi总线下边有1个从设备。
cs-gpios属性为片选引脚,选用gpio引脚作为片选,低电平有效。
status属性值设置为“okay”,表示SPI主设备可用。
接下来是子节点,对应的icm20607设备。
spidevicm是子节点标签,icm20607是节点名称。
compatible属性值为“elf,icm20607”,用于驱动匹配。
spi-max-frequency属性表示spi最大始终频率。
添加icm20607驱动
一、将ELF 1开发板资料包\02-Linux 源代码\02-1 驱动源码\01_icm20607\icm20607.c拷贝到内核源码的drivers/misc/路径下:

二、将ELF 1开发板资料包\02-Linux 源代码\02-1 驱动源码\01_icm20607\icm20607.h拷贝到内核源码的include/linux路径下:

三、修改Kconfig:
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ vi drivers/misc/Kconfig
添加以下内容:
config ICM20607
        tristate "SPI device ICM20607"
        depends on SPI && SYSFS
        help
          If you say yes here,you get support for the icm20607
添加后效果如下:

四、修改Makefile:
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ vi drivers/misc/Makefile
添加以下内容:
obj-$(CONFIG_ICM20607)          += icm20607.o
添加后效果如下:

五、将icm20607驱动编译进内核:
使用make menuconfig打开图形化配置界面:
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ make menuconfig
找到以下位置,我们可以在这里选择Y编译进内核,或者M编译成模块,或者N选择不编译。选择编译进内核:
Device Drivers
-> Misc devices

六、替换配置文件
通过make menuconfig修改的内容写入到了.config文件,当使用make imx6ull_elf1_defconfig配置内核源码时,.config文件会被覆盖,因此,需要替换原有的imx6ull_elf1_defconfig。
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ cp .config arch/arm/configs/imx6ul\l_elf1_defconfig

编译测试
编译内核和设备树并拷贝到开发板:
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ ./build.sh
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ scp arch/arm/boot/zImage   root\@172.16.0.175:/run/media/mmcblk1p1/
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ scp arch/arm/boot/dts/imx6ull-elf\1-emmc.dtb root@172.16.0.175:/run/media/mmcblk1p1/
进行sync操作后重启开发板:

使用以下命令测试六轴传感器能否读到正确数据:
root@ELF1:~# elf1_cmd_icm20607


分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

3133 积分
128 主题
+ 关注
热门推荐
关闭

站长推荐上一条 /3 下一条