PCA9555

Dependents:   Telliskivi2_2014 PowerManagementBoard_Rev_A_2017

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?

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