产品简介
这是一款基于博世新一代高性能数字气压传感器BMP581设计的高精度气压温度传感器。它可同步直接输出大气压、温度及计算出的海拔高度数据。相比前代产品,其核心优势在于更高的绝对精度(±0.3 hPa)、更低的运行功耗(约700μA)、更低噪声(<0.1 Pa)以及更高的长期稳定性。
其内置先进的数字温度和线性度补偿算法,并集成FIFO缓冲区及可配置IIR滤波器。通过硬件级的数据缓冲与实时滤波处理,显著抑制了环境扰动引起的数据抖动,从而在动态应用场景中提供更可靠、更稳定的测量输出。
本产品支持I2C与UART通信,可灵活集成,并提供Arduino及Python开源代码库,极大简化了测试验证流程。凭借其高精度、宽量程、低功耗及稳定可靠性,该传感器非常适用于无人机定高、户外导航、室内外定位融合、气象监测及GPS导航增强等各类项目。
产品特性
- 宽电压兼容:支持3.3V与5V电平
- 多协议接口:支持 I2C和UART通信,适配灵活
- 多参数同步输出:直接测量气压、温度及计算海拔高度
- 高精度测量:绝对精度±0.3 hPa,数据可靠
- 低运行功耗:工作电流约700μA,续航持久
- 低噪声输出:噪声低于0.1 Pa RMS,输出稳定
- 可编程中断:支持阈值报警,便于事件驱动设计
- 用户配置存储:内置 6 Bytes 非易失性内存,保存自定义配置
- 硬件 FIFO 缓冲:降低主机查询频率,节省系统功耗
- 集成可编程滤波器:可配置低通滤波,有效抑制高频噪声
应用场景
- 室外环境监测
- 无人机定高与避障
- 登山海拔测量
- 楼层检测
- 户外导航
- 户外气象站
技术规格
基本参数
- 工作电压:DC 3.3~5V
- 工作电流:700μA
- 通讯接口:I2C/UART
- 接口形式:PH2.0-4P(Gravity线序)/2.54mm排针孔
- I2C地址:0x47(默认)/0x46
BMP581参数
- 气压测量范围:30~125 kPa
- 温度测量范围:0~65℃
- 绝对气压测量精度:±0.3 hPa(Typ)
- 相对气压测量精度:±0.06 hPa/10kPa(Typ)
- 相对高度测量精度:±0.5 m/10kPa
- 温度漂移系数:±0.5 Pa/K
- 气压数据分辨率:1/64
- 超低噪声:< 0.1 Pa(RMS,未启用低通滤波器)
物理尺寸
- PCB尺寸:32×27×7.18 mm
- 安装孔间距:25×20 mm
- 安装孔直径:3.0 mm
尺寸图
单位:mm

功能示意图

| 引脚丝印 | 功能描述 |
|---|---|
| D/T | 复用引脚:I2C模式为数据线(SDA),UART模式为发送端(TXD) |
| C/R | 复用引脚:I2C模式为时钟线(SCL),UART模式为接收端(RXD) |
| GND | 电源负极(接地) |
| VCC | 电源正极(供电输入3.3~5V) |
| INT | 中断输出引脚(通用) |
注意事项:
- “I2C/UART切换开关”的切换可以断电保存,重启设备后新模式生效。
Arduino IDE 使用教程
- 硬件准备
- SEN0665 Gravity: BMP581 气压传感器 ×1
- DFR0654 FireBeetle 2 ESP32-E ×1
- 软件准备
例程1:I2C 模式连续读取气压及温度数据
目标
通过 ESP32-E 的 I2C 接口与 Gravity: BMP581 气压传感器通信,连续读取气压、温度及海拔数据。
步骤 1:接线配置

- 按图示连接 Gravity: BMP581 气压传感器与 ESP32-E,核心对应关系:
- 传感器引脚 “VCC” → ESP32-E 3.3V
- 传感器引脚 “GND” → ESP32-E GND
- 传感器 I2C 引脚 “SCL” → ESP32-E SCL(默认 GPIO22)
- 传感器 I2C 引脚 “SDA” → ESP32-E SDA(默认 GPIO21)
- 传感器拨码开关配置:通信模式拨到I2C侧,I2C地址拨到0x47
注意:通信模式拨码开关的切换可以断电保存,重启设备后新模式生效。
步骤 2:代码上传
打开 Arduino IDE,复制以下代码并上传至 ESP32-E:
#include "DFRobot_BMP58X.h"
#define BMP5_COMM_I2C
#define CALIBRATE_ABSOLUTE_DIFFERENCE
const uint8_t ADDR = 0x47;
DFRobot_BMP58X_I2C bmp58x(&Wire, ADDR);
void setup() {
Serial.begin(115200);
while(!bmp58x.begin()){
Serial.println("Sensor init fail!");
delay(1000);
}
Serial.println("Sensor init success!");
//校准绝对误差(根据实际高度修改参数)
#if defined(CALIBRATE_ABSOLUTE_DIFFERENCE)
/*示例使用成都温江区540米的标高。使用时请用当地标高代替。*/
bmp58x.calibratedAbsoluteDifference(540.0);
#endif
//将测量模式设置为正常模式
bmp58x.setMeasureMode(bmp58x.eNormal);
}
void loop() {
delay(1000);
Serial.print("Temperature: ");
Serial.print(bmp58x.readTempC());
Serial.println(" °C");
Serial.print("Atmospheric Pressure: ");
Serial.print(bmp58x.readPressPa());
Serial.println(" Pa");
Serial.print("Altitude: ");
Serial.print(bmp58x.readAltitudeM());
Serial.println(" m");
Serial.println("=================================");
}
输出结果:

例程2:UART 模式连续读取气压及温度数据
目标
通过 ESP32-E 的 UART 接口与 Gravity: BMP581 气压传感器通信,连续读取气压、温度及海拔数据。
步骤 1:接线配置

