Driver for IO expander

Committer:
sam_grove
Date:
Wed Apr 02 03:49:20 2014 +0000
Revision:
0:fe2b1519a978
Initial Commit

Who changed what in which revision?

UserRevisionLine numberNew 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 }