A helper class for I2C
I2CHelper.cpp
- Committer:
- ethanharstad
- Date:
- 2014-06-08
- Revision:
- 1:e1b13a0c1987
- Parent:
- 0:e0f604f504c4
- Child:
- 2:51de41e0e0c9
File content as of revision 1:e1b13a0c1987:
#include "I2CHelper.h" /* Constructors */ I2CHelper::I2CHelper() : i2c_(I2C_SDA, I2C_SCL) {} I2CHelper::I2CHelper(PinName sda, PinName scl) : i2c_(sda, scl) {} /* 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) { return readBytes(devAddr, regAddr, data, 1); } 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) { return writeBytes(devAddr, regAddr, &data, 1); } 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; }