ADI ADXL382-1 FIFO 模式配置与调试实操

作者
Chad Peng
文章來源
Cytech Engineer

ADI ADXL382-1 FIFO 模式配置与调试实操

背景介绍

SPI (Serial Peripheral Interface) 的 FIFO 模式是一种通过使用先入先出 (First In First Out) 缓冲区来提高数据传输效率的工作方式。

FIFO 模式的优势:

  • 提高传输效率:减少 CPU 中断频率,允许批量传输数据
  • 降低 CPU 负载:CPU 可以一次性填充或读取多个数据,不必频繁处理 SPI 事务
  • 提高系统性能:在传输大量数据时特别有效
  • 支持更高波特率:通过缓冲机制可以支持更高的通信速率

ADI ADXL382 芯片概述

ADXL382 是一款低噪声密度、低功耗的三轴加速度计,具有可选的测量范围,支持 ±15g、±30g 和 ±60g 量程;自 2024 年底发布以来,深受振动健康监测、机器学习行业人员喜爱的一款明星物料。下图 (图1) 为 ADXL382 的功能特性与产品图:

图1 ADXL382 的功能特性与产品图
图1 ADXL382 的功能特性与产品图

ADXL382-1 的 FIFO MODES

  • FIFO disabled (FIFO 禁用)
  • Normal (also referred to as oldest saved or First N) (正常模式)
  • Stream (also referred to as Last N) (数据流模式)
  • Trigger (触发模式)

图2 FIFO 模式配置示意图
图2 FIFO 模式配置示意图

工作流程介绍

接下来对上述四种 ADXL382 的 FIFO 模式进行详细阐述,每个模式可通过寄存器 0x30 的 5:4 位进行配置:

FIFO disabled

当 FIFO 禁用时 (寄存器 0x30 的 [5:4] 位 (FIFO 模式) 设为 0b00),不会存储任何数据样本,读取 FIFO 时将返回 0。

Normal

在正常模式下 (寄存器 0x30 的 [5:4] 位 (FIFO 模式) 设为 0b01),FIFO 会累积数据直至存满,之后便停止存储,这一状态可通过 FIFO_FULL (寄存器 0x11 的第 1 位) 为 1 来指示。只有当通过从 FIFO 缓冲区中读取样本腾出空间后,才能继续收集新的数据。

Stream

在流模式下 (寄存器 0x30 的 [5:4] 位 (FIFO 模式) 设为 0b10),无论 FIFO 是否存满,新数据都会持续写入。当 FIFO 存满时,最旧的数据集 (例如 X、Y、Z 和 T 数据样本) 会被丢弃,为新数据集腾出空间。通过这种方式,FIFO 缓冲区中始终保存的是最新的数据。

流模式有助于减轻主机处理器的负担:处理器可以处理其他任务,同时数据在 FIFO 中持续收集。当 FIFO 中的样本数量达到特定值 (由寄存器 0x30 的第 0 位和寄存器 0x31 的 [7:0] 位 (FIFO 样本数) 指定) 时,会触发 FIFO 水印中断 (如果该中断已启用)。此时,主机处理器可以读取整个 FIFO 的内容,之后在 FIFO 再次存满的过程中回到其他任务的处理中。

Trigger

在触发模式下 (寄存器 0x30 的 [5:4] 位 (FIFO 模式) 设为 0b11),FIFO 会保存触发事件前后的样本。该触发事件可以是活动事件或外部中断。在此模式下,无论 FIFO 是否存满,新的数据样本都会持续收集 (与流模式类似)。一旦触发事件发生 (活动事件或外部中断均可),FIFO 会继续收集一定数量的数据样本,触发事件后收集的样本数量由 FIFO 样本数位 (寄存器 0x30 的第 0 位和寄存器 0x31 的 [7:0] 位) 的值设定。

备注:要启用外部中断触发的 FIFO 模式,需将 FIFO_EXT_TRIG 位 (寄存器 0x30 的第 3 位) 设为 1。该位设为 1 后,发送至 FSYNC 引脚的外部中断会触发 FIFO 数据捕获。

ADXL382-1 的 FIFO 配置演示

以下为 ADXL382-1 FIFO 模式的典型配置流程:

1、向寄存器 0x27 (DIG_EN) 写入 0x78。

启用 x、y、z 通道并开启 FIFO 模式。退出待机模式后,数据才会开始在 FIFO 中累积。

2、向寄存器 0x30 (FIFO_CFG0) 写入 0x60。

启用 FIFO 通道 ID 和 FIFO 流模式。

3、向寄存器 0x31 (FIFO_CFG1) 写入 0x0C。

