PCA9555

Dependents:   Telliskivi2_2014 PowerManagementBoard_Rev_A_2017

Committer:
Reiko
Date:
Thu Sep 19 07:06:54 2013 +0000
Revision:
7:3b54389686ca
Parent:
5:73884f49ed97
Child:
8:8f59b7233e6c
Data is now read on interrupt, getPin() now returns pin state from cached value

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 3:bcda053645e2 8 _i2c.frequency(400000);
Reiko 0:011622696878 9 }
Reiko 1:a6699cd826bb 10
Reiko 1:a6699cd826bb 11 void PCA9555::setDirection(int data) {
Reiko 1:a6699cd826bb 12 char foo[2];
Reiko 1:a6699cd826bb 13 foo[0]=0x06;
Reiko 1:a6699cd826bb 14 foo[1]=data;
Reiko 1:a6699cd826bb 15 _i2c.write(_address, foo, 2);
Reiko 1:a6699cd826bb 16 foo[0]=0x07;
Reiko 1:a6699cd826bb 17 foo[1]=data>>8;
Reiko 1:a6699cd826bb 18 _i2c.write(_address, foo, 2);
Reiko 1:a6699cd826bb 19 }
Reiko 0:011622696878 20
Reiko 0:011622696878 21 int PCA9555::read() {
Reiko 1:a6699cd826bb 22 char rx_array[2] = {0x00, 0x00};
Reiko 2:fae93e0841f6 23 char tx_array[1] = {0x00};
Reiko 1:a6699cd826bb 24
Reiko 1:a6699cd826bb 25 _i2c.write(_address, tx_array, 1);
Reiko 1:a6699cd826bb 26
Reiko 1:a6699cd826bb 27 _i2c.read(_address, rx_array, 2);
Reiko 7:3b54389686ca 28 lastReadState = (rx_array[1] << 8) | rx_array[0];
Reiko 7:3b54389686ca 29 return lastReadState;
Reiko 0:011622696878 30 }
Reiko 0:011622696878 31
Reiko 0:011622696878 32 void PCA9555::write(int data) {
Reiko 5:73884f49ed97 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 5:73884f49ed97 37 _i2c.write(_address, foo, 3);
Reiko 5:73884f49ed97 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 5:73884f49ed97 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 5:73884f49ed97 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 5:73884f49ed97 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 5:73884f49ed97 59 //write(currentWriteState);
Reiko 5:73884f49ed97 60 }
Reiko 5:73884f49ed97 61
Reiko 5:73884f49ed97 62 void PCA9555::writePins() {
Reiko 1:a6699cd826bb 63 write(currentWriteState);
Reiko 2:fae93e0841f6 64 }
Reiko 2:fae93e0841f6 65
Reiko 2:fae93e0841f6 66 bool PCA9555::getPin(unsigned int pinNumber) {
Reiko 2:fae93e0841f6 67 //return ballState;
Reiko 7:3b54389686ca 68 return (lastReadState & ((unsigned int)1 << pinNumber)) > 0;
Reiko 2:fae93e0841f6 69 }
Reiko 2:fae93e0841f6 70
Reiko 7:3b54389686ca 71 void PCA9555::change(void (*function)(void)) {
Reiko 2:fae93e0841f6 72 _callbackChange.attach(function);
Reiko 2:fae93e0841f6 73 }
Reiko 7:3b54389686ca 74
Reiko 2:fae93e0841f6 75 void PCA9555::callChange(void) {
Reiko 7:3b54389686ca 76 read();
Reiko 2:fae93e0841f6 77 _callbackChange.call();
Reiko 0:011622696878 78 }