-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathI2C.ino
52 lines (48 loc) · 1.23 KB
/
I2C.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
const uint8_t IMUAddress = 0x68;
const uint16_t I2C_TIMEOUT = 1000;
uint8_t i2cWrite(uint8_t registerAddress, uint8_t data, bool sendStop)
{
return i2cWrite(registerAddress, &data, 1, sendStop);
}
uint8_t i2cWrite(uint8_t registerAddress, uint8_t *data, uint8_t length, bool sendStop)
{
Wire.beginTransmission(IMUAddress);
Wire.write(registerAddress);
Wire.write(data, length);
uint8_t rcode = Wire.endTransmission(sendStop);
if (rcode)
{
Serial.print("i2cWrite failed: ");
Serial.println(rcode);
}
return rcode;
}
uint8_t i2cRead(uint8_t registerAddress, uint8_t *data, uint8_t nbytes)
{
uint32_t timeOutTimer;
Wire.beginTransmission(IMUAddress);
Wire.write(registerAddress);
uint8_t rcode = Wire.endTransmission(false);
if (rcode)
{
Serial.print(F("i2cRead failed: "));
Serial.println(rcode);
return rcode;
}
Wire.requestFrom(IMUAddress, nbytes, (uint8_t)true);
for (uint8_t i = 0; i < nbytes; i++)
{
if (Wire.available())
data[i] = Wire.read();
else
{
timeOutTimer = micros();
while (((micros() - timeOutTimer) < I2C_TIMEOUT) && !Wire.available());
if (Wire.available())
data[i] = Wire.read();
else
return 5;
}
}
return 0;
}