Driver for IO expander
PCA9534.cpp@0:fe2b1519a978, 2014-04-02 (annotated)
- Committer:
- sam_grove
- Date:
- Wed Apr 02 03:49:20 2014 +0000
- Revision:
- 0:fe2b1519a978
Initial Commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sam_grove | 0:fe2b1519a978 | 1 | |
sam_grove | 0:fe2b1519a978 | 2 | #include "PCA9534.h" |
sam_grove | 0:fe2b1519a978 | 3 | |
sam_grove | 0:fe2b1519a978 | 4 | char PCA9534::readRegister(char reg) |
sam_grove | 0:fe2b1519a978 | 5 | { |
sam_grove | 0:fe2b1519a978 | 6 | char msg[2] = {reg, 0}; |
sam_grove | 0:fe2b1519a978 | 7 | _i2c->write(_address, msg, 1, 1); |
sam_grove | 0:fe2b1519a978 | 8 | _i2c->read((_address|1), msg, 1); |
sam_grove | 0:fe2b1519a978 | 9 | return msg[0]; |
sam_grove | 0:fe2b1519a978 | 10 | } |
sam_grove | 0:fe2b1519a978 | 11 | |
sam_grove | 0:fe2b1519a978 | 12 | int PCA9534::writeRegister(char reg, char val) |
sam_grove | 0:fe2b1519a978 | 13 | { |
sam_grove | 0:fe2b1519a978 | 14 | char msg[] = {reg, val}; |
sam_grove | 0:fe2b1519a978 | 15 | return _i2c->write(_address, msg, 2); |
sam_grove | 0:fe2b1519a978 | 16 | } |
sam_grove | 0:fe2b1519a978 | 17 | |
sam_grove | 0:fe2b1519a978 | 18 | void PCA9534::irqHandler(void) |
sam_grove | 0:fe2b1519a978 | 19 | { |
sam_grove | 0:fe2b1519a978 | 20 | // IO state change. Figure out what happened. read clears |
sam_grove | 0:fe2b1519a978 | 21 | } |
sam_grove | 0:fe2b1519a978 | 22 | |
sam_grove | 0:fe2b1519a978 | 23 | PCA9534::PCA9534(I2C &i2c, char address, InterruptIn &irq) |
sam_grove | 0:fe2b1519a978 | 24 | { |
sam_grove | 0:fe2b1519a978 | 25 | _i2c = &i2c; |
sam_grove | 0:fe2b1519a978 | 26 | _address = (0x40 | (address<<1)); |
sam_grove | 0:fe2b1519a978 | 27 | _i2c->frequency(400000); |
sam_grove | 0:fe2b1519a978 | 28 | _irq = &irq; |
sam_grove | 0:fe2b1519a978 | 29 | if (_irq != 0) { |
sam_grove | 0:fe2b1519a978 | 30 | _irq->fall(this, &PCA9534::irqHandler); |
sam_grove | 0:fe2b1519a978 | 31 | } |
sam_grove | 0:fe2b1519a978 | 32 | } |
sam_grove | 0:fe2b1519a978 | 33 | |
sam_grove | 0:fe2b1519a978 | 34 | int PCA9534::input(char val) |
sam_grove | 0:fe2b1519a978 | 35 | { |
sam_grove | 0:fe2b1519a978 | 36 | return writeRegister(3, val); |
sam_grove | 0:fe2b1519a978 | 37 | } |
sam_grove | 0:fe2b1519a978 | 38 | |
sam_grove | 0:fe2b1519a978 | 39 | int PCA9534::input(BIT_LOC bit) |
sam_grove | 0:fe2b1519a978 | 40 | { |
sam_grove | 0:fe2b1519a978 | 41 | return input((1<<bit)); |
sam_grove | 0:fe2b1519a978 | 42 | } |
sam_grove | 0:fe2b1519a978 | 43 | |
sam_grove | 0:fe2b1519a978 | 44 | int PCA9534::output(char val) |
sam_grove | 0:fe2b1519a978 | 45 | { |
sam_grove | 0:fe2b1519a978 | 46 | return writeRegister(3, ~val); |
sam_grove | 0:fe2b1519a978 | 47 | } |
sam_grove | 0:fe2b1519a978 | 48 | |
sam_grove | 0:fe2b1519a978 | 49 | int PCA9534::output(BIT_LOC bit) |
sam_grove | 0:fe2b1519a978 | 50 | { |
sam_grove | 0:fe2b1519a978 | 51 | return output(~(1<<bit)); |
sam_grove | 0:fe2b1519a978 | 52 | } |
sam_grove | 0:fe2b1519a978 | 53 | |
sam_grove | 0:fe2b1519a978 | 54 | int PCA9534::read(void) |
sam_grove | 0:fe2b1519a978 | 55 | { |
sam_grove | 0:fe2b1519a978 | 56 | return readRegister(0); |
sam_grove | 0:fe2b1519a978 | 57 | } |
sam_grove | 0:fe2b1519a978 | 58 | |
sam_grove | 0:fe2b1519a978 | 59 | int PCA9534::read(BIT_LOC bit) |
sam_grove | 0:fe2b1519a978 | 60 | { |
sam_grove | 0:fe2b1519a978 | 61 | char val = readRegister(0); |
sam_grove | 0:fe2b1519a978 | 62 | return ((val&(1<<bit))==(1<<bit)) ? 1 : 0; |
sam_grove | 0:fe2b1519a978 | 63 | } |
sam_grove | 0:fe2b1519a978 | 64 | |
sam_grove | 0:fe2b1519a978 | 65 | int PCA9534::write(char val) |
sam_grove | 0:fe2b1519a978 | 66 | { |
sam_grove | 0:fe2b1519a978 | 67 | return writeRegister(1, val); |
sam_grove | 0:fe2b1519a978 | 68 | } |
sam_grove | 0:fe2b1519a978 | 69 | |
sam_grove | 0:fe2b1519a978 | 70 | int PCA9534::write(BIT_LOC bit) |
sam_grove | 0:fe2b1519a978 | 71 | { |
sam_grove | 0:fe2b1519a978 | 72 | char val = readRegister(1); |
sam_grove | 0:fe2b1519a978 | 73 | return write(val | (1<<bit)); |
sam_grove | 0:fe2b1519a978 | 74 | } |