将 FIFO_SAMPLES (寄存器 0x30 的第 0 位和寄存器 0x31 的 [7:0] 位) 设为 12。当 FIFO 中存储了 4 个完整样本 (X、Y、Z) 时,FIFO_WATERMARK 位 (寄存器 0x11 的第 3 位) 会置位。
此值可根据应用需求进行修改。

4、向寄存器 0x2B (INT0_MAP0) 写入 0x08。

将 FIFO_WATERMARK 位 (寄存器 0x11 的第 3 位) 映射到 INT0 引脚。

5、向寄存器 0x26 (OP_MODE) 写入 0x0C。

启用高性能 (HP) 模式。此时数据开始在 FIFO 中累积。

图3 ADXL382-1 FIFO 配置流程
图3 ADXL382-1 FIFO 配置流程
图4 ADXL382-1 FIFO 配置演示
图4 ADXL382-1 FIFO 配置演示

案例分析

当客户在调试 ADXL382 FIFO 模式中会遇到一些问题:比如 FIFO WATER 中断的长度设置为 100 个点,当 FIFO 采集到 100 个点后,产生中断,程序中读取 FIFO 中的数据,在读取 FIFO 数据的过程中,又产生了中断情况。如下图 (图5) 为逻辑分析仪演示的细节:

图5 逻辑分析仪细节演示
图5 逻辑分析仪细节演示
图6 配置 FIFO 数据长度
图6 配置 FIFO 数据长度
图7 int0 上面中断检测
图7 int0 上面中断检测

正常思路定位:

  1. 检查 STATUS0 的状态,看看是否有 FIFO full 或 overrun 的错误;
  2. 降低 ADXL382 的采样频率。

对应调试结果:

  1. STATUS0 的状态没有问题,返回值都是 0x18,没有出现 FIFO full 或 overrun 的错误;
  2. ADXL382 的采样率是 16KHZ,MCU 的 SPI 时钟为 6MHZ,通过逻辑分析看 SPI 读取 FIFO 数据速度是完全可以跟上,但是伪中断仍然存在。

图8 调试结果示意图
图8 调试结果示意图

问题定位:

ADXL382 的 FIFO watermark 的清中断,需要在读取 FIFO_STATUS/FIFO buffer 后,再读 STATUS0 寄存器。下图 (图9) 为 ADI 产品手册说明:

图9 ADI 产品手册说明
图9 ADI 产品手册说明

结论:

STREAM 流模式下,需要在读取 FIFO_STATUS/FIFO buffer 后,再读 STATUS0 寄存器;如果先读状态寄存器的话导致产生伪中断的信号。

机理分析:

ADXL382 要求先读取 FIFO 数据/状态,再读 STATUS0 寄存器才能清除水印中断,核心原因是:FIFO_WATERMARK 位的清零依赖于「FIFO 数据已被读取」的状态确认,需通过读取 STATUS0 完成最终复位。具体步骤如下:

Step 1:读取 FIFO_STATUS 或 FIFO buffer (数据读取阶段)

  • 目的:告知芯片「主机已获取FIFO中的数据」,降低 FIFO 内的样本数至水印阈值以下。
  • 读取 FIFO_STATUS 寄存器 (地址0x10):获取 FIFO 当前填充量等状态 (间接确认数据已读)。
  • 读取 FIFO buffer (地址0x3F):直接读取 FIFO中 的数据样本 (会导致 FIFO 指针下移,样本数减少)。
  • 注意:仅执行此步骤后,FIFO 内的样本数可能已低于阈值,但 FIFO_WATERMARK 位不会立即清零 (硬件设计要求额外确认步骤)。

Step 2:读取 STATUS0 寄存器 (状态确认阶段)

  • 目的:显式读取 STATUS0 寄存器,触发 FIFO_WATERMARK 位的清零。
  • ADXL382 的设计中,FIFO_WATERMARK 位的复位不是自动的 (即使 FIFO 样本数已低于阈值),而是需要通过读取 STATUS0 寄存器的操作来「确认」中断已被处理,从而将该位清零。
  • 本质:这是一种「双重确认机制」——确保主机不仅读取了数据,还明确检查了状态位,避免因数据读取不完整导致中断误清除。

图10 ADXL382 FIFO 清中断流程示意图
图10 ADXL382 FIFO 清中断流程示意图

总结

本文主要介绍 ADI ADXL382 三轴加速度计的四种 FIFO 工作模式及其配置方法,并结合实际调试案例,深入分析 FIFO 过程配置机理,为开发人员提供清晰的操作指南。欲了解关于更多 ADI 相关方案或技术信息,请与骏龙科技当地的办事处联系或点击下方「联系我们」,提交您的需求,骏龙科技公司愿意为您提供更详细的技术解答。

 

更多資訊: