You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
If you run the sketch below, the code will hang on the second loop iteration at uv.begin(VEML6070_HALF_T);
If you uncomment the uv.clearAck() then it will hang there.
If you comment out the lines that power-down the breakout & I2C bus, then the loop runs indefinitely as expected.
The putative problem is the Wire library getting into a wait loop for a bad bus condition to clear. Why the bad bus condition is created is unknown, since the bus is clear at the start of communication.
#include <Wire.h>
#include <Adafruit_VEML6070.h>
// Pin assignments
#define POWER_PIN (11) // VIN pin on VEML breakout board
#define ACK_PIN (13) // Note blue LED will turn *off* if ACK is set
Adafruit_VEML6070 uv = Adafruit_VEML6070();
void setup() {
Serial.begin(115200);
Serial.println("VEML6070 Test to Reveal Bug");
pinMode(POWER_PIN, OUTPUT);
digitalWrite(POWER_PIN, LOW);
digitalWrite(ACK_PIN, INPUT_PULLUP); // ACK is open-drain
}
bool testAck() {
bool ack = (digitalRead(ACK_PIN) == LOW);
if (ack) { Serial.println("ACK is set (low)"); Serial.flush(); }
}
bool i2c_ready(){
bool ready = (digitalRead(SDA) == HIGH) && (digitalRead(SCL) == HIGH);
if (!ready) { Serial.println("I2C bus locked"); Serial.flush(); }
return ready;
}
void loop() {
// Power DOWN the VEML 6070, and drive the I2C bus
// to ground to ensure the sensor is actually power-cycled
digitalWrite(POWER_PIN, LOW);
pinMode(SDA, OUTPUT);
digitalWrite(SDA, LOW);
pinMode(SCL, OUTPUT);
digitalWrite(SCL, LOW);
pinMode(SDA, INPUT);
pinMode(SCL, INPUT);
delay(100);
// Power up and initialize the VEML 6070
digitalWrite(POWER_PIN, HIGH);
Wire.begin();
delay(1000); // For device to power up
i2c_ready();
testAck();
//if (uv.clearAck()) { Serial.println("Ack was set"); Serial.flush(); }
i2c_ready();
Serial.print("init.. "); Serial.flush();
uv.begin(VEML6070_HALF_T);
Serial.println("done");
// Attempt to read the UV value after allowing for measurement delay
Serial.print("UV: ");
uint16_t value = uv.readUV();
Serial.println(value);
}
The text was updated successfully, but these errors were encountered:
If you run the sketch below, the code will hang on the second loop iteration at
uv.begin(VEML6070_HALF_T);
If you uncomment the
uv.clearAck()
then it will hang there.If you comment out the lines that power-down the breakout & I2C bus, then the loop runs indefinitely as expected.
The putative problem is the Wire library getting into a wait loop for a bad bus condition to clear. Why the bad bus condition is created is unknown, since the bus is clear at the start of communication.
The text was updated successfully, but these errors were encountered: