PCA9555
Dependents: Telliskivi2_2014 PowerManagementBoard_Rev_A_2017
PCA9555.cpp@8:8f59b7233e6c, 2013-11-03 (annotated)
- Committer:
- Reiko
- Date:
- Sun Nov 03 11:43:05 2013 +0000
- Revision:
- 8:8f59b7233e6c
- Parent:
- 7:3b54389686ca
Added retry on read error
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Reiko | 0:011622696878 | 1 | #include "PCA9555.h" |
Reiko | 0:011622696878 | 2 | |
Reiko | 2:fae93e0841f6 | 3 | PCA9555::PCA9555(PinName sda, PinName scl, PinName interrupPin, int address) |
Reiko | 8:8f59b7233e6c | 4 | : _irqpin(interrupPin), _i2c(sda, scl), led3(LED3) { |
Reiko | 2:fae93e0841f6 | 5 | _address = address; |
Reiko | 2:fae93e0841f6 | 6 | _irqpin.rise(this, &PCA9555::callChange); |
Reiko | 2:fae93e0841f6 | 7 | _irqpin.fall(this, &PCA9555::callChange); |
Reiko | 3:bcda053645e2 | 8 | _i2c.frequency(400000); |
Reiko | 8:8f59b7233e6c | 9 | retryCount = 3; |
Reiko | 8:8f59b7233e6c | 10 | currentRetryCount = retryCount; |
Reiko | 0:011622696878 | 11 | } |
Reiko | 1:a6699cd826bb | 12 | |
Reiko | 1:a6699cd826bb | 13 | void PCA9555::setDirection(int data) { |
Reiko | 1:a6699cd826bb | 14 | char foo[2]; |
Reiko | 1:a6699cd826bb | 15 | foo[0]=0x06; |
Reiko | 1:a6699cd826bb | 16 | foo[1]=data; |
Reiko | 1:a6699cd826bb | 17 | _i2c.write(_address, foo, 2); |
Reiko | 1:a6699cd826bb | 18 | foo[0]=0x07; |
Reiko | 1:a6699cd826bb | 19 | foo[1]=data>>8; |
Reiko | 1:a6699cd826bb | 20 | _i2c.write(_address, foo, 2); |
Reiko | 1:a6699cd826bb | 21 | } |
Reiko | 0:011622696878 | 22 | |
Reiko | 0:011622696878 | 23 | int PCA9555::read() { |
Reiko | 8:8f59b7233e6c | 24 | bool isCorrect = false; |
Reiko | 1:a6699cd826bb | 25 | char rx_array[2] = {0x00, 0x00}; |
Reiko | 2:fae93e0841f6 | 26 | char tx_array[1] = {0x00}; |
Reiko | 1:a6699cd826bb | 27 | |
Reiko | 8:8f59b7233e6c | 28 | while (--currentRetryCount) { |
Reiko | 8:8f59b7233e6c | 29 | tx_array[0] = 0x00; |
Reiko | 8:8f59b7233e6c | 30 | _i2c.write(_address, tx_array, 1); |
Reiko | 8:8f59b7233e6c | 31 | int success = _i2c.read(_address, rx_array, 2); |
Reiko | 8:8f59b7233e6c | 32 | //_i2c.stop(); |
Reiko | 8:8f59b7233e6c | 33 | if (success != 0) { |
Reiko | 8:8f59b7233e6c | 34 | led3 = 1; |
Reiko | 8:8f59b7233e6c | 35 | } else { |
Reiko | 8:8f59b7233e6c | 36 | led3 = 0; |
Reiko | 8:8f59b7233e6c | 37 | currentRetryCount = retryCount; |
Reiko | 8:8f59b7233e6c | 38 | isCorrect = true; |
Reiko | 8:8f59b7233e6c | 39 | break; |
Reiko | 8:8f59b7233e6c | 40 | } |
Reiko | 8:8f59b7233e6c | 41 | } |
Reiko | 8:8f59b7233e6c | 42 | if (isCorrect) { |
Reiko | 8:8f59b7233e6c | 43 | lastReadState = (rx_array[1] << 8) | rx_array[0]; |
Reiko | 8:8f59b7233e6c | 44 | } |
Reiko | 8:8f59b7233e6c | 45 | return lastReadState; |
Reiko | 8:8f59b7233e6c | 46 | } |
Reiko | 8:8f59b7233e6c | 47 | |
Reiko | 8:8f59b7233e6c | 48 | int PCA9555::getLastRead() { |
Reiko | 7:3b54389686ca | 49 | return lastReadState; |
Reiko | 0:011622696878 | 50 | } |
Reiko | 0:011622696878 | 51 | |
Reiko | 0:011622696878 | 52 | void PCA9555::write(int data) { |
Reiko | 5:73884f49ed97 | 53 | char foo[3]; |
Reiko | 1:a6699cd826bb | 54 | foo[0]=0x02; |
Reiko | 1:a6699cd826bb | 55 | foo[1]=data; |
Reiko | 1:a6699cd826bb | 56 | foo[2]=data>>8; |
Reiko | 5:73884f49ed97 | 57 | _i2c.write(_address, foo, 3); |
Reiko | 5:73884f49ed97 | 58 | /*char foo[2]; |
Reiko | 2:fae93e0841f6 | 59 | foo[0]=0x02; |
Reiko | 2:fae93e0841f6 | 60 | foo[1]=data; |
Reiko | 2:fae93e0841f6 | 61 | _i2c.write(_address, foo, 2); |
Reiko | 2:fae93e0841f6 | 62 | foo[0]=0x03; |
Reiko | 2:fae93e0841f6 | 63 | foo[1]=data>>8; |
Reiko | 5:73884f49ed97 | 64 | _i2c.write(_address, foo, 2);*/ |
Reiko | 1:a6699cd826bb | 65 | } |
Reiko | 1:a6699cd826bb | 66 | |
Reiko | 1:a6699cd826bb | 67 | void PCA9555::setPin(unsigned int pinNumber) { |
Reiko | 1:a6699cd826bb | 68 | currentWriteState |= ((unsigned int)1 << pinNumber); |
Reiko | 5:73884f49ed97 | 69 | //write(currentWriteState); |
Reiko | 1:a6699cd826bb | 70 | } |
Reiko | 1:a6699cd826bb | 71 | |
Reiko | 1:a6699cd826bb | 72 | void PCA9555::clearPin(unsigned int pinNumber) { |
Reiko | 1:a6699cd826bb | 73 | currentWriteState &= ~((unsigned int)1 << pinNumber); |
Reiko | 5:73884f49ed97 | 74 | //write(currentWriteState); |
Reiko | 1:a6699cd826bb | 75 | } |
Reiko | 1:a6699cd826bb | 76 | |
Reiko | 1:a6699cd826bb | 77 | void PCA9555::togglePin(unsigned int pinNumber) { |
Reiko | 1:a6699cd826bb | 78 | currentWriteState ^= ((unsigned int)1 << pinNumber); |
Reiko | 5:73884f49ed97 | 79 | //write(currentWriteState); |
Reiko | 5:73884f49ed97 | 80 | } |
Reiko | 5:73884f49ed97 | 81 | |
Reiko | 5:73884f49ed97 | 82 | void PCA9555::writePins() { |
Reiko | 1:a6699cd826bb | 83 | write(currentWriteState); |
Reiko | 2:fae93e0841f6 | 84 | } |
Reiko | 2:fae93e0841f6 | 85 | |
Reiko | 2:fae93e0841f6 | 86 | bool PCA9555::getPin(unsigned int pinNumber) { |
Reiko | 2:fae93e0841f6 | 87 | //return ballState; |
Reiko | 7:3b54389686ca | 88 | return (lastReadState & ((unsigned int)1 << pinNumber)) > 0; |
Reiko | 2:fae93e0841f6 | 89 | } |
Reiko | 2:fae93e0841f6 | 90 | |
Reiko | 7:3b54389686ca | 91 | void PCA9555::change(void (*function)(void)) { |
Reiko | 2:fae93e0841f6 | 92 | _callbackChange.attach(function); |
Reiko | 2:fae93e0841f6 | 93 | } |
Reiko | 7:3b54389686ca | 94 | |
Reiko | 2:fae93e0841f6 | 95 | void PCA9555::callChange(void) { |
Reiko | 7:3b54389686ca | 96 | read(); |
Reiko | 2:fae93e0841f6 | 97 | _callbackChange.call(); |
Reiko | 0:011622696878 | 98 | } |