PCA9555

Dependents:   Telliskivi2_2014 PowerManagementBoard_Rev_A_2017

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers PCA9555.cpp Source File

PCA9555.cpp

00001 #include "PCA9555.h"
00002  
00003 PCA9555::PCA9555(PinName sda, PinName scl, PinName interrupPin, int address)
00004         : _irqpin(interrupPin), _i2c(sda, scl), led3(LED3) {
00005     _address = address;    
00006     _irqpin.rise(this, &PCA9555::callChange);
00007     _irqpin.fall(this, &PCA9555::callChange);
00008     _i2c.frequency(400000);
00009     retryCount = 3;
00010     currentRetryCount = retryCount;
00011 }
00012 
00013 void PCA9555::setDirection(int data) {
00014     char foo[2];
00015     foo[0]=0x06;
00016     foo[1]=data;
00017     _i2c.write(_address, foo, 2);
00018     foo[0]=0x07;
00019     foo[1]=data>>8;
00020     _i2c.write(_address, foo, 2);
00021 }
00022  
00023 int PCA9555::read() {
00024     bool isCorrect = false;
00025     char rx_array[2] = {0x00, 0x00};
00026     char tx_array[1] = {0x00};
00027         
00028     while (--currentRetryCount) {
00029         tx_array[0] = 0x00;
00030         _i2c.write(_address, tx_array, 1);
00031         int success = _i2c.read(_address, rx_array, 2);
00032         //_i2c.stop();
00033         if (success != 0) {
00034             led3 = 1;
00035         } else {
00036             led3 = 0;
00037             currentRetryCount = retryCount;
00038             isCorrect = true;
00039             break;
00040         }
00041     }
00042     if (isCorrect) {
00043         lastReadState = (rx_array[1] << 8) | rx_array[0];
00044     }    
00045     return lastReadState;
00046 }
00047 
00048 int PCA9555::getLastRead() {
00049     return lastReadState;
00050 }
00051  
00052 void PCA9555::write(int data) {
00053     char foo[3];
00054     foo[0]=0x02;
00055     foo[1]=data;
00056     foo[2]=data>>8;
00057     _i2c.write(_address, foo, 3);
00058     /*char foo[2];
00059     foo[0]=0x02;
00060     foo[1]=data;
00061     _i2c.write(_address, foo, 2);
00062     foo[0]=0x03;
00063     foo[1]=data>>8;
00064     _i2c.write(_address, foo, 2);*/
00065 }
00066 
00067 void PCA9555::setPin(unsigned int pinNumber) {
00068     currentWriteState |= ((unsigned int)1 << pinNumber);
00069     //write(currentWriteState);
00070 }
00071 
00072 void PCA9555::clearPin(unsigned int pinNumber) {
00073     currentWriteState &= ~((unsigned int)1 << pinNumber);
00074     //write(currentWriteState);
00075 }
00076 
00077 void PCA9555::togglePin(unsigned int pinNumber) {
00078     currentWriteState ^= ((unsigned int)1 << pinNumber);
00079     //write(currentWriteState);
00080 }
00081 
00082 void PCA9555::writePins() {
00083     write(currentWriteState);
00084 }
00085 
00086 bool PCA9555::getPin(unsigned int pinNumber) {
00087     //return ballState;
00088     return (lastReadState & ((unsigned int)1 << pinNumber)) > 0;
00089 }
00090 
00091 void PCA9555::change(void (*function)(void)) {
00092     _callbackChange.attach(function);
00093 }
00094 
00095 void PCA9555::callChange(void) {
00096     read();
00097     _callbackChange.call();
00098 }