二十六、IIO子系统 + SPI子系统 + ICM20608

前言

这篇文章记录和学习IIO和SPI子系统,并用它们实现运动和姿态传感器ICM20608的驱动,最后编写应用接入飞控模拟平台进行检测。

ICM20608基础知识

简介

ICM20608是一款运动和姿态传感器,其内部包含3轴加速度和3轴陀螺仪传感器,还有一个温度传感器,它们都是16位的ADC,转换出来的数据都是16位的。

下图为ICM20608的姿态轴的极性:

ICM20608通信接口可选SPI或I2C。这里我们使用SPI,因为SPI为全双工传输,速率更快,时序如下:

ICM20608会将各个传感器转换出来的数据保存在它们各自的数据寄存器中,我们可以读取这些寄存器获得转换数据。ICM20608还有一个512字节的FIFO缓冲区,如果开启了FIFO,那么这些转换数据还会被放进FIFO中,以免丢失,这对需要有连续数据流的应用场景非常重要。

ICM20608有一个中断引脚,我们可以通过配置寄存器来让ICM20608在某些情况下从这个引脚输出中断信,这里我们配置数据就绪中断来通知CPU有数据产生了,以便CPU及时来读取数据。对于ICM20608而言,数据就绪是指所有启用的传感器都转换好了数据并且可以读取了,而不是只某一个传感器准备好了数据。比如如果同时启用了3轴加速度 + 3轴陀螺仪 + 温度传感,那么数据就绪是指它们的数据都转换好了。如果启用了FIFO,那么我们可以从FIFO中一次性获取这14个字节的转换数据。

FIFO有一个计数寄存器,用于记录FIFO中有多少数据,所以我们可以在FIFO中的数据积累到一定数量的时候再一次性取走,而不是每次数据就绪的时候都去读取14个字节,这样可以减小SPI传输的开销。

寄存器设置

通过前述的简介,我们主要配置ICM20608如下:

  1. 启用3轴加速度和3轴陀螺仪
  2. 启用FIFO功能
  3. 启用数据就绪中断
  4. 其它的一些必要配置,比如设置检测量程,SPI参数等

设备树

ALIENTEK IMX6ULL ALPHA开发板上,ICM20608部分的原理图如下:

其挂在ECSPI3控制器下,片选引脚连接到主控的GPIO1_IO20,中断引脚连接到主控的GPIO1_IO10。

设备树文件中,ICM20608节点描述如下:

bash 复制代码
&iomuxc {
	...
	pinctrl_icm20608: icm20608grp {
		fsl,pins = <
			MX6UL_PAD_JTAG_MOD__GPIO1_IO10 0xb0b0 /* int pin */
		>;
	};
};

&ecspi3 {
	fsl,spi-num-chipselects = <1>;
	cs-gpios = <&gpio1 20 GPIO_ACTIVE_LOW>; /* use gpio1_io20 as chip select */
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_ecspi3>;
	status = "okay";

	icm20608@0 {
		compatible = "alientek,icm20608";
		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_icm20608>;
		reg = <0>;

		interrupt-parent = <&gpio1>;
		interrupts = <10 IRQ_TYPE_LEVEL_LOW>;

		/* SPI MODE3 */
		spi-cpol;
    	spi-cpha;
		spi-max-frequency = <8000000>;
	};
};

驱动程序

应用程序

飞控平台模拟

未完待续。。。

相关推荐
爱丽_1 天前
Linux 安装 MySQL 与远程连接排障(yum 方案)
linux·运维·mysql
Felven1 天前
麒麟信安系统忘记root密码解决说明
linux·运维·服务器
IMPYLH1 天前
Linux 的 base64 命令
linux·运维·服务器·bash·shell
程序员果子1 天前
Nginx 从入门到精通:全面解析与实战指南
linux·运维·服务器·nginx
道清茗1 天前
【RH134知识点问答题】第11章 管理网络安全
linux·安全·web安全
微露清风1 天前
系统性学习Linux-第七讲-库制作与原理
linux·运维·学习
Kindavid1 天前
【嵌入式】瑞芯微RK3566芯片移植主线linux并适配wifi蓝牙驱动
linux·嵌入式·rk3566·rockchip·泰山派·ap6212
yashuk1 天前
Redis的安装教程(Windows+Linux)【超详细】
linux·数据库·redis
认真的薛薛1 天前
解决openclaw下载OMM问题
linux·编辑器·vim
知无不研1 天前
共享内存(Shared Memory)深度全解:Linux高性能IPC的核心机制与实战
linux·运维·c++·共享内存·共享内存与互斥锁