第四章 模拟前端AFE芯片详解:AFE4404/MAX30102等芯片介绍、寄存器配置、I2C通信时序

各位同学,欢迎来到第四章。这一章我们聊聊血氧仪最核心的器件——模拟前端AFE芯片。

说实话,AFE芯片是整个血氧仪设计的灵魂。你想想看,传感器采集到的光信号极其微弱,噪声又大,如果没有一个好的AFE芯片做信号调理,后面的算法再牛也白搭。我在项目中就吃过这个亏,第一次做血氧仪时选了个通用运放搭的电路,结果信噪比惨不忍睹,折腾了两个月才换专用AFE芯片。

4.1 主流AFE芯片选型对比

目前市面上主流的血氧仪AFE芯片,主要有TI的AFE4404、AFE4490,以及Maxim的MAX30102、MAX30100。我个人的习惯是,根据产品定位来选:

  • AFE4404:TI出品,四通道,支持SPO2和心率检测,动态范围大,适合医疗级产品
  • MAX30102:Maxim出品,集成LED驱动和光电检测,封装极小,适合消费级可穿戴设备
  • AFE4490:AFE4404的升级版,多了更多诊断功能,适合高端监护仪
  • MAX30100:MAX30102的前代产品,功耗略高,但价格便宜

选型建议:如果是做医疗认证的产品,我建议用AFE4404或AFE4490,它们的性能指标更可靠。如果是做手环、智能手表这类消费产品,MAX30102是更好的选择,体积小、功耗低。

下面这张表是我整理的对比数据,大家可以参考:

参数 AFE4404 MAX30102 AFE4490
通道数 4通道 2通道 4通道
LED驱动电流 最大100mA 最大50mA 最大100mA
ADC分辨率 22位 18位 22位
采样率 最高1kHz 最高400Hz 最高1kHz
封装 QFN-40 OLGA-14 QFN-40
典型应用 医疗监护仪 智能手环 高端监护仪

4.2 AFE4404内部架构详解

我们重点讲AFE4404,因为它的架构比较典型,理解了它,其他AFE芯片也就触类旁通了。

AFE4404内部主要包含以下几个模块:

  • LED驱动电路:可编程电流源,驱动红光和红外光LED
  • 光电二极管接口:接收反射回来的光信号,转换成电流
  • 跨阻放大器(TIA):将电流信号转换成电压信号,这是最关键的一级
  • 环境光消除电路:滤除环境光的干扰
  • 可编程增益放大器(PGA):进一步放大信号
  • 22位Δ-Σ ADC:将模拟信号数字化
  • 数字滤波器和FIFO:对数据进行预处理和缓存

嗯,这里要注意,AFE4404的TIA增益和PGA增益都是可编程的。我在项目中遇到过一个问题:增益设置太高,信号饱和;增益设置太低,信号太弱。后来我总结了一个经验——先设一个中等增益,然后根据实际信号幅度微调。

经验之谈:AFE4404的TIA增益建议设为50kΩ或100kΩ,PGA增益设为1倍或2倍。如果信号太弱,优先增加LED电流,而不是盲目提高增益。提高增益会同时放大噪声,得不偿失。

4.3 MAX30102的特点与差异

MAX30102和AFE4404的设计思路不太一样。MAX30102把LED驱动、光电检测、ADC、环境光消除都集成在一个小封装里,只有14个引脚。说白了,它就是为了可穿戴设备量身定做的。

MAX30102的几个关键特点:

  • 集成LED:内部集成了红光和红外光LED,省去了外部LED选型的麻烦
  • 低功耗:待机电流只有0.7μA,非常适合电池供电设备
  • FIFO深度32级:可以缓存数据,减少MCU的读取频率
  • 温度补偿:内置温度传感器,可以补偿温度对LED的影响

不过MAX30102也有缺点。它的ADC只有18位,动态范围不如AFE4404。而且它的采样率最高只有400Hz,对于某些需要高采样率的应用可能不够。我记得有一次做运动场景的血氧测试,MAX30102的采样率就不够用了,最后换成了AFE4404。

4.4 寄存器配置详解

AFE芯片的配置,说白了就是写寄存器。我们以AFE4404为例,讲几个关键寄存器。

4.4.1 控制寄存器(CONTROL_REG)

这个寄存器控制芯片的工作模式:

  • Bit[1:0]:工作模式选择,00=待机,01=正常模式,10=诊断模式
  • Bit[2]:LED使能,1=开启LED驱动
  • Bit[3]:ADC使能,1=开启ADC转换

4.4.2 LED电流寄存器(LED_CURRENT)

设置红光和红外光LED的驱动电流:

  • 红光LED电流:寄存器值×0.5mA,范围0~100mA
  • 红外光LED电流:寄存器值×0.5mA,范围0~100mA

4.4.3 增益控制寄存器(GAIN_CTRL)

设置TIA和PGA的增益:

  • TIA增益:可选50kΩ、100kΩ、200kΩ、500kΩ
  • PGA增益:可选1倍、2倍、4倍、8倍

