每节课都是一个项目 手把手用STM32打造联网气象站-12-万字讲清I2C的来龙去脉

2023-11-02

目录

​1. IIC总线特点

1.1 主机写数据到从设备

1.2主机由从机读取数据

1.3 读写数据符合操作

1.4. 具体信号描述

1.4.1起始信号和停止信号

1.4.2有效信号与无效信号

1.4.3从机地址以及读写信号

 1.4.4响应信号A和NA

2 软件实现I2C读写

2.1延时函数

 2.2 用宏定义控制GPIO管脚高低电平 

2.3 创造起始信号

2.4发送字节

 2.5等待并且读取ACK

  2.6 发出ACK或者NACK

2.7 I2C STOP

  2.8 实现I2C地址检查

  2.8 实现I2C地址扫描

3.读取SHT31温湿度数据

3.1查找数据手册

3.2基本温湿度采集

3.2.1 SHT3X I2C访问时序

3.2.2 发送读命令

3.2.3 读命令对应代码

3.2.4读取测量值

3.2.5 关于时钟延展功能

3.2.6 关于SHT30命令字的解读

3.2.7 CRC校验

3.2.8 温湿度转换

 3.3 SHT30周期读数功能(待完成)

4.加速度传感器LIS2DH12

4.1加速度传感器简介

4.1.1芯片封装和方向

4.1.2应用原理图

 4.2 I2C接口以及寄存器访问

4.2.1 单字节写入

 4.2.2 单字节读取

 4.3 传感器配置初始化

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-中断使能寄存器配置

4.3.5 WHO_AM_I寄存器

4.4 读取加速度数据

4.4.1从寄存器读取加速度数据

4.4.2 加速度值滤波

4.4.3 角度计算

4.5 程序员35岁失业问题的真相!

5.动作传感器PAJ7620

5.1动作传感器PAJ7620简介

5.2 PAJ7620 唤醒

5.3 PAJ7620初始化 

5.4.读取手势功能

5.5.main函数调用

 6.气压传感器SPL06

4.1 SPL06传感器简介


   

计算机和嵌入式科学中有一个说法,叫做:硬件越简单,软件越复杂,硬件越复杂,软件越简单。比如前面讲到的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查询

也可以到半岛小芯这样的专门网站去搜索,效率更高一些。

首页 (sensirion.com)

 

当然,也可以到官网查询对应的手册。

SENSIRION-SHT31-DIS-B.pdf (semiee.com)https://www.semiee.com/file/SENSIRION/SENSIRION-SHT31-DIS-B.pdf

本文对应手册链接如上。

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编码又叫做循环冗余编码,如果需要进一步理解循环冗余编码的工作原理,可以查看下面链接。

(49条消息) CRC校验学习_翼曦的博客-CSDN博客

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内置红外和光学传感器,可以识别九种动作:

  1. 向上;
  2. 向下;
  3. 向左;
  4. 向右
  5. 向前
  6. 向后
  7. 顺时针
  8. 逆时针
  9. 摆手;

它同时带有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导航上,可以用作轨迹推算,坡道检测,天气预报,垂直起飞或者降落速度检测等场景中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

每节课都是一个项目 手把手用STM32打造联网气象站-12-万字讲清I2C的来龙去脉 的相关文章

随机推荐