MAX30102分析
前言
这篇主要是从数据手册的角度,解释初始化的过程。里面不包含代码,但是对初始化过程中用到的参数做了一些描述。
初始化
模式配置
地址 | 功能 | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | R/W |
---|---|---|---|---|---|---|---|---|---|---|
0x09 | 模式配置 | SHDN:当为1时,关机 | RESET:当为1时,复位 | - | - | - | MODE[2] | MODE[1] | MODE[0] | RW |
其中MODE有三种可以取用的值,分别是010,011和111。
配置值 | 模式 | 有源led的状态 |
---|---|---|
010 | 心率模式 | 仅红色 |
011 | SpO2模式 | 红色和红外线 |
111 | 多led模式 | 红色和红外线 |
网上代码向模式配置的地址传递0x40是执行复位操作,并不设置模式,所以直接传递了0。
传递0x40,这里主要说的时复位功能,后面还有模式配置
中断1使能
地址 | 功能 | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | R/W |
---|---|---|---|---|---|---|---|---|---|---|
0x02 | 中断1使能 | A_FULL_EN | PPG_RDY_EN | ALC_OVF_EN | - | - | - | - | - | RW |
A_FULL_EN:只能在心率模式和SpO2模式模式下有效,是开启先进先出(FIFO)存储器的一个状态标志。表示的是数组已经满了的标志。
PPG_RDY_EN:只能在心率模式和SpO2模式模式下有效,开启PPG数据就绪的中断使能,每当有一组新的PPG数据准备好,就会有一个标志。
ALC_OVF_EN:环境光消除溢出的标志,当SpO2/HR光电二极管的环境光抵消功能达到其最大极限时,此中断就会被触发,此时,环境光正在影响ADC的输出。
传递0xE0,开启三个中断的使能
中断2使能
地址 | 功能 | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | R/W |
---|---|---|---|---|---|---|---|---|---|---|
0x03 | 中断2使能 | - | - | - | - | - | - | DIE_TEMP_ RDY_EN | - | RW |
DIE_TEMP_ RDY_EN:内部温度标准标志使能,当内部模具温度转换完成时,将触发此中断,以便处理器可以读取温度数据寄存器。
传递0x02,开启温度处理的中断
FIFO写指针
地址 | 功能 | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | R/W |
---|---|---|---|---|---|---|---|---|---|---|
0x04 | FIFO写指针 | - | - | - | FIFFO_WR_PTR[4] | FIFFO_WR_PTR[3] | FIFFO_WR_PTR[2] | FIFFO_WR_PTR[1] | FIFFO_WR_PTR[0] | RW |
FIFO写指针指向MAX30102写入下一个示例的位置,这个指针在FIFO上写完一个数据之后会向前移动一位。当MODE[2:0]为010、011或111时,也可以通过I2C接口进行更改。
传递0x00,清除数据,防止残留数据的影响。一种是设备断电后,数据会自动清零的,但是断电时间太短,电容里面的电还没有消耗完,再次启动,会导致数据有残留。另一种是上电时会因为电流的不确定性,导致内部有数据乱码,这种在oled的显示上特别明显,所以oled初始化的时候都会清一下屏幕。不知道是哪种情况,但是总归是清理一下比较好
FIFO溢出计算器
地址 | 功能 | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | R/W |
---|---|---|---|---|---|---|---|---|---|---|
0x05 | FIFO溢出计算器 | - | - | - | OVF_COUNTER[4] | OVF_COUNTER[3] | OVF_COUNTER[2] | OVF_COUNTER[1] | OVF_COUNTER[0] | RW |
当FIFO满时,样品不会被推到FIFO上,样品就会丢失。OVF_COUNTER计算丢失的样本数量。它在0x1华氏度时达到饱和。当一个完整的样本从FIFO中“弹出”(即,删除旧的FIFO数据并将样本向下移位)时(当读取指针前进时),OVF_COUNTER被重置为零。
传递0x00,清除数据,同上
FIFO读指针
地址 | 功能 | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | R/W |
---|---|---|---|---|---|---|---|---|---|---|
0x06 | FIFO溢出计算器 | - | - | - | FIFO_RD_PTR[4] | FIFO_RD_PTR[3] | FIFO_RD_PTR[2] | FIFO_RD_PTR[1] | FIFO_RD_PTR[0] | RW |
FIFO读取指针指向处理器通过I2C接口从FIFO获取下一个样本的位置。每次从FIFO中弹出样本时,这都会推进。处理器还可以在读取样本后写入这个指针,以便在出现数据通信错误时允许从FIFO中重读取样本。
传递0x00,清除数据,同上
FIFO配置
地址 | 功能 | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | R/W |
---|---|---|---|---|---|---|---|---|---|---|
0x08 | FIFO配置 | SMP_AVE[2] | SMP_AVE[1] | SMP_AVE[0] | FIFO_ROL LOVER_EN | FIFO_A_FULL[3] | FIFO_A_FULL[2] | FIFO_A_FULL[1] | FIFO_A_FULL[0] | RW |
SMP_AVE:平均值,为了减少数据吞吐量,通过设置这个寄存器,相邻的样本(在每个单独的通道中)可以在芯片上进行平均和抽取。
SMP_AVE | 平均量 |
---|---|
000 | 1(不平均) |
001 | 2 |
010 | 4 |
011 | 8 |
100 | 16 |
101 | 32 |
110 | 32 |
111 | 32 |
FIFO_ROL LOVER_EN:FIFO被填满之后的控制。如果是0,在你读取之前都不会更新,如果是1,会更新覆盖之前的数据
FIFO_A_FULL:设置在什么时刻发出中断,当为0时,没有数据时发生中断,当为F时在数据被填满之后发出中断
FIFO_A_FULL | 当发出中断时,FIFO中的空数据样本 | 当发出中断时,FIFO中的未读数据样本 |
---|---|---|
0 | 0 | 32 |
1 | 1 | 31 |
2 | 2 | 30 |
3 | 3 | 29 |
4 | 4 | 28 |
5 | 5 | 27 |
6 | 6 | 26 |
7 | 7 | 25 |
8 | 8 | 24 |
9 | 9 | 23 |
A | 10 | 22 |
B | 11 | 21 |
C | 12 | 20 |
D | 13 | 19 |
E | 14 | 18 |
F | 15 | 17 |
传递0x0F,在还有15个空数据样本时产生中断
模式配置
地址 | 功能 | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | R/W |
---|---|---|---|---|---|---|---|---|---|---|
0x09 | 模式配置 | SHDN:当为1时,关机 | RESET:当为1时,复位 | - | - | - | MODE[2] | MODE[1] | MODE[0] | RW |
其中MODE有三种可以取用的值,分别是010,011和111。
配置值 | 模式 | 有源led的状态 |
---|---|---|
010 | 心率模式 | 仅红色 |
011 | SpO2模式 | 红色和红外线 |
111 | 多led模式 | 红色和红外线 |
传递0x03,这里是进行模式设置,在开头用的只是复位功能。设置为SpO2模式
SpO2配置
地址 | 功能 | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | R/W |
---|---|---|---|---|---|---|---|---|---|---|
0x0A | SpO2配置 | - | SPO2_ADC_RGE[1] | SPO2_ADC_RGE[0] | SPO2_SR[2] | SPO2_SR[1] | SPO2_SR[0] | LED_PW[1] | LED_PW[0] | RW |
SPO2_ADC_RGE:SpO2 ADC范围控制。
SPO2_ADC_RGE | LSB SIZE (pA) | FULL SCALE (nA) |
---|---|---|
00 | 7.81 | 2048 |
01 | 15.63 | 4096 |
10 | 31.25 | 8192 |
11 | 62.5 | 16384 |
这里的ADC检测的是电流,以01为例,最低要有15.63pA的电流才能有数值,最大的电流是4096nA,也是说到这个数值后,ADC到达检测的最大值。这是18位分辨率的ADC,理论上此时数值应该是262144
SPO2_SR:SpO2的采样率控制。这些位定义了一个样本的有效采样率,该采样由一个红外脉冲/转换和一个红色脉冲/转换组成。采样率和脉冲宽度是相关的,因为采样率设置了脉冲宽度时间的上限。如果用户选择的采样率对于所选LED_PW设置来说太高,则将尽可能高的采样率编程到寄存器中。
SPO2_SR | SAMPLES PER SECOND |
---|---|
000 | 50 |
001 | 100 |
010 | 200 |
011 | 400 |
100 | 800 |
101 | 1000 |
110 | 1600 |
111 | 3200 |
SAMPLES PER SECOND代表的是每秒的采样数,也就是Hz
LED_PW:LED 脉宽控制和 ADC 分辨率。这些位设置LED脉冲宽度(IR和Red具有相同的脉冲宽度),因此间接设置每个样本中ADC的积分时间。ADC分辨率与积分时间直接相关。
LED_PW | PULSE WIDTH (µs) | ADC RESOLUTION (bits) |
---|---|---|
00 | 69 (68.95) | 15 |
01 | 118 (117.78) | 16 |
10 | 215 (215.44) | 17 |
11 | 411 (410.75) | 18 |
传递0x26,最低启动电流是15.63pA,采样率为100Hz,LED脉宽为215us。
LED脉冲宽度设置
地址 | 功能 | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | RW |
---|---|---|---|---|---|---|---|---|---|---|
0x0C | LED脉冲幅度 | LED1_PA[7] | LED1_PA[6] | LED1_PA[5] | LED1_PA[4] | LED1_PA[3] | LED1_PA[2] | LED1_PA[1] | LED1_PA[0] | RW |
0x0D | LED脉冲幅度 | LED1_PA[7] | LED1_PA[6] | LED1_PA[5] | LED1_PA[4] | LED1_PA[3] | LED1_PA[2] | LED1_PA[1] | LED1_PA[0] | RW |
传递0x2F,用于设置脉冲。官方数据手册上说由于修剪问题,所以每个LED电流都可能有很大差异,而且数据手册上的数据并没有给全,暂时不写对应对应关系表
模具温度配置
地址 | 功能 | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | RW |
---|---|---|---|---|---|---|---|---|---|---|
0x21 | 模具温度配置 | - | - | - | - | - | - | - | TEMP_EN | RW |
TEMP_EN:这是一个自清除位,当设置时,将从温度传感器启动单个温度读数。当该位设置为1时,该位在温度读数结束时自动清除为零。
传递0x01