MAX30102寄存器配置和程序编写

本文详细介绍了MAX30102传感器的寄存器功能,包括中断状态、中断使能、FIFO配置、模式设置等,并提供了初始化代码和读取FIFO数据的示例。
摘要由CSDN通过智能技术生成

前言

最近在学习使用MAX30102传感器,但网络上的文章大都只是给出示例代码而没有较为详细的介绍,目前仅看到NaN294的文章“MAX30102脉搏血氧仪和心率传感器(含寄存器介绍]”给出了详细的寄存器介绍。本文章是在NaN294文章的基础上,根据器件手册增加了一些图表和文字解释,其间初始化代码,和读取FIFO并合成有效数据的代码。

一、寄存器简介

0x00-0x01 中断状态(1)、(2)
MAX30102传感器具有一个中断引脚,当传感器发生某些事件后,该引脚会从高电平跳变为低电平,触发主机的中断事件。该中断引脚只有一根,所以主机需要读取中断状态寄存器来判断引起中断的事件。
在这里插入图片描述

其中某一比特为1则表示该事件发生。
A_FULL:传感器片上的FIFO缓存将要满,“将满”的标准可以在其它寄存器内设置。
PPG_RDY:一个采样完成,主机可以读取一个FIFO中的样本。
ALC_OVF:当SpO2/HR光电二极管的环境光消除功能达到最大限度。
PWR_RDY:芯片上电完成。
DIE_TEMP_RDY:MAX30102带有一个温度传感器,DIE_TEMP_RDY表示温度转换完成,主机可以访问寄存器获取温度数值。
当读取中断状态寄存器时,或者当触发中断的寄存器被读取时,中断被清除。例如,如果SpO2传感器因为完成一个转换触发中断时,读取FIFO数据寄存器或者中断寄存器都会清除中断 (中断pin返回到正常的高电平状态),这时也会将中断状态寄存器中的所有位清除为零。

0x02-0x03 中断使能(1)、(2)
在这里插入图片描述

即可读也可写,对应0x00和0x01的中断比特,置1表示可以由该事件引起中断。
程序配置:将0x02配置为0xC0(1100 0000),0x03配置为0x00,即使能A_FULL和PPG_RDY。

0x04-0x07 FIFO
在这里插入图片描述

FIFO_WR_PTR:MAX30102的FIFO可以容纳32个样本,FIFO_WR_PTR指向下一个样本要写入的位置。
OVF_COUNTER:主机可以设置让传感器丢弃旧数据以容纳新数据,OVF_COUNTER记录了有多少个旧数据被覆盖(丢弃)。
FIFO_RD_PTR:指向下一个要读取的位置。
可以编写和读取FIFO寄存器(0x04-0x07),但实际上只有FIFO_RD_PTR寄存器可以写入操作。其他的则自动增加或填充MAX30102的数据。当启动新的SpO2或心率转换时,建议首先清除FIFO_WR_PTR、OVF_COUNTER和FIFO_RD_PTR寄存器,以确保FIFO是空的,并且处于已知状态。
程序配置:一般在初始化时将FIFO_WR_PTR、FIFO_RD_PTR和OVF_COUNTER设置为0。即将0x04~0x06均配置为0x00。
FIFO DATA Register:
FIFO深度为32,可以容纳32个数据样本。样本大小取决于被配置为活动的LED通道的数量。
在血氧模式下, max30102采样一次的样本由两组数据(RED和IR)组成,共6字节,都存储在FIFO中。前3字节是红光信号(RED)的比特17到比特16(前6比特是无效数据)、比特15到比特8以及比特7到比特0;后3字节则是红外光(IR)信号,比特排列方式与红光相同。
在这里插入图片描述
在这里插入图片描述

FIFO数据格式:左对齐,如表所示。无论ADC分辨率设置如何,MSB bit始终处于位17的数据位置。
在这里插入图片描述