- 按图示连接 Gravity: BMP581 气压传感器与 ESP32-E,核心对应关系:
- 传感器引脚 “VCC” → ESP32-E 3.3V
- 传感器引脚 “GND” → ESP32-E GND
- 传感器 UART 引脚 “RX” → ESP32-E D3
- 传感器 UART 引脚 “TX” → ESP32-E D2
- 传感器拨码开关配置:通信模式拨到UART侧,地址拨到0x47
注意:通信模式拨码开关的切换可以断电保存,重启设备后新模式生效。
步骤 2:代码上传
打开 Arduino IDE,复制以下代码并上传至 ESP32-E:
#include "DFRobot_BMP58X.h"
#include "DFRobot_RTU.h"
#define BMP5_COMM_UART
#define CALIBRATE_ABSOLUTE_DIFFERENCE
const uint8_t ADDR = 0x47;
#if defined(BMP5_COMM_UART)
DFRobot_BMP58X_UART bmp58x(&Serial1, 9600, ADDR, /*rx*/ D2, /*tx*/ D3);
#else
#error "Only UART communication is supported in this configuration"
#endif
void setup() {
Serial.begin(115200);
while(!bmp58x.begin()){
Serial.println("传感器初始化失败!");
delay(1000);
}
//校准绝对误差(根据实际高度修改参数)
#if defined(CALIBRATE_ABSOLUTE_DIFFERENCE)
/*示例使用成都温江区540米的标高。使用时请用当地标高代替。*/
bmp58x.calibratedAbsoluteDifference(540.0);
#endif
bmp58x.setMeasureMode(bmp58x.eNormal);
}
void loop() {
delay(1000);
Serial.print("temp: ");
Serial.print(bmp58x.readTempC());
Serial.print(" (C) press: ");
Serial.print(bmp58x.readPressPa());
Serial.print(" (Pa) alt: ");
Serial.print(bmp58x.readAltitudeM());
Serial.println(" (M)");
}
输出结果:

例程3:FIFO 数据读取与中断触发
FIFO介绍
FIFO(First In, First Out,先进先出)是传感器内部集成的数据缓冲机制,其核心特性是数据会暂时存到这里,等你需要时再一次性取走,确保数据时序的一致性。
在气压传感器中,FIFO 作为临时数据存储单元,承担着数据暂存与批量处理的功能:传感器按设定频率采集的温度、压力数据会先被有序写入 FIFO,而非实时传输至外部主机;当需要获取数据时,主机可通过单次操作读取 FIFO 中缓存的所有数据,实现批量获取。
与无缓冲机制相比,FIFO 的优势显著:
- 避免了高频实时通信带来的总线资源占用,降低系统交互开销
- 防止因主机处理延迟导致的瞬时数据丢失,保障数据完整性
- 支持按需求批量读取,适配不同场景下的数据分析节奏
简言之,FIFO 是传感器与主机之间的数据协调单元,通过有序缓冲与批量传输,优化了数据交互效率与可靠性。
目标
使用FIFO连续读取气压及温度数据。
步骤 1:接线配置

- 按图示连接 Gravity: BMP581 气压传感器与 ESP32-E,核心对应关系:
- 传感器引脚 “VCC” → ESP32-E 3.3V
- 传感器引脚 “GND” → ESP32-E GND
- 传感器 I2C 引脚 “SCL” → ESP32-E SCL(默认 GPIO22)
- 传感器 I2C 引脚 “SDA” → ESP32-E SDA(默认 GPIO21)
- 传感器引脚 “INT” → ESP32-E D6(GPIO14)
- 传感器拨码开关配置:通信模式拨到I2C侧,I2C地址拨到0x47
- 注意:通信模式拨码开关的切换可以断电保存,重启设备后新模式生效。
步骤 2:代码上传
打开 Arduino IDE,复制以下代码并上传至 ESP32-E:
#include "DFRobot_BMP58X.h"
#include "DFRobot_RTU.h"
#define BMP5_COMM_I2C
/* 如果不需要消除绝对测量误差,请取消注释此行 */
#define CALIBRATE_ABSOLUTE_DIFFERENCE
/**
* 配置中断模式:取消下面宏的注释可使用锁存中断,
* 否则为脉冲中断
*/
// #define BMP5_INT_MODE_LATCHED
const uint8_t ADDR = 0x47;
DFRobot_BMP58X_I2C bmp58x(&Wire, ADDR);
volatile uint8_t flag = 0;
/* 中断服务函数:触发时设置标志位 */
void interrupt() {
if (flag == 0) {
flag = 1;
}
}
void setup() {
Serial.begin(115200);
Serial.println("启动..");
while (!bmp58x.begin()) {
Serial.println("传感器初始化失败!");
delay(1000);
}
/**
* 配置FIFO参数:
* - 数据类型:压力+温度
* - 下采样:无
* - 模式:满时覆盖旧数据
* - 阈值:2帧(达到时触发中断)
*/
bmp58x.configFIFO(
bmp58x.eFIFOPressAndTempData, // 存储压力和温度数据
bmp58x.eNoDownSampling, // 不进行下采样
bmp58x.eFIFOOverwriteMode, // 覆盖模式
0x02 // 阈值为2帧
);
/**
* 配置中断参数:
* - 触发模式:脉冲/锁存(取决于宏定义)
* - 极性:高电平有效
* - 输出类型:推挽
*/
#if defined(BMP5_INT_MODE_LATCHED)
bmp58x.configInterrupt(bmp58x.eIntModeLatched, bmp58x.eIntHighActive, bmp58x.eIntPushPull);
#else
bmp58x.configInterrupt(bmp58x.eIntModePulsed, bmp58x.eIntHighActive, bmp58x.eIntPushPull);
#endif
/* 设置中断源:FIFO达到阈值时触发 */
bmp58x.setIntSource(bmp58x.eIntFIFOThres);
#if defined(CALIBRATE_ABSOLUTE_DIFFERENCE)
/**
* 以540米为参考海拔校准绝对差值
* (实际使用时修改为当地海拔)
*/
bmp58x.calibratedAbsoluteDifference(540.0);
#endif
/* 设置测量模式:正常模式(连续测量) */
bmp58x.setMeasureMode(bmp58x.eNormal);
/* 将中断附着到ESP32的D6引脚(上升沿触发) */
attachInterrupt(digitalPinToInterrupt(D6), interrupt, RISING);
}
void loop() {
/* 锁存中断需要读取状态寄存器以清除标志位 */
#if defined(BMP5_INT_MODE_LATCHED)
bmp58x.getIntStatus();
#endif
/* 检测到中断标志时,读取FIFO数据并打印 */
if (flag == 1) {
DFRobot_BMP58X::sFIFOData_t data = bmp58x.getFIFOData();
Serial.print("FIFO len: ");
Serial.println(data.len);
/* 循环打印FIFO中的所有数据 */
for(int i = 0; i < data.len; ++i){
Serial.print("temp: ");
Serial.print(data.fifoTempC[i]);
Serial.print(" (C) pressure: ");
Serial.print(data.fifoPressPa[i]);
Serial.println(" (Pa)");
}
flag = 0; // 清除标志位,等待下一次中断
}
}
输出结果:

