PCA9555

Dependents:   Telliskivi2_2014 PowerManagementBoard_Rev_A_2017

Committer:
Reiko
Date:
Mon Sep 16 16:09:56 2013 +0000
Revision:
5:73884f49ed97
Parent:
3:bcda053645e2
Child:
7:3b54389686ca
Changed write method to use proper sequence of data, created separate method for writing pin changes

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 1:a6699cd826bb 28 return (rx_array[1] << 8) | rx_array[0];
Reiko 0:011622696878 29 }
Reiko 0:011622696878 30
Reiko 0:011622696878 31 void PCA9555::write(int data) {
Reiko 5:73884f49ed97 32 char foo[3];
Reiko 1:a6699cd826bb 33 foo[0]=0x02;
Reiko 1:a6699cd826bb 34 foo[1]=data;
Reiko 1:a6699cd826bb 35 foo[2]=data>>8;
Reiko 5:73884f49ed97 36 _i2c.write(_address, foo, 3);
Reiko 5:73884f49ed97 37 /*char foo[2];
Reiko 2:fae93e0841f6 38 foo[0]=0x02;
Reiko 2:fae93e0841f6 39 foo[1]=data;
Reiko 2:fae93e0841f6 40 _i2c.write(_address, foo, 2);
Reiko 2:fae93e0841f6 41 foo[0]=0x03;
Reiko 2:fae93e0841f6 42 foo[1]=data>>8;
Reiko 5:73884f49ed97 43 _i2c.write(_address, foo, 2);*/
Reiko 1:a6699cd826bb 44 }
Reiko 1:a6699cd826bb 45
Reiko 1:a6699cd826bb 46 void PCA9555::setPin(unsigned int pinNumber) {
Reiko 1:a6699cd826bb 47 currentWriteState |= ((unsigned int)1 << pinNumber);
Reiko 5:73884f49ed97 48 //write(currentWriteState);
Reiko 1:a6699cd826bb 49 }
Reiko 1:a6699cd826bb 50
Reiko 1:a6699cd826bb 51 void PCA9555::clearPin(unsigned int pinNumber) {
Reiko 1:a6699cd826bb 52 currentWriteState &= ~((unsigned int)1 << pinNumber);
Reiko 5:73884f49ed97 53 //write(currentWriteState);
Reiko 1:a6699cd826bb 54 }
Reiko 1:a6699cd826bb 55
Reiko 1:a6699cd826bb 56 void PCA9555::togglePin(unsigned int pinNumber) {
Reiko 1:a6699cd826bb 57 currentWriteState ^= ((unsigned int)1 << pinNumber);
Reiko 5:73884f49ed97 58 //write(currentWriteState);
Reiko 5:73884f49ed97 59 }
Reiko 5:73884f49ed97 60
Reiko 5:73884f49ed97 61 void PCA9555::writePins() {
Reiko 1:a6699cd826bb 62 write(currentWriteState);
Reiko 2:fae93e0841f6 63 }
Reiko 2:fae93e0841f6 64
Reiko 2:fae93e0841f6 65 bool PCA9555::getPin(unsigned int pinNumber) {
Reiko 2:fae93e0841f6 66 //return ballState;
Reiko 2:fae93e0841f6 67 return (read() & ((unsigned int)1 << pinNumber)) > 0;
Reiko 2:fae93e0841f6 68 }
Reiko 2:fae93e0841f6 69
Reiko 2:fae93e0841f6 70 void PCA9555::change(void (*function)(void)) {
Reiko 2:fae93e0841f6 71 _callbackChange.attach(function);
Reiko 2:fae93e0841f6 72 }
Reiko 2:fae93e0841f6 73 /*
Reiko 2:fae93e0841f6 74 template<typename T>
Reiko 2:fae93e0841f6 75 void PCA9555::change(T *object, void (T::*member)(void)) {
Reiko 2:fae93e0841f6 76 _callbackChange.attach(object, member);
Reiko 2:fae93e0841f6 77 }
Reiko 2:fae93e0841f6 78 */
Reiko 2:fae93e0841f6 79 void PCA9555::callChange(void) {
Reiko 2:fae93e0841f6 80 _callbackChange.call();
Reiko 0:011622696878 81 }