主机通过IIC总线读取该寄存器来获得FIFO中的数据。比较特殊的是,当进行IIC连续读操作时,寄存器地址指针不会增加,但是FIFO_RD_PTR会增加,发送的下一个字节数据是FIFO中可用数据的下一个字节。
SpO2模式中的每个数据样本包括两个数据三胞胎(共6个字节),如果主机想要读取这6个字节,可对FIFO DATA Register连续进行6此IIC字节读操作,将读到的前三个字节拼接成RED,后三个字节拼接成IR。

0x08 FIFO配置
在这里插入图片描述

SMP_AVE:这3比特控制传感器如何处理采样结果,当设置为000,传感器不做处理直接压进FIFO、触发PPG_RDY中断;当设置为101,传感器每收集32个样本做平均后才会将结果压入FIFO,触发中断。当SMP_AVE在000到101之间变化时,每增加1,参与平均的样本数翻倍。超过101后仍是32。
在这里插入图片描述

FIFO_ROLLOVER_EN:控制传感器在FIFO满时,能否用新数据覆盖旧数据。设置为0,表示FIFO就不会更新,直到读取FIFO_DATA,或者更改写/读指针位置。
FIFO_A_FULL:设置FIFO里剩余多少个空位就算将要满,触发A_FULL中断。该值从0x0到0xF间变化,如设置为0x3则表示FIFO里剩余3个空位(29个未读样本)时,触发A_FULL中断。
程序配置:该寄存器配置为0x0f(0000 1111)。
即:1. 样本采样后直接存入FIFO;2. FIFO满时不会更新,直到读取FIFO_DATA,或者更改写/读指针位置;3. FIFO里剩余15个空位(17个未读样本)时,触发A_FULL中断。
0x09 模式配置
在这里插入图片描述

SHDN:设为“1”,进入省电模式,在该模式下寄存器内容不会丢失,并且还能执行读写操作。此模式下,所有的中断被清零。
RESET:设为“1”,将所有寄存器的内容恢复到默认值。
MODE:设置传感器当前运行在哪个模式,能获取哪些样本值。
010:心率模式
011:血氧模式
111:多LED模式
程序配置:该寄存器配置为0x03(0000 0011),设为血氧模式。
0x0A SpO2配置
在这里插入图片描述

SPO2_ADC_RGE:设置SPO2传感器ADC的最大量程,影响最低有效位对应的电压值。当设置为00,最大量程是2048nA,每增加1则量程翻倍。
程序配置:寄存器配置为0x27(0010 0111),ADC最大量程是4096nA。
在这里插入图片描述
SPO2_SR:SpO2模式下的每秒采样数,该参数并不能随意设置,真实的采样速率还会受到LED_PW影响。最小的000对应50Hz,最大的111对应3200Hz。
在这里插入图片描述
程序配置:寄存器配置为0x27(0010 0111),采样速率是100Hz。
LED_PW:控制红光和红外光的脉冲宽度,进而影响ADC的分辨率,设置为00时分辨率是15比特,设置为11时能达到18比特,但脉冲越宽采样频率就越会受限。
在这里插入图片描述
程序配置:寄存器配置为0x27(0010 0111),ADC的分辨率18bit,ADC的分辨率决定了FIFO中的有效数据位数。
实际的采样速率由SPO2_SR和LED_PW共同决定,在心率模式和血氧模式下不同的搭配方法会出现不同的采样速率,具体可见MAX30102数据手册的Table 11. SpO2 Mode (Allowed Settings)及Table 12. HR Mode (Allowed Settings)。

0x0C-0x0D LED脉冲波幅
在这里插入图片描述
这两个寄存器控制两个LED的典型电流大小,影响亮度。在MAX30102上,LED1是红光LED、LED2是红外光LED。LED_PA在0x00到0xFF之间变化,值越大所需的电流就越大。
程序配置:寄存器配置为0X32(10 mA)或者0x24(7.2 mA)。

0x11-0x12 多LED模式配置

没有使用该模式,所以没有详细了解