API函数
/**
* @fn begin
* @brief 初始化传感器硬件接口
* @return 初始化成功返回true,失败返回false
*/
bool begin(void);
/**
* @fn setODR
* @brief 配置传感器输出数据率(ODR)
* @param odr 输出数据率选择(见: eOdr_t)
* @n 可用速率:
* @n - eOdr240Hz: 输出速率240 Hz
* @n - eOdr218_5Hz: 输出速率218.5 Hz
* @n - eOdr199_1Hz: 输出速率199.1 Hz
* @n - eOdr179_2Hz: 输出速率179.2 Hz
* @n - eOdr160Hz: 输出速率160 Hz
* @n - eOdr149_3Hz: 输出速率149.3 Hz
* @n - eOdr140Hz: 输出速率140 Hz
* @n - eOdr129_8Hz: 输出速率129.8 Hz
* @n - eOdr120Hz: 输出速率120 Hz
* @n - eOdr110_1Hz: 输出速率110.1 Hz
* @n - eOdr100_2Hz: 输出速率100.2 Hz
* @n - eOdr89_6Hz: 输出速率89.6 Hz
* @n - eOdr80Hz: 输出速率80 Hz
* @n - eOdr70Hz: 输出速率70 Hz
* @n - eOdr60Hz: 输出速率60 Hz
* @n - eOdr50Hz: 输出速率50 Hz
* @n - eOdr45Hz: 输出速率45 Hz
* @n - eOdr40Hz: 输出速率40 Hz
* @n - eOdr35Hz: 输出速率35 Hz
* @n - eOdr30Hz: 输出速率30 Hz
* @n - eOdr25Hz: 输出速率25 Hz
* @n - eOdr20Hz: 输出速率20 Hz
* @n - eOdr15Hz: 输出速率15 Hz
* @n - eOdr10Hz: 输出速率10 Hz
* @n - eOdr5Hz: 输出速率5 Hz
* @n - eOdr4Hz: 输出速率4 Hz
* @n - eOdr3Hz: 输出速率3 Hz
* @n - eOdr2Hz: 输出速率2 Hz
* @n - eOdr1Hz: 输出速率1 Hz
* @n - eOdr0_5Hz: 输出速率0.5 Hz
* @n - eOdr0_250Hz: 输出速率0.250 Hz
* @n - eOdr0_125Hz: 输出速率0.125 Hz
* @return 成功返回0,错误返回1
*/
uint8_t setODR(eODR_t odr);
/**
* @fn setOSR
* @brief 设置温度和压力的过采样率
* @param osrTemp 温度过采样(见: eOverSampling_t)
* @param osrPress 压力过采样(见: eOverSampling_t)
* @n 支持的值:
* @n - eOverSampling1: 1倍过采样
* @n - eOverSampling2: 2倍过采样
* @n - eOverSampling4: 4倍过采样
* @n - eOverSampling8: 8倍过采样
* @n - eOverSampling16: 16倍过采样
* @n - eOverSampling32: 32倍过采样
* @n - eOverSampling64: 64倍过采样
* @n - eOverSampling128: 128倍过采样
* @return 成功返回0,错误返回1
*/
uint8_t setOSR(eOverSampling_t osrTemp, eOverSampling_t osrPress);
/**
* @fn setMeasureMode
* @brief 配置传感器电源/测量模式
* @param mode 操作模式(见: eMeasureMode_t)
* @n 可用模式:
* @n - eSleep: 睡眠模式
* @n - eNormal: 正常测量模式
* @n - eSingleShot: 单次测量
* @n - eContinuous: 连续测量
* @n - eDeepSleep: 深度睡眠模式
* @return 成功返回0,错误返回1
*/
uint8_t setMeasureMode(eMeasureMode_t mode);
/**
* @fn reset
* @brief 执行传感器软件复位
* @return 成功返回0,错误返回1
*/
uint8_t reset(void);
/**
* @fn readTempC
* @brief 读取校准后的温度数据
* @return 温度值(摄氏度)
*/
float readTempC(void);
/**
* @fn readPressPa
* @brief 读取校准后的压力数据
* @return 压力值(帕斯卡)
*/
float readPressPa(void);
/**
* @fn readAltitudeM
* @brief 根据压力读数计算海拔高度
* @note 使用公式:
* @n altitude = (1 - (P/101325)^0.190284) * 44307.7
* @n 其中P = 当前压力值(Pa)
* @return 海拔高度(米)
*/
float readAltitudeM(void);
/**
* @fn configIIR
* @brief 配置IIR滤波器系数
* @param iirTemp 温度IIR滤波器(见: eIIRFilter_t)
* @param iirPress 压力IIR滤波器(见: eIIRFilter_t)
* @n 可用系数:
* @n - eFilterBypass: 旁路滤波器
* @n - eFilter1: 1阶滤波器
* @n - eFilter3: 3阶滤波器
* @n - eFilter7: 7阶滤波器
* @n - eFilter15: 15阶滤波器
* @n - eFilter31: 31阶滤波器
* @n - eFilter63: 63阶滤波器
* @n - eFilter127: 127阶滤波器
* @return 成功返回0,错误返回1
*/
uint8_t configIIR(eIIRFilter_t iirTemp, eIIRFilter_t iirPress);
/**
* @fn configFIFO
* @brief 配置FIFO操作参数
* @param dataSel 数据帧类型(见: eFIFODataSel_t)
* @n 可用类型:
* @n - eFIFODisable: FIFO禁用
* @n - eFIFOTempData: 仅温度数据
* @n - eFIFOPressData: 仅压力数据
* @n - eFIFOPressAndTempData: 压力和温度数据
*
* @param downSampling 下采样率(见: eFIFODownSampling_t)
* @n 可用比率:
* @n - eNoDownSampling: 无下采样
* @n - eDownSampling2: 2倍下采样
* @n - eDownSampling4: 4倍下采样
* @n - eDownSampling8: 8倍下采样
* @n - eDownSampling16: 16倍下采样
* @n - eDownSampling32: 32倍下采样
* @n - eDownSampling64: 64倍下采样
* @n - eDownSampling128: 128倍下采样
*
* @param mode FIFO操作模式(见: eFIFOWorkMode_t)
* @n 可用模式:
* @n - eFIFOOverwriteMode: 连续数据流模式
* @n - eFIFOFullStopMode: FIFO满时停止
*
* @param threshold FIFO触发阈值(0=禁用, 1-31=帧数)
* @n - 0x0F: 15帧。这是PT模式下的最大设置。最高有效位被忽略。
* @n - 0x1F: 31帧。这是P或T模式下的最大设置。
* @return 成功返回0,错误返回1
*/
uint8_t configFIFO(eFIFODataSel_t dataSel, eFIFODownSampling_t downSampling, eFIFOWorkMode_t mode, uint8_t threshold);
/**
* @fn getFIFOCount
* @brief 获取FIFO中当前的帧数
* @return 存储的数据帧数(0-31)
*/
uint8_t getFIFOCount(void);
/**
* @fn getFIFOData
* @brief 从FIFO读取所有数据
* @return sFIFOData_t 包含压力和温度数据的结构体
* @n - len: 存储的数据帧数(0-31)
* @n - pressure: 压力值数组
* @n - temperature: 温度值数组
*/
sFIFOData_t getFIFOData(void);
/**
* @fn configInterrupt
* @brief 配置中断行为
* @param intMode 触发模式(见: eIntMode_t)
* @n 可用模式:
* @n - eIntModePulsed: 脉冲模式
* @n - eIntModeLatched: 锁存模式
*
* @param intPol 信号极性(见: eIntPolarity_t)
* @n 可用极性:
* @n - eIntLowActive: 低电平有效
* @n - eIntHighActive: 高电平有效
*
* @param intOd 输出驱动类型(见: eIntOutputMode_t)
* @n 可用类型:
* @n - eIntPushPull: 推挽输出
* @n - eIntOpenDrain: 开漏输出
*
* @return 成功返回0,错误返回1
*/
uint8_t configInterrupt(eIntMode_t mode, eIntPolarity_t pol, eIntOutputMode_t outputMode);
/**
* @fn setIntSource
* @brief 启用特定的中断源
* @param source 触发位掩码(见: eIntSource_t)
* @n 可用源:
* @n - eIntDataReady: 数据就绪中断
* @n - eIntFIFOFull: FIFO满中断
* @n - eIntFIFOThres: FIFO阈值中断
* @n - eIntPressureOor: 压力超出范围中断
* @details 可以使用按位或(|)组合多个中断源。
* 示例: 同时启用数据就绪和FIFO满中断:
* @code
* setIntSource(bmp58x.eIntDataReady | bmp58x.eIntFIFOFull);
* @endcode
* @return 成功返回0,错误返回1
*/
uint8_t setIntSource(uint8_t source);
/**
* @fn getIntStatus
* @brief 读取当前中断状态标志
* @return uint16_t 活动中断的位掩码
* @n 可能的标志:
* @n - eIntStatusDataReady: 数据就绪(0x01)
* @n - eIntStatusFIFOFull: FIFO已满 (0x02)
* @n - eIntStatusFIFOThres: FIFO达到阈值(0x04)
* @n - eIntStatusPressureOor: 压力超出范围(0x08)
* @n - eIntStatusResetComplete: 复位完成(0x10)
*/
uint16_t getIntStatus(void);
/**
* @fn setOORPress
* @brief 配置压力超出范围检测
* @param oor 阈值压力值(0x00000-0x1FFFF)
* @param range 迟滞范围(0-255)
* @n oor - range < 压力 < oor + range
* @param cntLimit 触发持续计数
* @n 可用持续设置:
* @n - eOORCountLimit1: 1次计数
* @n - eOORCountLimit3: 3次计数
* @n - eOORCountLimit7: 7次计数
* @n - eOORCountLimit15: 15次计数
* @return 成功返回0,错误返回1
*/
uint8_t setOORPress(uint32_t oor, uint8_t range, eOORCountLimit_t cntLimit);
/**
* @fn calibratedAbsoluteDifference
* @brief 使用给定的当前海拔高度作为参考值,消除后续压力和海拔数据的绝对差值
* @param altitude 当前海拔高度
* @return 布尔值,表示参考值是否设置成功
* @retval True 表示参考值设置成功
* @retval False 表示设置参考值失败
*/
bool calibratedAbsoluteDifference(float altitude);
Modbus 寄存器定义
| 寄存器类型 | Modbus地址偏移量(16进制) | 名称 | 读写权限 | 数据范围 | 默认值 | 描述 |
|---|---|---|---|---|---|---|
| 输入寄存器 | 0x0000 | VID | R | 0x3343-0x3343 | 0x3343 | VID厂商ID |
| 输入寄存器 | 0x0001 | PID | R | 0x0000-0xFFFF | 0xC299/0xC298 | PID厂商ID(bmp581/bmp585) BMP581 PID:0xC299 BMP585 PID:0xC298 |
| 输入寄存器 | 0x0002 | 硬件版本V1.0.0.0 | R | 0x0000-0xFFFF | 0x1000 | 硬件版本号: 0x1000代表V1.0.0.0 |
| 输入寄存器 | 0x0003 | 固件版本V1.0.0.0 | R | 0x0000-0xFFFF | 0x1000 | 软件版本号: 0x1000代表V1.0.0.0 |
| 输入寄存器 | 0x0004 | 模块设备地址 | R | 0x0046-0x0047 | 0x0047 | 设备在通信总线上的唯一地址拨动传感器上的拨码开关切换地址(0x47、0x46) ,断电保持,重启后生效 |
| 输入寄存器 | 0x0007 | 芯片ID | R | 0x0050-0x0050 | 0x0050 | 传感器芯片型号的唯一标识符 |
| 输入寄存器 | 0x0008 | 修订ID | R | 0x0032-0x0032 | 0x0032 | 传感器芯片设计修订版本的标识符 |
| 输入寄存器 | 0x0017 | 芯片状态 | R | 0x0000-0x000F | 0x0000 | 包含芯片当前工作状态的状态寄存器 0b0000 0000 0000 0000 第0-1位作用如下: 1. 0b00 (0x0) 仅I2C 模式 2. 0b01 (0x1) SPI MODE1 和 MODE2 3. 0b10 (0x2) SPI MODE0 和 MODE3 4. 0b11 (0x3) SPI和I2C 可用,会自动配置。默认状态I2C模式。通电期间,CSB引脚应该连接VDDIO将其拉高。如果通电期间将CSB变为低电平,则I2C接口会被禁用。 0b0000 0000 0000 0000 第2位作用如下: i3c_err_0: 该位为1时表示发生SDR奇偶检验错误 0b0000 0000 0000 0000 第3位作用如下: i3c_err_3: 该位为1时表示发生s0/s1 错误 例如: 0b0000 0000 0000 0001 (0x0001) 表示仅I2C模式,没有发生i3c_err_0和i3c_err_3。 |
| 输入寄存器 | 0x001D | FIFO计数 | R | 0x0000-0x00FF | 0x0000 | FIFO缓冲区中当前数据帧数量 |
| 输入寄存器 | 0x0023 | 温度数据XLSB | R | 0x0000-0x00FF | 0x007F | 温度数据的最低有效字节 TEMP_DATA_7_0 |
| 输入寄存器 | 0x0024 | 温度数据LSB | R | 0x0000-0x00FF | 0x007F | 温度数据的次低有效字节 TEMP_DATA_15_8 |
| 输入寄存器 | 0x0025 | 温度数据MSB | R | 0x0000-0x00FF | 0x007F | 温度数据的最高有效字节 TEMP_DATA_23_16 0b0000 0000 0000 0000 0000 0000 DATA_MSB DATA_LSB DATA_XLSB 温度℃ = (TEMP_DATA_MSB, TEMP_DATA_LSB, TEMP_DATA_XLSB) / 2^16 |
| 输入寄存器 | 0x0026 | 压力数据XLSB | R | 0x0000-0x00FF | 0x007F | 压力数据的最低有效字节 PRESS_DATA_7_0 |
| 输入寄存器 | 0x0027 | 压力数据LSB | R | 0x0000-0x00FF | 0x007F | 压力数据的次低有效字节 PRESS_DATA_15_8 |
| 输入寄存器 | 0x0028 | 压力数据MSB | R | 0x0000-0x00FF | 0x007F | 压力数据的最高有效字节 TEMP_DATA_23_16 最终压力数据由如下组成: 0b0000 0000 0000 0000 0000 0000 DATA_MSB DATA_LSB DATA_XLSB压力Pa = (PRESS_DATA_MSB, PRESS_DATA_LSB, PRESS_DATA_XLSB) / 2^6 |
| 输入寄存器 | 0x002D | 中断状态 | R | 0x0000-0x00FF | 0x0000 | 包含各种中断状态标志的寄存器 (对应数据位为1时表示触发中断) 0b0000 0000 0000 0000 第0位 : 数据就绪中断 0b0000 0000 0000 0000 第1位 : FIFO已满 0b0000 0000 0000 0000 第2位 : 触发FIFO阈值 0b0000 0000 0000 0000 第3位 : 压力数据超出设定阈值范围 0b0000 0000 0000 0000 第4位 : POR 或者软复位完成 |
| 输入寄存器 | 0x002E | 状态 | R | 0x0000-0x00FF | 0x0002 | 包含设备一般状态信息的寄存器 (对应数据位为1时表示出现该状态) 0b0000 0000 0000 0000 status_core_rdy(Bit 1):数字核心就绪标志 0b0000 0000 0000 0000 status_nvm_rdy(Bit 2):非易失性存储器(NVM)就绪标志 0b0000 0000 0000 0000 status_nvm_err(Bit 3):NVM 操作错误(如电源、编程超时等) 0b0000 0000 0000 0000 status_nvm_cmd_err(Bit 4):NVM 命令执行失败(如参数非法) 0b0000 0000 0000 0000 st_crack_pass(Bit 7):硬件裂缝检测通过标志 |
| 输入寄存器 | 0x002F | FIFO数据 | R | 0x0000-0x00FF | 0x007F | 用于读取FIFO缓冲区数据的寄存器 PT-frame ![]() P-frame T-frame empty-frame![]() |
| 输入寄存器 | 0x003E | 过采样率有效值 | R | 0x0000-0x00FF | 0x0000 | 指示当前有效过采样率设置的寄存器 0b0000 0000 0000 0000 第0-2位:表示的是温度的过采样率 0b0000 0000 0000 0000 第3-5位:表示的是压强的过采样率具体代表可才看配置采样率寄存器 |
| 保持寄存器 | 0x0001 | 模块波特率 | RW | 0x0000-0x0008 | 0x0003 | 设置通信波特率的寄存器 0x0001---2400 0x0003---9600(默认) 0x0004---14400 0x0005---19200 0x0006---38400 0x0007---57600 0x0008---115200 Other----115200 断电保存,重启后生效 |
| 保持寄存器 | 0x0002 | 保留位 | RW | 0x0000-0xFFFF | 0x0001 | 保留 |
| 保持寄存器 | 0x0019 | 驱动配置 | RW | 0x0000-0x00FF | 0x0030 | 配置输出驱动强度和特性的寄存器 0b0000 0000 0000 0000 第0位: 仅 I2C 模式有效,控制 CSB 引脚的上拉电阻: - 0b0 (0x0):禁用上拉 - 0b1 (0x1):启用上拉 0b0000 0000 0000 0000 第1位: SPI 模式选择: - 0b0 (0x0):4 线 SPI 模式 - 0b1 (0x1):3 线 SPI 模式(减少通信引脚数) 0b0000 0000 0000 0000 Bit 4-7 串行 IO 引脚(SDX、SDO)的驱动强度配置,最高位(MSB)仅在 I2C 模式下生效。 |
| 保持寄存器 | 0x001A | 中断配置 | RW | 0x0000-0x00FF | 0x0035 | 配置中断触发条件和行为的寄存器 0b0000 0000 0000 0000 第0位 中断模式: - 0b0 (0x0):脉冲模式(pulsed,中断触发后自动撤销) - 0b1 (0x1):锁存模式(latched,需软件清除中断标志) 0b0000 0000 0000 0000 第1位 中断极性: - 0b0 (0x0):低电平有效(active low) - 0b1 (0x1):高电平有效(active high) 0b0000 0000 0000 0000 第2位 中断引脚类型: - 0b0 (0x0):推挽输出(push-pull,强驱动能力) - 0b1 (0x1):开漏输出(Open_drain,需外部上拉) 0b0000 0000 0000 0000 第3位 中断使能: - 0b0 (0x0):禁用中断 - 0b1 (0x1):启用中断 0b0000 0000 0000 0000 第4-7位 中断引脚(INT)的驱动强度配置,最高位(MSB)仅在开漏模式下生效。 |
| 保持寄存器 | 0x001B | 中断源 | RW | 0x0000-0x00FF | 0x0000 | 配置哪些事件可以触发中断的寄存器 (- 0b0 (0x0):禁用中断 - 0b1 (0x1):启用中断) 0b0000 0000 0000 0000 第0位 数据就绪中断使能: 使能后,数据寄存器更新完成时触发中断。 0b0000 0000 0000 0000 第1位 FIFO 满中断使能: 使能后,FIFO 缓冲区写满时触发中断。 0b0000 0000 0000 0000 第2位 FIFO 阈值 / 水印中断使能: 使能后,FIFO 数据量达到阈值时触发中断。 0b0000 0000 0000 0000 第3位 压力数据超范围中断使能: 使能后,压力数据超出设定范围时触发中断。 |
| 保持寄存器 | 0x001C | FIFO配置 | RW | 0x0000-0x00FF | 0x0000 | 配置FIFO缓冲区操作模式的寄存器 0b0000 0000 0000 0000 第0-4位的功能:设置 FIFO 触发阈值(数据量达到该值时触发对应动作)。 取值与说明: 0b0 0000 (0x0):禁用 FIFO 阈值功能(无触发条件); 0b0 0000 (0x1F):设置阈值为31 帧(数据量达到 31 帧时触发动作)。 可设置的最大帧数量会根据 数据帧类型变化 (PT-frame: 最多 15帧,P-frame/T-frame:最多31帧) 0b0000 0000 0000 0000 第5位的功能:选择 FIFO 的工作模式。 取值与说明: 0b0 (0x0):Stream-to-FIFO Mode(流模式)—— 数据持续写入 FIFO(即使 FIFO 接近满,仍会继续写入); 0b1 (0x1):STOP-on-FULL Mode(满停止模式)—— FIFO 写满后,停止写入新数据(防止溢出)。 |
| 保持寄存器 | 0x001E | FIFO数据帧类型配置 | RW | 0x0000-0x00FF | 0x0000 | 配置存入FIFO数据帧的类型有哪些 0b0000 0000 0000 0000 第0-1位 选择 FIFO 的帧数据源: 0b00 (0x0) FIFO 未使能(无数据写入 FIFO) 0b01 (0x1) 仅存储温度数据到 FIFO 0b10 (0x2) 仅存储压力数据到 FIFO 0b11 (0x3) 同时存储压力 + 温度数据到 FIFO 0b0000 0000 0000 0000 第2-4位 设置FIFO的降采样率, 设置每隔n个样本写入一次FIFO n = 2 ^ x X 的范围为 0(0b000) ~ 7(0b111) |
| 保持寄存器 | 0x0031 | 非易失性存储器地址 | RW | 0x0000-0x00FF | 0x0000 | 设置非易失性存储器访问地址的寄存器 |
| 保持寄存器 | 0x0032 | 非易失性存储器数据LSB | RW | 0x0000-0x00FF | 0x0000 | 非易失性存储器数据的低字节 |
| 保持寄存器 | 0x0033 | 非易失性存储器数据MSB | RW | 0x0000-0x00FF | 0x0000 | 非易失性存储器数据的高字节 |
| 保持寄存器 | 0x0036 | 数字信号处理配置 | RW | 0x0000-0x00FF | 0x0003 | 配置数字信号处理功能的寄存器 0b0000 0000 0000 0000 第0-1位的功能:压力 / 温度传感器补偿使能。 取值与说明: 0b00 (0x0) 压力无补偿,温度无补偿 0b01 (0x1) 压力无补偿,温度有补偿 0b10 (0x2) 压力有补偿,温度无补偿 0b11 (0x3) 压力有补偿,温度有补偿 0b0000 0000 0000 0000 第2位的功能:强制模式下执行 IIR 滤波器刷新(清空历史数据,重新开始滤波)。 注:P/T 转换过程中不可写,需在转换完成后配置。 0b0000 0000 0000 0000 第3位的功能:温度数据 IIR 滤波器选择(阴影寄存器)。 0b0 (0x0) 选择 IIR 滤波器前的温度值 0b1 (0x1) 选择 IIR 滤波器后的温度值 注:P/T 转换过程中不可写。 0b0000 0000 0000 0000 第4位的功能:FIFO 中温度数据的 IIR 滤波器选择。 0b0 (0x0) 选择 IIR 滤波器前的温度值 0b1 (0x1) 选择 IIR 滤波器后的温度值 注:P/T 转换过程中不可写。 0b0000 0000 0000 0000 第5位的功能:压力数据 IIR 滤波器选择(阴影寄存器)。 0b0 (0x0) 选择 IIR 滤波器前的压力值 0b1 (0x1) 选择 IIR 滤波器后的压力值 注:P/T 转换过程中不可写。 0b0000 0000 0000 0000 第6位的功能:FIFO 中压力数据的 IIR 滤波器选择。 0b0 (0x0) 选择 IIR 滤波器前的压力值 0b1 (0x1) 选择 IIR 滤波器后的压力值 注:P/T 转换过程中不可写。 0b0000 0000 0000 0000 第7位的功能:超范围(OOR)压力数据的 IIR 滤波器选择。 0b0 (0x0) 选择 IIR 滤波器前的压力值 0b1 (0x1) 选择 IIR 滤波器后的压力值 注:P/T 转换过程中不可写。 |
| 保持寄存器 | 0x0037 | 数字信号处理IIR滤波器 | RW | 0x0000-0x00FF | 0x0000 | 配置无限脉冲响应滤波器参数的寄存器 0b0000 0000 0000 0000 第0~2位的功能:温度数据 IIR 低通滤波器系数选择。 0b000 (0x0) 旁路(Bypass,无滤波,原始数据输出) 0b001 (0x1) 滤波系数 = 1 0b010 (0x2) 滤波系数 = 3 0b011 (0x3) 滤波系数 = 7 0b100 (0x4) 滤波系数 = 15 0b101 (0x5) 滤波系数 = 31 0b110 (0x6) 滤波系数 = 63 0b111 (0x7) 滤波系数 = 127 0b0000 0000 0000 0000 第3~5位的功能:压力数据 IIR 低通滤波器系数选择。 取值范围同温度 |
| 保持寄存器 | 0x0038 | 超限阈值压力LSB | RW | 0x0000-0x00FF | 0x0000 | 压力超限检测阈值的低字节 7_0 |
| 保持寄存器 | 0x0039 | 超限阈值压力MSB | RW | 0x0000-0x00FF | 0x0000 | 压力超限检测阈值的高字节 15_8 |
| 保持寄存器 | 0x003A | 超限范围 | RW | 0x0000-0x00FF | 0x0000 | 配置超限检测范围的寄存器0x0000~0x00FF |
| 保持寄存器 | 0x003B | 超限行为配置 | RW | 0x0000-0x00FF | 0x0000 | 配置超限检测行为的寄存器 0b0000 0000 0000 0000 第0位的功能:压力超范围阈值的第 16 位(最高位)。 压力检测阈值的使用 (压力阈值 - 检测范围 , 压力阈值 + 检测范围),超出这个范围就会触发 0b0000 0000 0000 0000 第6~7位的功能:超范围计数限制(连续超范围事件的触发次数阈值)。 0b00 (0x0) 计数限制 = 1(连续 1 次超范围即触发报警) 0b01 (0x1) 计数限制 = 3(连续 3 次超范围即触发报警) 0b10 (0x2) 计数限制 = 7(连续 7 次超范围即触发报警) 0b11 (0x3) 计数限制 = 15(连续 15 次超范围即触发报警) 注:P/T 转换过程中不可写,需在转换完成后配置。 |
| 保持寄存器 | 0x003C | 过采样率配置 | RW | 0x0000-0x00FF | 0x0000 | 配置数据采样过采样率的寄存器 0b0000 0000 0000 0000 第0~2位的功能:温度数据过采样率选择。 0b000 (0x0) 过采样率 = 1x 0b001 (0x1) 过采样率 = 2x 0b010 (0x2) 过采样率 = 4x 0b011 (0x3) 过采样率 = 8x 0b100 (0x4) 过采样率 = 16x 0b101 (0x5) 过采样率 = 32x 0b110 (0x6) 过采样率 = 64x 0b111 (0x7) 过采样率 = 128x 0b0000 0000 0000 0000 第3~5位的功能:压力数据过采样率选择。 0b000 (0x0) 过采样率 = 1x 0b001 (0x1) 过采样率 = 2x 0b010 (0x2) 过采样率 = 4x 0b011 (0x3) 过采样率 = 8x 0b100 (0x4) 过采样率 = 16x 0b101 (0x5) 过采样率 = 32x 0b110 (0x6) 过采样率 = 64x 0b111 (0x7) 过采样率 = 128x 0b0000 0000 0000 0000 第6位的功能:压力测量使能。 0b0:仅测量温度数据; 0b1:同时测量压力和温度数据。 |
| 保持寄存器 | 0x003D | 输出数据速率配置 | RW | 0x0000-0x00FF | 0x0070 | 配置数据输出速率的寄存器 0b0000 0000 0000 0000 第0~1位的功能:电源模式选择。 0b00 (0x0) 睡眠模式:无测量进行 0b01 (0x1) 正常模式:按配置的 ODR 输出数据 0b10 (0x2) 强制模式:单次测量 0b11 (0x3) 连续采集模式:重复测量,无占空比限制 0b0000 0000 0000 0000 第2~6位的功能:输出数据率(ODR)选择(数据更新频率)。 0x0 240.000 Hz 0x1 218.537 Hz 0x2 199.111 Hz 0x3 179.200 Hz 0x4 160.000 Hz 0x5 149.333 Hz 0x6 140.000 Hz 0x7 129.855 Hz 0x8 120.000 Hz 0x9 110.164 Hz 0xA 100.299 Hz 0xB 89.600 Hz 0xC 80.000 Hz 0xD 70.000 Hz 0xE 60.000 Hz 0xF 50.056 Hz 0x10 45.025 Hz 0x11 40.000 Hz 0x12 35.000 Hz 0x13 30.000 Hz 0x14 25.005 Hz 0x15 20.000 Hz 0x16 15.000 Hz 0x17 10.000 Hz 0x18 5.000 Hz 0x19 4.000 Hz 0x1A 3.000 Hz 0x1B 2.000 Hz 0x1C 1.000 Hz 0x1D 0.500 Hz 0x1E 0.250 Hz 0x1F 0.125 Hz 0b0000 0000 0000 0000 第7位的功能:深度待机禁用。 0b0:启用深度待机(低功耗模式); 0b1:禁用深度待机(始终保持活跃状态)。 注:P/T 转换过程中不可修改。 |
| 保持寄存器 | 0x0084 | 命令 | RW | 0x0000-0x00FF | 0x0000 | 用于发送设备命令的寄存器 0x0 保留(无命令,建议不写入) 0x5D NVM 读写使能序列的第一个命令(后续需配合0xA0/0xA5完成 NVM 写 / 读) 0x69 扩展模式使能序列的最后一个命令(需配合0x73/0xB4,使调试 / 测试页可见) 0x73 扩展模式使能序列的命令(需结合手册补充完整逻辑) 0xA0 NVM 写使能序列的最后一个命令(配合0x5D,触发 NVM 编程) 0xA5 NVM 读使能序列的最后一个命令(配合0x5D,触发 NVM 读取) 0xB4 扩展模式使能序列的命令(需结合手册补充完整逻辑) 0xB6 系统复位命令(覆盖所有用户配置为默认值,I2C 模式下不返回 ACK) |
Modbus-RTU 常用功能代码:
| 功能码 | 名称 | 功能 |
|---|---|---|
| 0x03 | 读多个寄存器 | 读整型、字符型、状态字、浮点型(读N个words)---读保持寄存器,字节操作 |
| 0x04 | 读输入寄存器 | 读整型、状态字、浮点型(读N个words)---读输入寄存器,字节操作 |
| 0x06 | 写单个保持寄存器 | 写整型、字符型、状态字、浮点型(写一个word)---写保持寄存器,字节操作 |
| 0x10 | 写多个保持寄存器 | 写多个保持寄存器---把具体的二进制值装入一串连续的保持寄存器 |
通过以上命令可读写输入寄存器和保持寄存器。
寄存器读写示例
硬件准备
- SEN0665 Gravity: BMP581 气压传感器 ×1
- TEL0185 RainbowLink USB 协议转换器 ×1
串口调试工具推荐与下载
在进行串口相关调试工作时,需要借助专业的串口调试工具。为您推荐以下几款常用且功能丰富的工具:
通用操作步骤
硬件连接:通过 RainbowLink USB 协议转换器,将传感器与主机(电脑)连接,传感器通信模式切换至 UART,地址切换至0x47
参数配置:在串口调试工具中设置参数(需与传感器一致):
波特率:9600(默认)
数据位:8 位
停止位:1 位
校验位:无
发送指令:在调试工具的 “发送区” 输入下述十六进制指令,勾选 “十六进制发送” 后发送。
示例 1:读取气压数值(读输入寄存器操作)
功能:通过 Modbus RTU 协议读取传感器当前检测到的气压数值
发送指令及解析
| 字段名 | 十六进制值 | 说明 |
|---|---|---|
| 设备地址 | 47 | 传感器默认 UART 地址 0x47 |
| 功能码 | 04 | 读输入寄存器(固定指令) |
| 寄存器起始地址 | 00 26 | |
| 寄存器个数 | 00 03 | 读取 3 个寄存器 |
| CRC 校验 | 5F 66 | 指令校验值(确保传输正确性) |
完整发送指令:72 04 00 26 00 03 5F 66
返回数据及解析
传感器接收到指令后,返回气压数据,示例如下:
| 字段名 | 十六进制值 | 说明 |
|---|---|---|
| 设备地址 | 47 | 与发送指令中的设备地址一致 |
| 功能码 | 04 | 确认执行 “读输入寄存器” 操作 |
| 字节数 | 06 | 返回数据的字节总数(6 字节) |
| 读取数据 | 00 05 00 FD 00 5B | 表示当前检测到的气压数值,此数值需要经过下述公式换算才能表示为常用的气压值(Pa) |
| CRC 校验 | 66 FB | 返回数据的校验值 |
完整返回数据:72 04 06 00 05 00 FD 00 5B 66 FB
在 Modbus 寄存器中,完整的气压数据由 3 个输入寄存器(地址范围 0x0026-0x0028)共同构成。由于该数据需从最低位寄存器开始读取,因此发送命令时应指定寄存器地址为 0x0026,返回的数据也将遵循从最低位开始的顺序。
具体而言,返回的字节中,“00 05” 是最低有效字节,“00 FD” 为次低有效字节,“00 5B” 则是最高有效字节。将这些字节按从高到低的有效位重新整合后,得到完整的十六进制数据 “00 5B 00 FD 00 05”,其换算为十进制的结果为 6028549。
因此压力 = 6028549/ 2^6=94196(Pa)
示意图如下:

示例 2:修改模块波特率(写保持寄存器操作)
功能:通过 Modbus RTU 协议修改传感器的 UART 串口波特率(默认 9600,支持自定义)。
发送指令及解析
| 字段名 | 十六进制值 | 说明 |
|---|---|---|
| 设备地址 | 47 | 传感器默认地址 0x72 |
| 功能码 | 06 | 写保持寄存器(固定指令) |
| 寄存器起始地址 | 00 01 | 波特率配置对应的寄存器地址 |
| 写入数据 | 00 08 | 对应波特率 115200 bps(数值与波特率对应关系见寄存器总表) |
| CRC 校验 | D7 6A | 指令校验值 |
完整发送指令:47 06 00 01 00 08 D7 6A
完整返回数据:47 06 00 01 00 08 D7 6A
注意:
- 发送上述指令后,若返回数据与发送指令一致,表明波特率修改请求已被设备接收。
- 波特率修改后需断电重启传感器方可生效;
- 重启后需将串口调试工具波特率同步修改为 115200,否则无法继续通信。


P-frame
T-frame
empty-frame