A helper class for I2C

Dependents:   MPU9150

Files at this revision

API Documentation at this revision

Comitter:
ethanharstad
Date:
Sun Jun 08 00:05:20 2014 +0000
Parent:
0:e0f604f504c4
Child:
2:51de41e0e0c9
Commit message:
Untested implementation

Changed in this revision

I2CHelper.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/I2CHelper.cpp	Sat Jun 07 20:46:05 2014 +0000
+++ b/I2CHelper.cpp	Sun Jun 08 00:05:20 2014 +0000
@@ -8,11 +8,21 @@
 
 /* Read Functions */
 bool I2CHelper::readBit(const uint8_t devAddr, const uint8_t regAddr, const uint8_t bit, uint8_t *data) {
-    
+    uint8_t buf;
+    i2c_.write((int)(devAddr << 1), (char *)&regAddr, 1, true);
+    i2c_.read((int)(devAddr << 1), (char *)&buf, 1);
+    *data = buf & (1 << bit);
+    return true;
 }
 
 bool I2CHelper::readBits(const uint8_t devAddr, const uint8_t regAddr, const uint8_t startBit, const uint8_t length, uint8_t *data) {
-    
+    uint8_t buf;
+    i2c_.write((int)(devAddr << 1), (char *)&regAddr, 1, true);
+    i2c_.read((int)(devAddr << 1), (char *)&buf, 1);
+    buf >>= (startBit - length + 1); 
+    buf &= ((1 << length) - 1);
+    *data = buf;
+    return true;
 }
 
 bool I2CHelper::readByte(const uint8_t devAddr, const uint8_t regAddr, uint8_t *data) {
@@ -20,16 +30,31 @@
 }
 
 bool I2CHelper::readBytes(const uint8_t devAddr, const uint8_t regAddr, uint8_t *data, const uint8_t length) {
-    
+    i2c_.write((int)(devAddr << 1), (char *)&regAddr, 1, true);
+    return i2c_.read((int)(devAddr << 1), (char *)data, (int)length);
 }
 
 /* Write Functions */
 bool I2CHelper::writeBit(const uint8_t devAddr, const uint8_t regAddr, const uint8_t bit, const uint8_t data) {
-    
+    uint8_t buf;
+    i2c_.write((int)(devAddr << 1), (char *)&regAddr, 1, true);
+    i2c_.read((int)(devAddr << 1), (char *)&buf, 1, true);
+    buf = (data != 0) ? (buf | (1 << bit)) : (buf & ~(1 << bit));
+    i2c_.write((int)(devAddr << 1), (char *)&buf, 1);
+    return true;
 }
 
 bool I2CHelper::writeBits(const uint8_t devAddr, const uint8_t regAddr, const uint8_t startBit, const uint8_t length, const uint8_t data) {
-    
+    uint8_t buf;
+    i2c_.write((int)(devAddr << 1), (char *)&regAddr, 1, true);
+    i2c_.read((int)(devAddr << 1), (char *)&buf, 1, true);
+    uint8_t dat = data << (startBit - length + 1);
+    uint8_t mask = ((1 << length) - 1) << (startBit - length + 1);
+    dat &= mask;
+    buf &= ~mask;
+    buf |= dat;
+    i2c_.write((int)(devAddr << 1), (char *)&buf, 1);
+    return true;
 }
 
 bool I2CHelper::writeByte(const uint8_t devAddr, const uint8_t regAddr, const uint8_t data) {
@@ -37,5 +62,12 @@
 }
 
 bool I2CHelper::writeBytes(const uint8_t devAddr, const uint8_t regAddr, const uint8_t *data, const uint8_t length) {
-    
+    i2c_.start();
+    i2c_.write((int)(devAddr << 1));
+    i2c_.write((int)regAddr);
+    for(int i = 0; i < length; i++) {
+        i2c_.write(data[i]);
+    }
+    i2c_.stop();
+    return true;
 }
\ No newline at end of file