学习记录——关于MAX30102寄存器那些事儿~

(以下仅代表个人相关学习记录,若有错误麻烦并感谢指出~)

由查阅MAX30102数据手册可知:

寄存器

地址

POR STATE(上电复位)

即默认地址

模式选择
Interrupt Status 10X000X00

①A_FULL:1000 0000(0X80)

②PPG_RDY:0100 0000(0X40)

③ALG_OVF:0010 0000(0X20)

④PWR_RDY:0000 0001(0X01)

Interrupt Status 20X010X00DIE_TEMP_EDY:0000 0010(0X02)

REG_INTR_ENABLE_1

(中断使能寄存器1)

0x020x00

①PPG_RDY_EN:0100 0000(0X40);

②ALC_OVF_EN:0010 0000(0X20);

③A_FULL_EN:1000 0000(0X80)

REG_INTR_ENABLE_2

(中断使能寄存器2)

0x030x00DIE_TEMP_RDY_EN:0000 0010(0X02)

REG_FIFO_WR_PTR

(写指针寄存器)

0x040x00[4:0]:0001 1111 (0X1F)

REG_OVF_COUNTER

(溢出寄存器)

0x050x00[4:0]:0001 1111 (0X1F)

REG_FIFO_RD_PTR

(读指针寄存器)

0x060x00[4:0]:0001 1111 (0X1F)
FIFO_DATA[7:0]:1111 1111(0XFF)

REG_FIFO_CONFIG

(FIFO配置寄存器)

0x080x00

①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

(模式配置寄存器)

0x090x00

①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

(血氧配置寄存器)

0x0A0x00

①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脉冲幅度寄存器)

0x0C0x001111 1111(0xFF)

REG_LED2 PA

(LED2脉冲幅度寄存器)

0x0D0x001111 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 Registers0X11

①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的内容。

  • 17
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值