PCA9555
Dependents: Telliskivi2_2014 PowerManagementBoard_Rev_A_2017
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 }
Generated on Wed Jul 13 2022 02:33:02 by 1.7.2