Driver for IO expander
PCA9534.cpp
- Committer:
- sam_grove
- Date:
- 2014-04-02
- Revision:
- 0:fe2b1519a978
File content as of revision 0:fe2b1519a978:
#include "PCA9534.h" char PCA9534::readRegister(char reg) { char msg[2] = {reg, 0}; _i2c->write(_address, msg, 1, 1); _i2c->read((_address|1), msg, 1); return msg[0]; } int PCA9534::writeRegister(char reg, char val) { char msg[] = {reg, val}; return _i2c->write(_address, msg, 2); } void PCA9534::irqHandler(void) { // IO state change. Figure out what happened. read clears } PCA9534::PCA9534(I2C &i2c, char address, InterruptIn &irq) { _i2c = &i2c; _address = (0x40 | (address<<1)); _i2c->frequency(400000); _irq = &irq; if (_irq != 0) { _irq->fall(this, &PCA9534::irqHandler); } } int PCA9534::input(char val) { return writeRegister(3, val); } int PCA9534::input(BIT_LOC bit) { return input((1<<bit)); } int PCA9534::output(char val) { return writeRegister(3, ~val); } int PCA9534::output(BIT_LOC bit) { return output(~(1<<bit)); } int PCA9534::read(void) { return readRegister(0); } int PCA9534::read(BIT_LOC bit) { char val = readRegister(0); return ((val&(1<<bit))==(1<<bit)) ? 1 : 0; } int PCA9534::write(char val) { return writeRegister(1, val); } int PCA9534::write(BIT_LOC bit) { char val = readRegister(1); return write(val | (1<<bit)); }