飞凌嵌入式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 
 
 
 |   
 
  
  
  
 
 
 | 
| 
 | 
| 
 | 
| 
 | 
 |