PCA9555
Dependents: Telliskivi2_2014 PowerManagementBoard_Rev_A_2017
PCA9555.cpp@2:fae93e0841f6, 2013-09-09 (annotated)
- Committer:
- Reiko
- Date:
- Mon Sep 09 17:30:51 2013 +0000
- Revision:
- 2:fae93e0841f6
- Parent:
- 1:a6699cd826bb
- Child:
- 3:bcda053645e2
Added interrupt handling
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 | 2:fae93e0841f6 | 4 | : _irqpin(interrupPin), _i2c(sda, scl) { |
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 | 2:fae93e0841f6 | 8 | //_irqpin.attach_asserted(this, &PCA9555::callChange); |
Reiko | 2:fae93e0841f6 | 9 | //_irqpin.attach_deasserted(this, &PCA9555::callChange); |
Reiko | 0:011622696878 | 10 | } |
Reiko | 1:a6699cd826bb | 11 | |
Reiko | 1:a6699cd826bb | 12 | void PCA9555::setDirection(int data) { |
Reiko | 1:a6699cd826bb | 13 | char foo[2]; |
Reiko | 1:a6699cd826bb | 14 | foo[0]=0x06; |
Reiko | 1:a6699cd826bb | 15 | foo[1]=data; |
Reiko | 1:a6699cd826bb | 16 | _i2c.write(_address, foo, 2); |
Reiko | 1:a6699cd826bb | 17 | foo[0]=0x07; |
Reiko | 1:a6699cd826bb | 18 | foo[1]=data>>8; |
Reiko | 1:a6699cd826bb | 19 | _i2c.write(_address, foo, 2); |
Reiko | 1:a6699cd826bb | 20 | } |
Reiko | 0:011622696878 | 21 | |
Reiko | 0:011622696878 | 22 | int PCA9555::read() { |
Reiko | 1:a6699cd826bb | 23 | char rx_array[2] = {0x00, 0x00}; |
Reiko | 2:fae93e0841f6 | 24 | char tx_array[1] = {0x00}; |
Reiko | 1:a6699cd826bb | 25 | |
Reiko | 1:a6699cd826bb | 26 | _i2c.write(_address, tx_array, 1); |
Reiko | 1:a6699cd826bb | 27 | |
Reiko | 1:a6699cd826bb | 28 | _i2c.read(_address, rx_array, 2); |
Reiko | 1:a6699cd826bb | 29 | return (rx_array[1] << 8) | rx_array[0]; |
Reiko | 0:011622696878 | 30 | } |
Reiko | 0:011622696878 | 31 | |
Reiko | 0:011622696878 | 32 | void PCA9555::write(int data) { |
Reiko | 2:fae93e0841f6 | 33 | /*char foo[3]; |
Reiko | 1:a6699cd826bb | 34 | foo[0]=0x02; |
Reiko | 1:a6699cd826bb | 35 | foo[1]=data; |
Reiko | 1:a6699cd826bb | 36 | foo[2]=data>>8; |
Reiko | 2:fae93e0841f6 | 37 | _i2c.write(_address, foo, 3);*/ |
Reiko | 2:fae93e0841f6 | 38 | char foo[2]; |
Reiko | 2:fae93e0841f6 | 39 | foo[0]=0x02; |
Reiko | 2:fae93e0841f6 | 40 | foo[1]=data; |
Reiko | 2:fae93e0841f6 | 41 | _i2c.write(_address, foo, 2); |
Reiko | 2:fae93e0841f6 | 42 | foo[0]=0x03; |
Reiko | 2:fae93e0841f6 | 43 | foo[1]=data>>8; |
Reiko | 2:fae93e0841f6 | 44 | _i2c.write(_address, foo, 2); |
Reiko | 1:a6699cd826bb | 45 | } |
Reiko | 1:a6699cd826bb | 46 | |
Reiko | 1:a6699cd826bb | 47 | void PCA9555::setPin(unsigned int pinNumber) { |
Reiko | 1:a6699cd826bb | 48 | currentWriteState |= ((unsigned int)1 << pinNumber); |
Reiko | 1:a6699cd826bb | 49 | write(currentWriteState); |
Reiko | 1:a6699cd826bb | 50 | } |
Reiko | 1:a6699cd826bb | 51 | |
Reiko | 1:a6699cd826bb | 52 | void PCA9555::clearPin(unsigned int pinNumber) { |
Reiko | 1:a6699cd826bb | 53 | currentWriteState &= ~((unsigned int)1 << pinNumber); |
Reiko | 1:a6699cd826bb | 54 | write(currentWriteState); |
Reiko | 1:a6699cd826bb | 55 | } |
Reiko | 1:a6699cd826bb | 56 | |
Reiko | 1:a6699cd826bb | 57 | void PCA9555::togglePin(unsigned int pinNumber) { |
Reiko | 1:a6699cd826bb | 58 | currentWriteState ^= ((unsigned int)1 << pinNumber); |
Reiko | 1:a6699cd826bb | 59 | write(currentWriteState); |
Reiko | 2:fae93e0841f6 | 60 | } |
Reiko | 2:fae93e0841f6 | 61 | |
Reiko | 2:fae93e0841f6 | 62 | bool PCA9555::getPin(unsigned int pinNumber) { |
Reiko | 2:fae93e0841f6 | 63 | //return ballState; |
Reiko | 2:fae93e0841f6 | 64 | return (read() & ((unsigned int)1 << pinNumber)) > 0; |
Reiko | 2:fae93e0841f6 | 65 | } |
Reiko | 2:fae93e0841f6 | 66 | |
Reiko | 2:fae93e0841f6 | 67 | void PCA9555::change(void (*function)(void)) { |
Reiko | 2:fae93e0841f6 | 68 | _callbackChange.attach(function); |
Reiko | 2:fae93e0841f6 | 69 | } |
Reiko | 2:fae93e0841f6 | 70 | /* |
Reiko | 2:fae93e0841f6 | 71 | template<typename T> |
Reiko | 2:fae93e0841f6 | 72 | void PCA9555::change(T *object, void (T::*member)(void)) { |
Reiko | 2:fae93e0841f6 | 73 | _callbackChange.attach(object, member); |
Reiko | 2:fae93e0841f6 | 74 | } |
Reiko | 2:fae93e0841f6 | 75 | */ |
Reiko | 2:fae93e0841f6 | 76 | void PCA9555::callChange(void) { |
Reiko | 2:fae93e0841f6 | 77 | _callbackChange.call(); |
Reiko | 0:011622696878 | 78 | } |