0x1F-0x21 芯片温度
在这里插入图片描述
TINT:8位有符号数,表示摄氏温度的整数部分,每一位对应1摄氏度
在这里插入图片描述
TFRAC:4位无符号数,对应摄氏温度的小数部分。步进是0.0625摄氏度。
整数温度+小数温度=实际温度
无论整数部分是负数或正数,小数部分一直都是正数,并与整数部分相加。
如 -128°C + 0.5°C = -127.5°C
TEMP_EN:这是一个自-清零控制位。将其设置为1后,芯片从温度传感器读取数据,并自动将该位清零,然后触发DIE_TEMP_RDY。用户可读取0x1F和0x20寄存器获得温度值。

0xFE-0xFF PART ID
在这里插入图片描述
REV_ID:版本号ID,不同渠道获得的传感器可能有不同的值。
PART_ID:部件ID,固定为0x15,可以通过读取该寄存器判断从机是否可能为MAX30102。

二、寄存器初始化代码:

void MAX30102_Config(void)
{
	IIC_Write_Byte(MAX30102_Device_address,REG_INTR_ENABLE_1,0xc0); // INTR setting
	IIC_Write_Byte(MAX30102_Device_address,REG_INTR_ENABLE_2,0x00);//
	IIC_Write_Byte(MAX30102_Device_address,REG_FIFO_WR_PTR,0x00);//FIFO_WR_PTR[4:0]
	IIC_Write_Byte(MAX30102_Device_address,REG_OVF_COUNTER,0x00);//OVF_COUNTER[4:0]
	IIC_Write_Byte(MAX30102_Device_address,REG_FIFO_RD_PTR,0x00);//FIFO_RD_PTR[4:0]
	IIC_Write_Byte(MAX30102_Device_address,REG_FIFO_CONFIG,0x0f);//sample avg = 1, fifo rollover=false, fifo almost full = 17
	IIC_Write_Byte(MAX30102_Device_address,REG_MODE_CONFIG,0x03);// 0x03 for SpO2 mode
	IIC_Write_Byte(MAX30102_Device_address,REG_SPO2_CONFIG,0x27);	// SPO2_ADC range = 4096nA, SPO2 sample rate (100Hz), LED pulseWidth (410uS)  
	IIC_Write_Byte(MAX30102_Device_address,REG_LED1_PA,0x32);//Choose value for ~ 10mA for LED1
	IIC_Write_Byte(MAX30102_Device_address,REG_LED2_PA,0x32);// Choose value for ~ 10mA for LED2
}

三、读取FIFO代码:

nt32_t fifo_red;
uint32_t fifo_ir;
void max30102_read_fifo(void)
{
  fifo_red=0;
  fifo_ir=0;
  uint8_t ach_i2c_data[6];
  
   //read and clear status register
  IIC_Read_Byte(MAX30102_Device_address,REG_INTR_STATUS_1);
  IIC_Read_Byte(MAX30102_Device_address,REG_INTR_STATUS_2);
  
  //对FIFO寄存器连续读6次,数据存入ach_i2c_data[]数组中
  IIC_Read_Array(MAX30102_Device_address,REG_FIFO_DATA,ach_i2c_data,6); 
  
  //读到的数据进行合并,或者RED值和IR值
  fifo_red  =  (long)((long)((long)ach_i2c_data[0]&0x03)<<16) | (long)ach_i2c_data[1]<<8 | (long)ach_i2c_data[2];
  fifo_ir =  (long)((long)((long)ach_i2c_data[3]&0x03)<<16) | (long)ach_i2c_data[4]<<8 | (long)ach_i2c_data[5];
}

四、参考文献:

  1. MAX30102: High-Sensitivity Pulse Oximeter and Heart-Rate Sensor for Wearable Health Data Sheet (2018)
  2. MAX30102脉搏血氧仪和心率传感器(含寄存器介绍
  3. 《开源》MAX30102教学《小白包教会》(看简介)
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值