A helper class for I2C
Revision 1:e1b13a0c1987, committed 2014-06-08
- 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 *)®Addr, 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 *)®Addr, 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 *)®Addr, 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 *)®Addr, 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 *)®Addr, 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