注意:增益设置不能超过芯片的最大输入范围。如果信号饱和,ADC会输出满量程值,这时候数据是无效的。我曾经在调试时发现数据全是0x7FFFFF,检查了半天才发现是增益设太高了。

下面是一个典型的AFE4404初始化代码示例:

// AFE4404初始化配置
void AFE4404_Init(void) {
    // 1. 复位芯片
    I2C_WriteRegister(AFE4404_ADDR, 0x00, 0x01);
    delay_ms(10);
    
    // 2. 设置工作模式:正常模式,开启LED和ADC
    I2C_WriteRegister(AFE4404_ADDR, 0x01, 0x0F);
    
    // 3. 设置LED电流:红光20mA,红外光15mA
    I2C_WriteRegister(AFE4404_ADDR, 0x02, 0x28); // 红光:40*0.5mA=20mA
    I2C_WriteRegister(AFE4404_ADDR, 0x03, 0x1E); // 红外光:30*0.5mA=15mA
    
    // 4. 设置增益:TIA=100kΩ,PGA=2倍
    I2C_WriteRegister(AFE4404_ADDR, 0x04, 0x12); // TIA=01(100k), PGA=01(2x)
    
    // 5. 设置采样率:100Hz
    I2C_WriteRegister(AFE4404_ADDR, 0x05, 0x64); // 100Hz
    
    // 6. 使能FIFO
    I2C_WriteRegister(AFE4404_ADDR, 0x06, 0x01);
}

4.5 I2C通信时序详解

AFE4404和MAX30102都使用I2C接口通信。I2C的时序看起来简单,但实际调试时坑不少。

标准的I2C写时序是这样的:

  1. 主机发送起始信号(SDA拉低,SCL保持高)
  2. 主机发送7位设备地址+写位(0)
  3. 从机应答(ACK)
  4. 主机发送寄存器地址
  5. 从机应答
  6. 主机发送数据字节
  7. 从机应答
  8. 重复步骤6-7直到数据发送完毕
  9. 主机发送停止信号

读时序稍微复杂一点:

  1. 先写寄存器地址(伪写操作)
  2. 然后重新发送起始信号
  3. 发送设备地址+读位(1)
  4. 从机发送数据
  5. 主机应答(最后一个字节不应答)
  6. 主机发送停止信号

关键点:AFE4404的I2C地址是0x58(7位地址),MAX30102的I2C地址是0x57。注意,有些MCU的I2C库要求传入8位地址,需要左移一位。我刚开始用STM32时就在这里栽过跟头。

下面是一个完整的I2C读时序代码示例:

// AFE4404 I2C读寄存器
uint32_t AFE4404_ReadRegister(uint8_t regAddr) {
    uint8_t data[3] = {0};
    
    // 1. 发送寄存器地址(伪写)
    I2C_Start();
    I2C_SendByte(AFE4404_ADDR << 1 | 0); // 写操作
    I2C_WaitAck();
    I2C_SendByte(regAddr);
    I2C_WaitAck();
    
    // 2. 重新开始,读取数据
    I2C_Start();
    I2C_SendByte(AFE4404_ADDR << 1 | 1); // 读操作
    I2C_WaitAck();
    
    // 3. 读取3个字节(AFE4404的寄存器是24位)
    data[0] = I2C_ReadByte();
    I2C_SendAck(0); // 应答
    data[1] = I2C_ReadByte();
    I2C_SendAck(0); // 应答
    data[2] = I2C_ReadByte();
    I2C_SendAck(1); // 最后一个字节不应答
    
    // 4. 停止
    I2C_Stop();
    
    // 5. 组合成24位数据
    return ((uint32_t)data[0] << 16) | ((uint32_t)data[1] << 8) | data[2];
}

4.6 实际调试中的注意事项

最后,分享几个我在实际项目中踩过的坑:

  • 上电时序:AFE4404需要先上电,再配置寄存器。如果配置时芯片还没准备好,写寄存器会失败。我习惯在上电后加一个50ms的延时。
  • I2C速率:AFE4404的I2C最高支持400kHz,但建议先用100kHz调试,稳定后再提高速率。速率太高时信号质量会变差。
  • FIFO溢出:如果MCU读取速度跟不上ADC采样速度,FIFO会溢出。这时候需要提高读取频率,或者降低采样率。
  • 环境光干扰:MAX30102对环境光比较敏感,建议在传感器上加遮光罩。我在做手环项目时,发现阳光下数据异常,加了遮光罩就好了。

调试技巧:用逻辑分析仪抓I2C波形,可以快速定位通信问题。我每次调试新板子,第一件事就是抓I2C波形,确认通信正常后再去调其他参数。

好了,这一章的内容就到这里。AFE芯片是血氧仪的核心,寄存器配置和I2C通信是基本功。下一章我们讲如何设计AFE芯片的外围电路,包括LED驱动电路、光电检测电路和电源滤波电路。到时候我会分享一些具体的电路设计经验和仿真结果。