PCA9555

Dependents:   Telliskivi2_2014 PowerManagementBoard_Rev_A_2017

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?

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