A helper class for I2C

Dependents:   MPU9150

Revision:
2:51de41e0e0c9
Parent:
1:e1b13a0c1987
--- a/I2CHelper.cpp	Sun Jun 08 00:05:20 2014 +0000
+++ b/I2CHelper.cpp	Mon Jun 09 21:17:12 2014 +0000
@@ -5,6 +5,10 @@
 
 I2CHelper::I2CHelper(PinName sda, PinName scl) : i2c_(sda, scl) {}
 
+void I2CHelper::setFrequency(int hz) {
+    i2c_.frequency(hz);
+}
+
 
 /* Read Functions */
 bool I2CHelper::readBit(const uint8_t devAddr, const uint8_t regAddr, const uint8_t bit, uint8_t *data) {
@@ -17,8 +21,8 @@
 
 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);
+    int status = i2c_.write((int)(devAddr << 1), (char *)&regAddr, 1, true);
+    status = i2c_.read((int)(devAddr << 1), (char *)&buf, 1);
     buf >>= (startBit - length + 1); 
     buf &= ((1 << length) - 1);
     *data = buf;
@@ -34,6 +38,15 @@
     return i2c_.read((int)(devAddr << 1), (char *)data, (int)length);
 }
 
+bool I2CHelper::readWord(const uint8_t devAddr, const uint8_t regAddr, uint16_t *data) {
+    return readWords(devAddr, regAddr, data, 1);
+}
+
+bool I2CHelper::readWords(const uint8_t devAddr, const uint8_t regAddr, uint16_t *data, const uint8_t length) {
+    i2c_.write((int)(devAddr << 1), (char *)&regAddr, 1, true);
+    return i2c_.read((int)(devAddr << 1), (char *)data, length * 2);
+}
+
 /* Write Functions */
 bool I2CHelper::writeBit(const uint8_t devAddr, const uint8_t regAddr, const uint8_t bit, const uint8_t data) {
     uint8_t buf;
@@ -62,12 +75,19 @@
 }
 
 bool I2CHelper::writeBytes(const uint8_t devAddr, const uint8_t regAddr, const uint8_t *data, const uint8_t length) {
-    i2c_.start();
+    /*i2c_.start();
     i2c_.write((int)(devAddr << 1));
     i2c_.write((int)regAddr);
     for(int i = 0; i < length; i++) {
         i2c_.write(data[i]);
     }
-    i2c_.stop();
+    i2c_.stop();*/
+    char *buf = (char *)malloc(length + 1);
+    buf[0] = regAddr;
+    for(int i = 0; i < length; i++) {
+        buf[i + 1] = data[i];
+    }
+    i2c_.write((int)(devAddr << 1), buf, length + 1);
+    free(buf);
     return true;
 }
\ No newline at end of file