目录
4.3.1 CTRL_REG1 (20h)控制寄存器1-采样频率和使能
4.3.2 CTRL_REG2 (21h)控制寄存器2-高通滤波器配置
4.3.3 CTRL_REG3 (22h)控制寄存器3-中断使能寄存器配置
4.3.4 CTRL_REG4 (23h)控制寄存器3-中断使能寄存器配置
计算机和嵌入式科学中有一个说法,叫做:硬件越简单,软件越复杂,硬件越复杂,软件越简单。比如前面讲到的FMSC接口,硬件特别复杂,连线非常多,而软件就很简单,只需要几个管脚进行组合,就可以读出数据。而本节要讲的I2C接口,则是相反的例子:硬件非常简单,只需要连接两根线,但是软件缺比较复杂,需要较多的时序组合,才能够形成读写操作。
1. IIC总线特点
IIC总线的总体特点就是:硬件简单,软件稍微有些复杂。
1.一组I2C设备可以连接多个I2C从机,因此非常方便扩展。其中每个从机都带有这组总线中唯一地址。主机用地址来区分对不同从机的访问。
2. 一根总线只有两条线路,SCL为时钟线,所有数据都按照这个时钟进行收发,SDA为数据线,读写都从这个数据线收发;
3. 总线带有上拉电阻:当所有I2C设备空闲时,输出高阻态。由于有上拉电阻,整个总线会变为高阻态。当主机发起读写时,将SDA拉低,表示启动读写操作。
4.设备不能无限增加:每增加一个设备,总线电容值会增加,最多增加到400pF为上限;
根据这个特点,下面详细介绍总线读写过程。
1.1 主机写数据到从设备
1. S信号:为主机发起的开始传输信号,表示主机准备写入或者读取数据了;
2. SLAVE ADDRESS: 主机发出从地址,指明需要访问哪个设备。当某个从设备地址吻合时,这个设备被选中,其他设备将自动忽略后续信号;
3.R/W信号:如果低电平表示主机写从机,如果高电平表示主机读从机;
4. A信号:从机确定地址后,会发出A信号,确定可以接收数据。主机收到A信号后,发出DATA,写入从机;
5. DATA:收到A信号后,主机向从机发出DATA信号,DATA信号总计8位。主机每次发完DATA,都需要等待从机发出A信号;
6. P信号:数据传输停止时,主机像从机发出P信号。
1.2主机由从机读取数据
当主机由从机读取数据,信号会有所不同,下面重点介绍不同部分
1. R/W信号为1,表示读信号(写信号为0)
2. DATA信号:数据信号由从设备发出,主机接收;
3. A信号:主机收到数据后,发出A信号(应答信号),表示继续接收。
4.NA信号:主机不希望发出信号时,则发出NA信号,主机收到后自动停止发送。
1.3 读写数据符合操作
前面的读操作和写操作都存在一个问题,并没有提到从设备内部寄存器地址。实际上,在大多数I2C设备读写过程中,采用复合操作模式。当选中了从设备后,会先发一段DATA,这个DATA为从设备内部寄存器地址,然后再写入这个寄存器,或者从寄存器读数据。
下面详细描述这一过程,重点描述和前面不同的部分:
1. DATA: 这里的数据为主机发出的从机内部寄存器地址;然后下一个数据,才是实际写入寄存器的数据(或者由从机指定寄存器读取的数据)
2. Sr重复起始信号:
1.4. 具体信号描述
前面介绍了S信号,A信号等,下面详细介绍不同信号的波形。只有了解掌握了这些波形,我们后续才能够用软件来模拟这些波形。
1.4.1起始信号和停止信号
空闲时,SDA和SCL都是高电平。当主机需要读写操作时,主动拉低SDA,形成起始信号;
当需要结束的时候,主机同样主动释放SDA,SDA达到高电平,形成停止信号;
1.4.2有效信号与无效信号
SCL为高电平时,SDA数据有效(高电平为1,低电平为0);
SCL为低电平时,SDA数据无效,主机或者从机乘着这个机会转换数据;
1.4.3从机地址以及读写信号
地址为7位,加上后面的R/W,共计8位,形成地址+读写。共计8BIT合并起来之后,看起来就是:读的地址比写的地址大1。
1.4.4响应信号A和NA
无论读写,当设备希望对方继续发送数据,则发送A信号,否则发送NA信号。
发送数据方完成一个BYTE数据发送后,会自动释放SDA总线,等待接收方发送A信号或者NA信号。
A信号为低电平,NA信号为高电平。
2 软件实现I2C读写
搞清楚规律后,我们就用GPIO模拟I2C波形,实现I2C读写。一般用GPIO模拟波形的方式,通常叫做软件读写。如果用配置寄存器方式实现I2C读写,则为硬件读写。
软件模拟的好处是:
1. 对GPIO没有限制:STM32F1的硬件I2C接口只有指定的GPIO才可以实现,而用软件方式,则可以用任意GPIO来实现。
2. 方便理解波形:通过软件模拟,可以非常清楚的掌握I2C读写的波形,加深对I2C理解;
3. 方便移植:同理,由于不限制GPIO,不依赖硬件,因此非常方便移植到不同的平台上;
软件模拟的缺点是:比硬件波形更加耗费CPU资源。不过,如果不是海量的I2C读写,这些资源耗费可以忽略不计。
2.1延时函数
这里采用for循环实现的软件延时,实现2us~3us左右的软件延时。
这里可能要问了:为何这里可以用软件延时,而不采用前面所说的无阻塞延时呢?
这是因为这里的延时时间非常短,仅仅为us级别,及时产生阻塞,对系统影响也不大。但是如果是真正高端的设计,比如军品的研发设计中,这样us基本的阻塞也是需要避免的。
延时函数的目的是在低电平或者高电平之后,实现对应的延时时间,实现SCL对应的方波波形。
2.2 用宏定义控制GPIO管脚高低电平
正如前面所说,通过宏定义方式,一方面使得代码更加简单易读:I2C_SCL_1, I2C_SDA_0,这种方式非常简单易读。另一方面便于更换,例如:如果我们用到其他的MCU上,设置高低电平不再是GPIO_SetBits,而是SetBits,这个时候主要代码不用改变,只改写宏定义部分即可完成。
2.3 创造起始信号
起始信号是:SCL高电平,SDA从高电平跳转到低电平。
上面代码中,先把SDA和SCL设置为1,然后将SDA设置为0,完成跳转。随后把SCL也设置为0,为后面创造SCL时钟做准备。
2.4发送字节
发送字节时,分为下面步骤
第一步:SDA输出数据,输出1或者0;
第二步:delay,等待信号稳定;
第三步:SCL输出高电平,便于从机这时读取数据;
第四步:delay,等待从机读完;
第五步:SCL输出低电平,从机停止读取;
第六步: delay,便于等待主机切换SDA数据;
弄清楚这6个步骤后,代码就变得非常简单了。
上面这6个步骤,和前面的6个步骤一一对应。
另外,需要注意一点:当发送完前面8个bit后,需要释放SDA总线,等待从机发出ACK或者NACK信号。如果主机收到了ACK信号,就会继续发送,如果主机收到了NACK信号,就会停止发送。下面具体看如何等待并且读取ACK
2.5等待并且读取ACK
当前面8个bit 完成发送之后,SDA会释放总线,并且等待从机发出ACK或者NACK信息,具体步骤如下:
1.释放SDA总线,确保接收端可以控制SDA;
2.delay等待;
3.SCL输出高电平,用来帮助从机输出ACK信号;
4.delay等待从机输出;
5. 读取SDA信号,这个信号为从机输出;
6. SCL输出低电平,完成第9bit读取;
7. delay等待,用于启动下一个电平;
具体代码见上方。
2.6 发出ACK或者NACK
无论是写数据还是读数据,都需要对方发送ACK信号或者NACK信号。
ACK信号是SDA在低电平情况下,创建一个SCL时钟。NACK信号是SDA在高电平的情况下,创建一个SCL时钟。
如上面代码所示:首先拉低SDA信号,等待20us后,将SCL拉高,再等待20us,再次将SCL拉低,创建了一个ACK信号。
创建NACK信号基本相同,只是把第一行代码的SDA_0修改为SDA_1即可。
2.7 I2C STOP
I2C停止信号通知I2C总线上全部数据恢复到待机模式。在完成读写操作之后,都需要发送I2C STOP,使得I2C总线及时复位。
I2C Stop命令分为下面几个步骤:
1. SDA设置为低电平;
2. SCL设置为高电平;
3. delay保持信号稳定;
4. SDA设置为高电平;
根据上面步骤实现代码:
2.8 实现I2C地址检查
根据前面的介绍,我们只需要发出start,再发出从机地址, 从机就会发出Ack信号。根据这个特性,我们可以进行I2C地址检查,检查I2C总线上面从机地址是否正确。
代码实施步骤为:
1.配置I2C对应的GPIO;
2. 发送启动I2C信号;
3. 发送I2C地址。注意:I2C地址为7BIT,后面加上R/W信号,如果是1表示读,如果是0表示写;
4. 等待从机应答,如果从机有应答,说明地址正确;
5. 发送停止信号,使得设备进入待机模式;
我们在初始化时进行调用。由于I2C上面带有EEPROM,因此我们检查这个地址是否正确。
代码返回结果如图所示,说明执行地址校验正确。
通过I2C地址校验,我们可以迅速确定I2C总线已经能够基本正常工作,I2C设备已经正常启动。 在线路板调试时,I2C地址校验为重要调试手段,通过I2C地址校验,可以确定I2C设备焊接正常,供电正常,I2C时序基本正常。
2.8 实现I2C地址扫描
由于I2C总线简单,我们常常会在I2C总线上,挂接多个设备。这时,可以通过I2C地址扫描,来检查I2C总线上挂接了多少设备,每个设备是否正常工作。
具体实现代码如上。
1. 从0开始发送Addr,如果对应Addr收到了Ack,说明地址正确,则打印其地址;
2. 如果没有收到Ack,说明地址不正确,则发送I2C停止信号,并且接着扫描下一个地址;
执行结果如下:
可以看到,扫描到了2个地址。
问题:为何这里能够扫描到两个地址?
上面代码中,扫描到了更多的地址。这是因为我们吧SHT31温湿度传感器接入了I2C总线中。要想知道如何为何SHT31温湿度传感器扫描到的地址是3个?后面如何读取温湿度数据?且继续看下去!
3.读取SHT31温湿度数据
3.1查找数据手册
可以直接百度搜索。
半导小芯-芯片查询工具_芯片替代查询_数据手册查询_规格书查询_datasheet查询_IC查询
也可以到半岛小芯这样的专门网站去搜索,效率更高一些。
当然,也可以到官网查询对应的手册。
本文对应手册链接如上。
3.2基本温湿度采集
下面我们对照技术手册,完成I2C读取SHT31的温湿度数据的功能,并且进一步加深对I2C驱动功能的理解,学一个接口,就学好一个接口,用好一个接口。
3.2.1 SHT3X I2C访问时序
访问SHT3X时序如上图所示 ,看起来比较复杂,需要进一步详细解读。
3.2.2 发送读命令
第一部分为发送读命令,具体步骤如下。
1.发送start信号;
2. 发送地址,附加写信号,因此为0X44<<1+0; 其中0x44为地址,左移1位形成前面7bit, 0表示写入操作;
3.等待ACK信号;
4.发出高位信号(MSB),方法是:将高位信号左移8BIT;
5.发出低位信号;
6.等待ACK;
7.发出停止信号
SHT3X接收到读命令后,就开始测量动作,进行温度测量。
3.2.3 读命令对应代码
读命令对应的代码如上,是手册里面的复刻,将代码和手册放在一起,更加可以加深对I2C总线操作的理解。
3.2.4读取测量值
经过上面的操作后,就开始读取测量结果。
1.发送i2c_start信号启动读取;
2. 发送i2c地址,注意这里地址为0X44<<8+1;由于是读信号,因此末尾加1;
3.信号到这里有两个分支:简单的模式为时钟延展模式,复杂的模式为非时钟延展模式;我们工作在时钟延展模式下;
4. 读取信号,并发出ACK,让从机继续发送;如此循环,读取共计6byte;
5. 读取最后一个字节后,发送NACK;
6.最后发送i2c_stop,停止总线;
根据上面读数据的时序,我们就可以写出对应代码。
其中需要注意,在完成6个字节读取后,发出NACK信号,停止读取。
3.2.5 关于时钟延展功能
上图中的Clock Stretching Enable就是指使能了时钟延展功能。
首先,简单介绍一下什么是时钟延展。时钟延展是指从机通过将SCL拉低以暂停数据传输的一个过程,在暂停过程中,从机可以有更多的时间处理接收到的数据,或者准备即将发送的数据。在相关的处理和准备完成之后,将交出SCL的控制权,主机继续控制SCL的节奏进行数据的收发。换句话说,时钟延展是从机跟不上主机的速度,让主机等等它的操作。
时钟延展通常分为两种,一种是字节级(byte)的时钟延展,一种是比特级(bit)的时钟延展。字节级的时钟延展是按照字节为单位开展,每一个字节收发结束之后启动。比特级则是每个数据bit都进行延展,强行让master慢下来。
因此,在上面波形中,主机收到ACK之后,从机会把SCL拉低。然后主机即可直接读取对应信号。
3.2.6 关于SHT30命令字的解读
当我们读取SHT3X时,发送的命令字为0X2C06,这个命令字是什么含义呢?上表给出了详细解读。
其中2C对应了使能时钟延展功能。24对应了关闭时钟延展功能。
06对应了高重复性,也就是能够较快速度重复读数。10对应了低重复性,也就是较慢速度重复读数。
重复性主要影响功耗,在需要低功耗设计的场合,需要降低重复性,从而降低传感器功耗。
3.2.7 CRC校验
CRC编码又叫做循环冗余编码,如果需要进一步理解循环冗余编码的工作原理,可以查看下面链接。
3.2.8 温湿度转换
读到的数据为6个BYTE,我们需要经过转换,才能够把这6个BYTE数据转换为温湿度数据。
湿度转换数据为:读数值*100/65536; 温度值转换数据为:-45+175 * 读数值/65535;
换成代码之后,代码如上。注意:为了方便计算,我们把计算值全部都放大十倍,这样方便用整数来进行表达。
3.3 SHT30周期读数功能(待完成)
对于专业的温湿度测量设备来说,需要在短时间内,连续多次读取温湿度数据。例如:在1S内连续读取10次温湿度数据,在这种情况下,就需要开启周期读数功能。
4.加速度传感器LIS2DH12
LIS2DH12TR.pdf (semiee.com)https://www.semiee.com/file/SENSOR/LIS2DH12TR.pdf
4.1加速度传感器简介
4.1.1芯片封装和方向
加速度传感器使用非常广泛。我们常用的加速度传感器芯片为电容式MEMS传感器。其中一般有个可运动质量块与一个固定电极组成一个电容,当受加速度作用时,质量块与固定电极之间的间隙会发生变化,从而使电容值发生变化。它的优点很突出,灵敏度高、零频响应、受环境(尤其是温度)影响小等,缺点也同样突出,主要是输入输出非线形对应、量程很有限以及本身是高阻抗信号源。
在设计使用加速传感器时,一般需要在PCB上,指定封装和X Y Z轴朝向。
4.1.2应用原理图
参考原理图如图所示,LIS2DH12数字接口支持I2C接口和SPI接口。SPI接口速度会更快一些。我们这里重点讲解I2C接口。
其中注意,芯片包含了VDDIO和VDD两个引脚,VDDIO用来给IO供电。如果IO电平和VDD电平不一致,则可以分开供电。手册上可以看到,典型电压2.5V,最大电压3.6V。因此我们使用在3.3V是完全没有问题的。
4.2 I2C接口以及寄存器访问
4.2.1 单字节写入
如上图表示了写入单个字节到I2C设备的方法。
1.发起start信号;
2. 写入设备I2C地址,这里地址为0X32 (如果是读取则需要加1作为读数标记);
3.等待设备发出ACK;
4.发出需要操作的寄存器地址(SUB子地址);
5.等待设备发出ACK;
6. 发出需要写入的DATA字节;
7. 等待设备发出ACK;
8. 发出停止字节;
上面共计8个步骤,即可完成单个字节写入。
按照上面步骤,完成代码如上。
4.2.2 单字节读取
如上图表示了读取单个字节的方法。
1.发起start信号;
2. 写入设备I2C地址,这里地址为0X32 (这里还是写入标记,因为要写入寄存器地址);
3.等待设备发出ACK;
4.发出需要操作的寄存器地址(SUB子地址)
5.等待设备发出ACK;
6. 发出start信号;
7. 发出设备I2C地址,这里地址为0X33(这里为读出标记);
8. 等待设备发出ACK;
9. 读取I2C总线数据;
10. 设备发出NMAK,通知从设备读取成功;
11. 发出stop信号,停止总线;
上面共计8个步骤,即可完成单个字节读取功能。读取时,前面1~5步骤和写入完全相同,从步骤6开始,则按照读取方式发送指令。
另外,SAK和MAK都是指Ack命令,SAK表示从机发出Ack, Mak表示主机发出Ack命令。
完成读写函数后,就可以向传感器写入数据,或者从传感器读取数据了。
4.3 传感器配置初始化
4.3.1 CTRL_REG1 (20h)控制寄存器1-采样频率和使能
控制寄存器1分为两部分ODR和其他。其中ODR用来控制采样速度。en用来使能。
例如:我们把ODR设置为3,则写入采样频率为25Hz。
en寄存器则使能。LPen设置为0表示正常模式,设置为1表示低功耗模式;
Zen, Yen, Xen用来使能X Y Z方向传感器。
因此,这里配置为0x37,表示x y z使能,采样频率25Hz。
4.3.2 CTRL_REG2 (21h)控制寄存器2-高通滤波器配置
所谓高通滤波就是只允许高频信号通过而抑制低频信号。高通滤波设置一般用于检测跌倒,触碰等场景。传感器在日常情况,会收到风力,环境震动等环境因素影响,这些都属于低频振动信号。而突发振动,触碰,跌落等属于高频振动。通过设置高频滤波传感器,降低环境因素影响,使得传感器可以更好响应环境突发振动变化。
1.HPM:高通滤波模式选择:
00:正常模式;
01: 采用参考信号滤波()
10:正常模式;
11:发生中断事件后自动复位;
2. HPCF: 截至频率选择,默认选0;
3.FDS: 内部数据选择,0表示不选择,1表示利用FIFO进行滤波,默认选0;
4. HPCLICK:0表示不选择,1表示使能滤波;
5. HP_IA2和HP_IA1: 如果设置为1,则使能中断的高通滤波。也就是说:对于低频振动,不会触发中断,仅仅对高频振动会触发中断;
4.3.3 CTRL_REG3 (22h)控制寄存器3-中断使能寄存器配置
中断使能寄存器用来开启或者关闭不同的中断源,当对应中断源开启后,如果触发了这个中断,就会在INT1上,输出对应的中断。
1.CLICK: 使能后,发生“点击”振动后,INT1上触发中断;
2. IA1:使能后,发生IA1行为,触发INT1上中断;
3. IA2:使能后,发生IA2行为,触发INT1上中断;
4. ZYXDA:使能后,当X Y Z上有新数据后,触发INT1上中断;
5. WTM: 使能后,当FIFO内出现水印是,触发INT1上中断;
6. OVERRUN: 使能后,当FIFO出现溢出OVERRUN后,触发INT1上中断;
4.3.4 CTRL_REG4 (23h)控制寄存器3-中断使能寄存器配置
1.BDU: 0表示连续更新数据,1表示读数后才会更新;这里设置为0;
2. BLE: 大小端设置,默认为0,小端模式,否则为1,大端模式(复习:小端模式中,不重要的数在低位地址,大小端判断方法:0x1234强制转换,如果取得0x34则为小端,否则为大端)
3. FS:最大加速度选择,其中00:±2g, 01:±4g, 10:±8g, 11:±16g;
4.HR:高分辨率选择,需要结合前面的LPen位,进行设置
前面LPen位设置为0,这里HR设置为1,表示12位数据输出;在不同的工作模式下功耗不同。分辨率越低,功耗越低。
4. ST: 自捡,默认为00;
5. SIM: SPI模式选择,默认0为4线SPI, 1为三线SPI;
具体详细的寄存器配置还非常多,需要在晚一些时间,专门就加速度传感器进行一节教程,详细讲解不同传感器配置,以及对应传感器数值。
4.3.5 WHO_AM_I寄存器
为了方便验证MCU是否正常工作,在MCU初始化调试时,可以访问WHO_AM_I寄存器,读出对应的device_id,用来确认读写时序是否正常。
读取的device_id为0x33。
4.4 读取加速度数据
4.4.1从寄存器读取加速度数据
从28h, 2Ah, 2Ch可以读取加速度数据,这些数据为原始数据。对应的寄存器地址分别为28h,29h,2Ah, 2Bh,2Ch,2Dh。总共有6个byte数据。
sensor用了16bit来表示一个轴的值。即读取出来的原始寄存器数据为一个int16_t格式的数值。前面把x y z都配置成为12bit数据。
因此,需要把读取到的数据,右移四位,取得实际有效值。
12bit数据范围为:2^12=4096,对应取值范围为:-2048~+2048。
测量的加速度范围在23h寄存器中设置。假设我们设置范围为±2g,则2048对应数值就是2g,量化单位为:1024lsb/g, 加速度分辨率为:0.98mg/lsb。假设设置范围为±16g, 2048对应数值就是16g,量化单位为:128lsb/g,加速度分辨率为:7.8mg/lsb。
因此加速度范围为2g时,对应数值为2048,将数值转换为浮点数即可。
当加速度为4g时,对应数值还是2048,这时就需要乘以2,以获得正确的加速度值。
4.4.2 加速度值滤波
从寄存器得到的加速度值,需要进一步进行进行滤波,这里采用的是最常用的平均值滤波,将多次采样的数值进行平均即可获取平均值。
4.4.3 角度计算
上面的角度计算,分别用来计算x y z三个方向的转角。
x方向转角如上图,俗称pitch
y轴旋转
z轴旋转。
pitch = 180 * atan (accelerationX/sqrt(accelerationYaccelerationY +
accelerationZaccelerationZ))/M_PI;
roll = 180 * atan (accelerationY/sqrt(accelerationXaccelerationX +
accelerationZaccelerationZ))/M_PI;
yaw = 180 * atan (accelerationZ/sqrt(accelerationXaccelerationX +
accelerationZaccelerationZ))/M_PI;
M_PI = 3.14159265358979323846
具体计算公式如上。
执行结果如上图所示!
4.5 程序员35岁失业问题的真相!
上面内容看完之后,作何感想?如果让你从头写代码,从阅读寄存器开始,一点一点写代码,需要多久能够完成这个加速度传感器的访问和控制?你的项目是否允许你从头开始读寄存器,写寄存器,控制参数,观察结果?
这里产生另外一个问题:为何初入门的工程师,薪资只有几千块,但是工作三五年之后,一部分工程师就会涨到几万?这中间发生了什么?可以让他们的新增暴涨?
其中的一个核心点,就是代码的不断阅读和积累。
对于一个资深的工程师,拿到项目需求之后,首先会看下自己之前是否积累了相关的资料,如果没有,就会github或者CSDN上,查找是否有类似的资料,如果这两者都找不到,基本上就需要和领导汇报:目前用的传感器或者算法,全网都没有参考,需要从头开发,需要一些额外的时间。
这些日积月累的代码,文档,技术博客,就是程序员的资本,或者说知本。当程序员的代码库或者计数博客积累好了之后,开发效率可以成倍提升,这也就是程序员工作若干年之后,薪资能够成倍提升的主要原因。
但是如果开发过程中,没有及时做好代码的归类和整理,那么随着年岁的增长,工作时间逐步衰减,脑力逐步衰减,知识库却没有提升,开发效率也没有提升,这样就会面临35岁失业问题。
因此,其实程序员的职业寿命可以很长,但是核心是:
能否及时完成知本积累?
5.动作传感器PAJ7620
pixart-PAJ7620U2.pdf (semiee.com)
5.1动作传感器PAJ7620简介
PAJ7620内置红外和光学传感器,可以识别九种动作:
- 向上;
- 向下;
- 向左;
- 向右
- 向前
- 向后
- 顺时针
- 逆时针
- 摆手;
它同时带有I2C接口,可以给MCU提供对应的操作反馈信息。
由于PJA7620手册非常简单,因此,下面重点讲解代码部分。
5.2 PAJ7620 唤醒
通过向PAJ7620_ID发送数据,唤醒芯片。通过读取对应的PAJ7629的数据,判断设备是否成功被唤醒,被唤醒后,读数为0x20。
5.3 PAJ7620初始化
初始化过程分为两部分:
1. 唤醒PAJ7620,如果唤醒失败,则直接返回;
2. 写入数组配置PAJ7620;其中配置数组主要用来初始化PAJ7620内部的光学和红外阵列;
5.4.读取手势功能
这里就可以不断读取传感器失败的9种动作了,PAG_GET_INT_FLAG1默认为0,完成动作识别之后,输出对应动作编号。读数之后,恢复为0。
5.5.main函数调用
在main函数中,每隔100ms,读取PAJ7620的状态。当然,也可以在INT中断触发中,读取对应触发状态。
经过实测,PAJ7620可以准确识别1~8种动作。第九种动作Wave如何实现,目前还没有测试出来。如果你知道,请留言告知。
6.气压传感器SPL06
Goertek-SPL06-001.pdf (semiee.com)
下面讲解另外一个重要的I2C接口传感器SPL06气压传感器。
4.1 SPL06传感器简介
这款传感器一般用在GPS导航上,可以用作轨迹推算,坡道检测,天气预报,垂直起飞或者降落速度检测等场景中。