You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Arduino I2C读取压力传感器返回0x60状态值异常问题

问题排查与修复

你的代码存在明确逻辑错误,是导致状态寄存器返回0x60而非预期0x40的直接原因,具体问题点如下:

  • 读长度设置错误:调用write_then_read时你传入的读取长度为2,但传感器返回的有效帧为3字节(1字节状态寄存器+2字节压力原始数据),长度不足会导致数据截断。同时你复用同一个数组作为写缓存和读缓存,读取返回值覆盖数组时会出现数据错位。
  • 时序不符合传感器要求:写入0xAA启动测量命令后,传感器需要最多4ms完成AD转换才能输出有效数据,你代码中发送命令后立刻发起读操作,此时传感器处于测量忙状态,状态寄存器的忙标志位(bit5,对应值0x20)会被置位,0x40(数据就绪标志)+0x20(忙标志)刚好等于你读到的0x60。
  • 打印逻辑越界:你设置的读取长度仅为2字节,却打印了数组第0到第3位共4个值,其中后两个值是栈内存残留的随机无效数据,没有参考意义。

修复后可直接运行的代码

#include <Adafruit_I2CDevice.h>

#define I2C_ADDRESS 0x29
Adafruit_I2CDevice i2c_dev = Adafruit_I2CDevice(I2C_ADDRESS);

void setup() {
  while (!Serial) { delay(10); }
  Serial.begin(115200);
  Serial.println("I2C device read and write test");

  if (!i2c_dev.begin()) {
    Serial.print("Did not find device at 0x");
    Serial.println(i2c_dev.address(), HEX);
    while (1);
  }
  Serial.print("Device found on address 0x");
  Serial.println(i2c_dev.address(), HEX);
}

void loop(){
  uint8_t start_cmd = 0xAA;
  uint8_t read_buf[3] = {0};
  // 发送测量启动命令
  i2c_dev.write(&start_cmd, 1, true);
  // 等待传感器完成测量转换,预留足够时序余量
  delay(5);
  // 一次性读取3字节有效返回数据
  i2c_dev.read(read_buf, 3, true);

  Serial.println();
  Serial.print("状态寄存器值: 0x");
  Serial.print(read_buf[0], HEX);
  Serial.print(" 压力高字节: ");
  Serial.print(read_buf[1]);
  Serial.print(" 压力低字节: ");
  Serial.println(read_buf[2]);
  
  // 状态校验通过后计算压力原始值
  if(read_buf[0] == 0x40){
    uint16_t pressure_raw = (read_buf[1] << 8) | read_buf[2];
    Serial.print("压力原始采样值: ");
    Serial.println(pressure_raw);
  }
  delay(500);
}

验证提示:如果加了5ms延时后依然读到0x60,可以把延时调整到10ms排查时钟裕量问题,正常情况下只要传感器硬件接线正常,调整时序后状态寄存器会稳定返回0x40。

内容的提问来源于stack exchange,提问作者rudostep

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 13:45:29