(以下仅代表个人相关学习记录,若有错误麻烦并感谢指出~)
由查阅MAX30102数据手册可知:
寄存器 | 地址 | POR STATE(上电复位) 即默认地址 | 模式选择 |
Interrupt Status 1 | 0X00 | 0X00 | ①A_FULL:1000 0000(0X80) ②PPG_RDY:0100 0000(0X40) ③ALG_OVF:0010 0000(0X20) ④PWR_RDY:0000 0001(0X01) |
Interrupt Status 2 | 0X01 | 0X00 | DIE_TEMP_EDY:0000 0010(0X02) |
REG_INTR_ENABLE_1 (中断使能寄存器1) | 0x02 | 0x00 | ①PPG_RDY_EN:0100 0000(0X40); ②ALC_OVF_EN:0010 0000(0X20); ③A_FULL_EN:1000 0000(0X80) |
REG_INTR_ENABLE_2 (中断使能寄存器2) | 0x03 | 0x00 | DIE_TEMP_RDY_EN:0000 0010(0X02) |
REG_FIFO_WR_PTR (写指针寄存器) | 0x04 | 0x00 | [4:0]:0001 1111 (0X1F) |
REG_OVF_COUNTER (溢出寄存器) | 0x05 | 0x00 | [4:0]:0001 1111 (0X1F) |
REG_FIFO_RD_PTR (读指针寄存器) | 0x06 | 0x00 | [4:0]:0001 1111 (0X1F) |
FIFO_DATA | [7:0]:1111 1111(0XFF) | ||
REG_FIFO_CONFIG (FIFO配置寄存器) | 0x08 | 0x00 | ①SMP_AVE(样本平均)[2:0]:1110 0000(0X60) ②FIFO_ROLLOVER_EN:0001 0000(0X10) ③FIFO_A_FULL[3:0]:0000 1111(0X0F) |
SMP_AVE (样本平均) | ①000=1分(即不平均)②001=2③010=4④011=8⑤100=16⑥101=32⑦110=32⑧111=32 | ||
FIFO_ROLLOVER_EN (FIFO 全滚动) | 当FIFO完全充满数据时,该位控制FIFO的行为。如果设置了 FIFO_ROLLOVER_EN (1),则 FIFO 地址将滚动到零,并且 FIFO 继续填充新数据。如果位未设置 (0),则在读取 FIFO_DATA 或更改 WRITE/READ 指针位置之前,FIFO 不会更新。 | ||
FIFO_A_FULL (FIFO Almost Full Value) | 该寄存器设置发出中断时FIFO中剩余的数据样本数(3个字节/个样本)。例如,如果此字段设置为 0x0,则当 FIFO 中剩余 0 个数据样本(所有 32 个 FIFO 字都有未读数据)时发出中断。此外,如果此字段设置为 0xF,则当 FIFO 中剩余 15 个数据样本(17 个 FIFO 数据样本具有未读数据)时,将发出中断。 | ||
REG_MODE_CONFIG (模式配置寄存器) | 0x09 | 0x00 | ①SHDN:1000 0000(0X80) ②RESET:0100 0000(0X40) ③MODE[2:0]:0000 0111(0x08) |
SHDN (Shutdown Control:停机控制) | 通过将该位设置为 1,可以将该部件置于省电模式。在省电模式下,所有寄存器都保留其值,写/读操作正常工作。在此模式下,所有中断均被清除为零。 | ||
RESET(复位控制) | 当RESET位设置为1时,所有配置、阈值和数据寄存器都通过上电复位复位复位到其上电状态。复位序列完成后,RESET位将自动清零。 | ||
MODE(模式控制) | ①000-001(0x00~0x01)——请勿使用; ②010(0x02)——心率模式——仅红色LED ③011(0x03)——SPO2模式——红色和红外线 ④100—110(0x04~0x06)——请勿使用 ⑤111(0x07)——多LED模式——红色和红外线 | ||
REG_SPO2_CONFIG (血氧配置寄存器) | 0x0A | 0x00 | ①SPO2_ADC_RGE[1:0]:0110 0000(0X60) ②SPO2_SR[2:0]:0001 1100(0X1C) ③LED_PW[1:0]:0000 0011(0X03) ④REG ADDR:0X0A ⑤POR STATE:0X00 |
SPO2_ADC_RGE[1:0} | ①00(0x00) 量程(nA) 2048 ②01(0x01) 量程(nA) 4096 ③10(0x02) 量程(nA) 8192 ④11(0x03) 量程(nA) 16384 | ||
SPO2_SR[2:0] | ①000(0x00) 每秒采样数 50 ②001(0x01) 每秒采样数 100 ③010 (0x02) 每秒采样数 200 ④011 (0x03) 每秒采样数 400 ⑤100 (0x04) 每秒采样数 800 ⑥101 (0x05) 每秒采样数 1000 ⑦110 (0x06) 每秒采样数 1600 ⑧111 (0x07) 每秒采样数 3200 | ||
LED_PW[1:0] | ①00(0x00) 脉冲宽度(uS): 69 ADC分辨率(位):15 ②01(0x01) 脉冲宽度(uS): 118 ADC分辨率(位):16 ③10(0x02) 脉冲宽度(uS): 215 ADC分辨率(位):17 ④11(0x03) 脉冲宽度(uS): 411 ADC分辨率(位):18 | ||
REG_LED1_PA (LED1脉冲幅度寄存器) | 0x0C | 0x00 | 1111 1111(0xFF) |
REG_LED2 PA (LED2脉冲幅度寄存器) | 0x0D | 0x00 | 1111 1111(0xFF) |
LED Current Control | LEDx_PA[7:0] RED_PA[7:0] IR_PA[7:0] | ①0x00小时 典型LED电流(mA):0.0 ②0x01小时 典型LED电流(mA):0.2 ③0x02小时 典型LED电流(mA):0.4 ④0x0F小时 典型LED电流(mA):3.0 ⑤0x1F小时 典型LED电流(mA):6.2 ⑥0x3F小时 典型LED电流(mA):12.6 ⑦0x7F小时 典型LED电流(mA):25.4 ⑧0xFF小时 典型LED电流(mA):51.0 | |
Multi-LED Mode Control Registers | 0X11 | ①SLOT2[2:0]:0111 0111(0X77): Ⅰ、000(0x00):无(禁用)LED处于活动状态,LED脉冲幅度N/A(关闭) Ⅱ、001(0x01):LED1(红色) LED1_PA[7:0] Ⅲ、010(0x02):LED2(红外) LED2_PA[7:0] Ⅳ、011(0x03):没有LED处于活动状态 N/A(关闭) Ⅴ、100(0x04):没有LED处于活动状态 N/A(关闭) Ⅵ、101(0x05):保留 保留 Ⅶ、110(0x06):保留 保留 Ⅷ、111(0x07):保留 保留 ②SLOT1[2:0]:0000 0111(0X07) (注:每个插槽都会向 FIFO 生成一个 3 字节的输出。一个样本包含所有活动插槽,例如,如果 SLOT1 和 SLOT2 不为零,则一个样本为 2 x 3 = 6 字节; 插槽应按顺序启用(即,如果启用了 SLOT1,则不应禁用 SLOT2)。) | |
0X12 | ①SLOT4[2:0]:0111 0111(0X77) ②SLOT3[2:0]:0000 0111(0X07) | ||
REG_PTLOT_PA (用来设置传感器探针LED电流,除用于测量血氧和心率的红光和红外光外, 还可以使用探针LED获取额外信号) | 0x10 | (官方数据手册暂时木有找到) |
一、FIFO数据寄存器
1、FIFO的宽度
圆形FIFO深度为32,可以支撑32个数据样本,样本大小以来于LED通道的数量,由于每个通道信号都存储3字节数据信号,因此FIFO宽度可以为3字节或6字节;
I2C 寄存器映射中的FIFO_DATA寄存器指向要从 FIFO 读取的下一个样本,FIFO_RD_PTR指向此样本,读取FIFO_DATA寄存器,不会自动递增 I2C 寄存器地址。突发读取此寄存器,会一遍又一遍地读取相同的地址。每个样本是每个通道 3 个字节的数据(即 3 个字节用于 RED,3 个字节用于 IR 等)。
2、FIFO的写入与读取
FIFO寄存器(0x04–0x07)都可以写入和读取,但实际在操作中只能写入FIFO_RD_PTR寄存器。其他数据按MAX30102自动递增或填充数据。开始新的 SpO2 或心率转换时,建议首先将 FIFO_WR_PTR、OVF_COUNTER 和 FIFO_RD_PTR 寄存器清除到所有零 (0x00),以确保 FIFO 为空且处于已知状态。在一个突发读取 I2C 事务中读取MAX30102寄存器时,寄存器地址指针通常会递增,以便发送的下一个数据字节来自下一个寄存器,依此类推。FIFO数据寄存器、寄存器0x07除外,读取此寄存器时,地址指针不会递增,但FIFO_RD_PTR会递增。因此,发送的下一个数据字节代表FIFO中可用的下一个数据字节;
通常,从 I2C 接口读取寄存器会自动递增寄存器地址指针,以便可以在没有 I2C 启动事件的情况下在突发读取中读取所有寄存器。在MAX30102中,除FIFO_DATA寄存器(寄存器0x07)之外,所有寄存器都适用;
读取FIFO_DATA寄存器不会自动递增寄存器地址。突发读取此寄存器会一遍又一遍地从同一地址读取数据。每个样本包含多个字节的数据,因此应从此寄存器(在同一事务中)读取多个字节以获得一个完整的样本;
另一个例外是0xFF。在0xFF寄存器之后读取更多字节不会将地址指针推进回0x00,并且读取的数据没有意义。
3、FIFO数据结构
数据FIFO由一个32个样本的存储器组成,可以存储IR和Red ADC数据。由于每个样本由两个数据通道组成,因此每个样本有 6 个字节的数据,因此 FIFO 中总共可以存储 192 个字节的数据。
FIFO数据左对齐,无论ADC分辨率设置如何,MSB位始终处于位17数据位置。
SpO2 模式下的每个数据样本都包含两个数据三元组(每个 3 个字节),要读取一个样本,每个字节都需要一个 I2C 读取命令。因此,要在 SpO2 模式下读取一个样本,需要读取 6 个 I2C 字节。读取每个样本的第一个字节后,FIFO 读取指针会自动递增。
写/读指针用于控制FIFO中的数据流。每次将新样本添加到FIFO时,写入指针都会递增。每次从FIFO读取样本时,读取指针都会递增。要从FIFO重新读取样本,请将其值递减1,然后再次读取数据寄存器。
进入 SpO2 模式或 HR 模式时,应清除 FIFO 写入/读取指针(返回 0x00),以便 FIFO 中没有表示旧数据。如果 VDD 重启或 VDD 降至其 UVLO 电压以下,则指针会自动清除。
3、FIFO读取数据伪代码示例
First transaction: Get the FIFO_WR_PTR:
START;
Send device address + write mode
Send address of FIFO_WR_PTR;
REPEATED_START;
Send device address + read mode
Read FIFO_WR_PTR;
STOP;
The central processor evaluates the number of samples to be read from the FIFO: NUM_AVAILABLE_SAMPLES = FIFO_WR_PTR – FIFO_RD_PTR (Note: pointer wrap around should be taken into account)
NUM_SAMPLES_TO_READ = < less than or equal to NUM_AVAILABLE_SAMPLES >
Second transaction: Read NUM_SAMPLES_TO_READ samples from the FIFO:
START;
Send device address + write mode
Send address of FIFO_DATA;
REPEATED_START;
Send device address + read mode
for (i = 0; i < NUM_SAMPLES_TO_READ; i++) {
Read FIFO_DATA;
Save LED1[23:16];
Read FIFO_DATA;
Save LED1[15:8];
Read FIFO_DATA;
Save LED1[7:0];
Read FIFO_DATA;
Save LED2[23:16];
Read FIFO_DATA; Save LED2[15:8];
Read FIFO_DATA; Save LED2[7:0];
Read FIFO_DATA; }
STOP;
START;
Send device address + write mode Send address of FIFO_RD_PTR;
Write FIFO_RD_PTR;
STOP;
Third transaction: Write to FIFO_RD_PTR register. If the second transaction was successful, FIFO_RD_PTR points to the next sample in the FIFO, and this third transaction is not necessary. Otherwise, the processor updates the FIFO_RD_PTR appropriately, so that the samples are reread.(第三个事务:写入FIFO_RD_PTR寄存器。如果第二个事务成功,则FIFO_RD_PTR指向FIFO中的下一个样本,而第三个事务不是必需的。否则,处理器会适当地更新FIFO_RD_PTR,以便重新读取样本。)
二、SPO2模式
在心率模式下,仅使用红色 LED 来捕获光学数据并确定用户的心率和/或光电容积脉搏波 (PPG)。
1、红色 LED 电流设置与 LED 温升的关系
红色 LED 电流设置 | 红色 LED 占空比 (% of LED) 脉冲宽度到采样时间) | 预估温度 上升(添加到温度传感器 测量) (°C) |
00000001(0x01) (0.2mA) | 8 | 0.1 |
11111010 (0xFA)(50mA) | 8 | 2 |
00000001(0x01) (0.2mA) | 16 | 0.3 |
11111010 (0xFA)(50mA) | 16 | 4 |
00000001(0x01) (0.2mA) | 32 | 0.6 |
11111010 (0xFA)(50mA) | 32 | 8 |
2、SpO2 模式下的时序
内部先进先出最多可存储 32 个样本,因此系统处理器无需在每次采样后读取数据。
3、I2C接口
MAX30102具有 I2C/SMBus 兼容的 2 线串行接口,由串行数据线 (SDA) 和串行时钟线 (SCL) 组成。SDA 和 SCL 以高达 400kHz 的时钟速率促进MAX30102和主站之间的通信。
主站生成 SCL 并在总线上启动数据传输。主设备通过传输正确的从设备地址后跟数据将数据写入MAX30102。每个传输序列都由 START (S) 或 REPEAT START (Sr) 条件和 STOP (P) 条件构成。传输到MAX30102的每个字的长度为 8 位,后跟一个确认时钟脉冲。从MAX30102读取数据的主站发送正确的从地址,然后是一系列九个 SCL 脉冲。
MAX30102在SDA上传输数据,与主站生成的SCL脉冲同步。主服务器确认接收到每个字节的数据。每个读取序列都由 START (S) 或 REPEAT START (Sr) 条件、不确认和 STOP (P) 条件构成。SDA既可作为输入输出,也可作为漏极开路输出。SDA上需要一个上拉电阻,通常大于500Ω。SCL 仅作为输入运行。如果总线上有多个主控器,或者单个主控器具有漏极开路 SCL 输出,则 SCL 上需要一个上拉电阻,通常大于 500Ω。符合 SDA 和 SCL 的串联电阻器是可选的。串联电阻器可保护MAX30102的数字输入免受总线线路上的高压尖峰的影响,并最大限度地减少总线信号的串扰和下冲。
①位传输
在每个 SCL 周期中传输一个数据位。在SCL脉冲的高周期内,SDA上的数据必须保持稳定。当 SCL 高时 SDA 的变化是控制信号。
②START和STOP条件
不使用总线时,SDA 和 SCL 怠速为高电平。主站通过发出 START 条件来启动通信。START 条件是 SDA 上 SCL 高电平时从高到低的转换。STOP条件是SDA上的低到高转换,而SCL为高。来自主站的 START 条件发出向设备传输的开始信号。主站通过发出 STOP 条件来终止传输并释放总线。如果生成 REPEAT START 条件而不是 STOP 条件,则总线将保持活动状态。
③早期停止条件
MAX30102在数据传输过程中的任何点识别 STOP 条件,除非 STOP 条件与 START 条件发生在相同的高脉冲中。为了正常运行,请勿在与 START 条件相同的 SCL 高脉冲期间发送 STOP 条件。
④从站地址
总线主设备通过发出 START 条件后跟 7 位从设备 ID 来启动与从设备的通信。空闲时,MAX30102会等待 START 条件,后跟其从属 ID。串行接口逐位比较每个从站ID,如果检测到不正确的从站ID,接口可以立即断电并断开与SCL的连接。在识别出 START 条件后跟正确的从属 ID 后,MAX30102被编程为接受或发送数据。从 ID 字的 LSB 是读/写 (R/W) 位。R/W 表示主设备是写入MAX30102还是从读取数据(R/W = 0 选择写入条件,R/W = 1 选择读取条件)。
在收到正确的从机ID后,MAX30102通过将SDA拉低一个时钟周期来发出ACK。
MAX30102从 ID 由 7 个固定位 B7–B1 (设置为 0b1010111) 组成。首先传输最高有效从 ID 位 (B7),然后是其余位。 表 17 显示了设备可能的从属 ID。
⑤承认
确认位 (ACK) 是时钟的第 9 位,MAX30102在写入模式下使用它来握手接收每个字节的数据(图 8)。如果成功接收到前一个字节,则MAX30102在整个主生成的第 9 个时钟脉冲期间下拉 SDA。监控 ACK 允许检测不成功的数据传输。如果接收设备繁忙或发生系统故障,则会发生数据传输失败。如果数据传输不成功,总线主站将重试通信。主站下拉 SDA。
4、从站 ID 说明
在第 9 个时钟周期内,当MAX30102处于读取模式时确认接收数据。主服务器在每个读取字节后发送确认,以允许数据传输继续。当主设备从MAX30102读取数据的最后一个字节时,会发送“不确认”,然后是 STOP 条件。
①写入数据格式
对于写入操作,将从属 ID 作为第一个字节发送,后跟寄存器地址字节,然后是一个或多个数据字节。寄存器地址指针在接收到每个字节的数据后自动递增,因此例如,可以一次写入整个寄存器库。使用 STOP 条件终止数据传输。写入操作如图 9 所示。
内部寄存器地址指针会自动递增,因此写入其他数据字节会按顺序填充数据寄存器。
②读取数据格式
对于读取操作,必须执行两个 I2C 操作。首先,发送从 ID 字节,然后发送要读取的 I2C 寄存器。然后发送 REPEAT START (Sr) 条件,后跟读取从站 ID。然后,MAX30102从第一次操作中选择的寄存器开始发送数据。读取指针自动递增,因此器件继续按顺序从其他寄存器发送数据,直到收到 STOP (P) 条件。例外情况是FIFO_DATA寄存器,在读取其他字节时,读取指针不再递增。要读取FIFO_DATA后的下一个寄存器,需要 I2C 写入命令来更改读取指针的位置。
图 10 和 图 11 显示了读取一个字节和多个字节数据的过程。
发送读取寄存器地址需要初始写入操作。
数据按顺序从寄存器发送,从初始 I2C 写入操作中选择的寄存器开始。如果读取FIFO_DATA寄存器,则读取指针不会自动递增,后续数据字节将包含FIFO的内容。