Scheint aber wirklich so zu funktionieren.
(https://github.com/sparkfun/SparkFun...un_AS7265X.cpp)
Code:
uint8_t AS7265X::readRegister(uint8_t addr)
{
_i2cPort->beginTransmission(AS7265X_ADDR);
_i2cPort->write(addr);
if (_i2cPort->endTransmission() != 0)
{
//Serial.println("No ack!");
return (0); //Device failed to ack
}
_i2cPort->requestFrom((uint8_t)AS7265X_ADDR, (uint8_t)1);
if (_i2cPort->available())
{
return (_i2cPort->read());
}
//Serial.println("No ack!");
return (0); //Device failed to respond
}
wobei...
Code:
i2cPort->beginTransmission(AS7265X_ADDR);
_i2cPort->write(addr);
...die I2C-SlaveAdresse und die Registeradresse auf den Sensor schreiben und...
Code:
if (_i2cPort->endTransmission() != 0)
{
//Serial.println("No ack!");
return (0); //Device failed to ack
}
...das abschließende Ack der Sequenz auf der SDA-Leitung abfragt...
Code:
_i2cPort->requestFrom((uint8_t)AS7265X_ADDR, (uint8_t)1);
if (_i2cPort->available())
{
return (_i2cPort->read());
}
Bei der anschließenden Lesesequenz geht Arduino dann mit einer Abfrage dran, deren Erfolg über das 'available', und deren Daten über Read aus einem Puffer zurückgegeben werden.
Details findest Du, wenn Du nach "Arduino Wire.h" suchst.
Und die Funktion
uint8_t AS7265X::virtualReadRegister(uint8_t virtualAddr)
ist vielleicht auch ganz lesenswert. Da steht z.B. am Anfang ein Dummy-Lesen auf das Read-Register. Kann also sein, dass man ggf. anstehende Werte erst lesen muss, damit das AS7265X_RX_VALID-Flag im Status zurückgesetzt wird?!?
Lesezeichen