代码之家  ›  专栏  ›  技术社区  ›  Joel

Arduino Wire库返回错误代码7(库中未定义)

  •  0
  • Joel  · 技术社区  · 8 年前

    下面是代码的完整性。

        #include<Wire.h>
        const int MPU_addr=0x68;  // I2C address of the MPU-6050
        int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
        int initialError;
        void setup(){
          Wire.begin();
          Wire.beginTransmission(MPU_addr);
          Wire.write(0x6B);  // PWR_MGMT_1 register
          Wire.write(0);     // set to zero (wakes up the MPU-6050)
          initialError = Wire.endTransmission(true);
          Serial.begin(9600);
    
        }
        void loop(){
          int error ;
          Wire.beginTransmission(MPU_addr);
          Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
          error = Wire.endTransmission(false);
          if(error)
          {
            Serial.print("Errors: ");
            Serial.print(initialError);
            Serial.print(" ");
            Serial.println(error);
          }
          else {
            Wire.requestFrom(MPU_addr,14,true);  // request a total of 14 registers
            AcX=Wire.read()<<8|Wire.read();  // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)    
            AcY=Wire.read()<<8|Wire.read();  // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
            AcZ=Wire.read()<<8|Wire.read();  // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
            Tmp=Wire.read()<<8|Wire.read();  // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
            GyX=Wire.read()<<8|Wire.read();  // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
            GyY=Wire.read()<<8|Wire.read();  // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
            GyZ=Wire.read()<<8|Wire.read();  // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
            Serial.print("AcX = "); Serial.print(AcX);
            Serial.print(" | AcY = "); Serial.print(AcY);
            Serial.print(" | AcZ = "); Serial.print(AcZ);
            Serial.print(" | Tmp = "); Serial.print(Tmp/340.00+36.53);  //equation for temperature in degrees C from datasheet
            Serial.print(" | GyX = "); Serial.print(GyX);
            Serial.print(" | GyY = "); Serial.print(GyY);
            Serial.print(" | GyZ = "); Serial.println(GyZ);
            delay(333);
          }
        }
    

    initialError为零(成功),另一个错误为7(?)。有人知道这是怎么回事,怎么纠正吗?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Joel    8 年前

    EPS32使用的是Wire库的不同实现。它还有其他一些与Arduino软件打包的返回值。

                    typedef enum {
                        I2C_ERROR_OK=0,
                        I2C_ERROR_DEV,      // 1
                        I2C_ERROR_ACK,     // 2
                        I2C_ERROR_TIMEOUT, // 3
                        I2C_ERROR_BUS,     // 4
                        I2C_ERROR_BUSY,    // 5
                        I2C_ERROR_MEMORY,  // 6
                        I2C_ERROR_CONTINUE,// 7
                        I2C_ERROR_NO_BEGIN // 8
                    } i2c_err_t;
    

    错误代码7表示请求已排队。他们还没被派去。在这个实现中,只要调用Wire::EndTransmission时使用false,而不是实际发送请求,请求就会排队。当使用true作为参数(或不使用qrgument)调用endTransmission时,所有请求都会立即发送。

    这种实现差异的另一个含义是,将非零值视为错误的代码不一定能正常工作,因为并非所有的非零值都是真正的错误代码。

    推荐文章