前言
这篇文章记录和学习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如下:
- 启用3轴加速度和3轴陀螺仪
- 启用FIFO功能
- 启用数据就绪中断
- 其它的一些必要配置,比如设置检测量程,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>;
};
};
驱动程序
应用程序
飞控平台模拟
未完待续。。。