Developing Library for the MAX7314 I2C 16-bit I/O Expander w/ PWM
Dependencies: mbed PCA9538_Expander
PCA9538.h
00001 /* 00002 \file PCA9538.h 00003 \version: 1.0 00004 00005 \brief Este fichero contiene class para control de PCA9538 creando pin digitales 00006 de salida o entrada, o control por registro (8-bits). 00007 00008 \web www.micros-designs.com.ar 00009 \date 31/01/11 00010 00011 *- Version Log --------------------------------------------------------------* 00012 * Fecha Autor Comentarios * 00013 *----------------------------------------------------------------------------* 00014 * 31/01/11 Suky Original * 00015 *----------------------------------------------------------------------------*/ 00016 /////////////////////////////////////////////////////////////////////////// 00017 //// //// 00018 //// //// 00019 //// (C) Copyright 2011 www.micros-designs.com.ar //// 00020 //// Este código puede ser usado, modificado y distribuido libremente //// 00021 //// sin eliminar esta cabecera y sin garantÃa de ningún tipo. //// 00022 //// //// 00023 //// //// 00024 /////////////////////////////////////////////////////////////////////////// 00025 00026 /* EXAMPLE 00027 #include "mbed.h" 00028 #include "PCA9538.h" 00029 00030 //PCA9538 MyExpand(p9,p10,0x70,p21); // sda,scl,address,Interrupts 00031 DigitalOut myled(LED1); 00032 DigitalOut myled2(LED2); 00033 PCA9538PinOut myled3(exp_p4,p9,p10,0x70); // pin del PCA,sda,scl,address 00034 PCA9538PinOut myled4(exp_p7,p9,p10,0x70); 00035 PCA9538PinIn mypuls(exp_p0,p9,p10,0x70); 00036 //void vISRExpand(void); 00037 00038 int main() { 00039 //MyExpand.vInit(0x0F,&vISRExpand); 00040 //MyExpand.vWrite(0x00); 00041 while(1) { 00042 if(mypuls==0){ 00043 myled2=1; 00044 wait(0.3); 00045 myled2=0; 00046 wait(0.3); 00047 }else{ 00048 myled3=1; 00049 myled4=1; 00050 myled=myled3; 00051 wait(0.5); 00052 myled = 0; 00053 myled3=0; 00054 myled4=0; 00055 wait(0.5); 00056 } 00057 } 00058 } 00059 00060 00061 //void vISRExpand(void){ 00062 // 00063 // myled2=!myled2; 00064 // MyExpand.vWrite(MyExpand.cRead()<<4); 00065 //} 00066 */ 00067 #include "mbed.h" 00068 00069 enum ExpPinName{ 00070 exp_p0=0, 00071 exp_p1, 00072 exp_p2, 00073 exp_p3, 00074 exp_p4, 00075 exp_p5, 00076 exp_p6, 00077 exp_p7, 00078 }; 00079 00080 class PCA9538PinOut{ 00081 public: 00082 PCA9538PinOut(ExpPinName Pin,PinName PIN_SDA,PinName PIN_SCL,unsigned char Address); 00083 void vWrite(int value); 00084 int read(); 00085 #ifdef MBED_OPERATORS 00086 PCA9538PinOut& operator= (int value); 00087 operator int(); 00088 #endif 00089 protected: 00090 ExpPinName _Pin; 00091 unsigned char _Address; 00092 I2C Bus; 00093 }; 00094 00095 PCA9538PinOut::PCA9538PinOut(ExpPinName Pin,PinName PIN_SDA,PinName PIN_SCL,unsigned char Address) 00096 :Bus(PIN_SDA,PIN_SCL),_Pin(Pin),_Address(Address<<1){ 00097 unsigned char Temp; 00098 00099 Bus.start(); 00100 Bus.write(_Address & 0xFE); 00101 Bus.write(0x03); 00102 Bus.start(); 00103 Bus.write(_Address | 0x01); 00104 Temp=Bus.read(0); 00105 Bus.stop(); 00106 00107 Bus.start(); 00108 Bus.write(_Address & 0xFE); 00109 Bus.write(0x03); 00110 Bus.write((~(0x01<<_Pin))&Temp); 00111 Bus.stop(); 00112 } 00113 00114 void PCA9538PinOut::vWrite(int value){ 00115 unsigned char Temp; 00116 00117 Bus.start(); 00118 Bus.write(_Address & 0xFE); 00119 Bus.write(0x01); 00120 Bus.start(); 00121 Bus.write(_Address | 0x01); 00122 Temp=Bus.read(0); 00123 Bus.stop(); 00124 00125 Bus.start(); 00126 Bus.write(_Address & 0xFE); 00127 Bus.write(0x01); 00128 if(value==0){ 00129 Bus.write((~(0x01<<_Pin))&Temp); 00130 }else{ 00131 Bus.write((0x01<<_Pin)|Temp); 00132 } 00133 Bus.stop(); 00134 } 00135 00136 int PCA9538PinOut::read(){ 00137 unsigned char Temp; 00138 00139 Bus.start(); 00140 Bus.write(_Address & 0xFE); 00141 Bus.write(0x01); 00142 Bus.start(); 00143 Bus.write(_Address | 0x01); 00144 Temp=Bus.read(0); 00145 Bus.stop(); 00146 00147 return((Temp>>_Pin)&0x01); 00148 } 00149 00150 PCA9538PinOut& PCA9538PinOut::operator= (int value){ 00151 vWrite(value); 00152 } 00153 00154 PCA9538PinOut::operator int(){ 00155 00156 return(read()); 00157 } 00158 //***************************************************************************** 00159 class PCA9538PinIn{ 00160 public: 00161 PCA9538PinIn(ExpPinName Pin,PinName PIN_SDA,PinName PIN_SCL,unsigned char Address); 00162 int read(); 00163 #ifdef MBED_OPERATORS 00164 operator int(); 00165 #endif 00166 protected: 00167 ExpPinName _Pin; 00168 unsigned char _Address; 00169 I2C Bus; 00170 }; 00171 00172 PCA9538PinIn::PCA9538PinIn(ExpPinName Pin,PinName PIN_SDA,PinName PIN_SCL,unsigned char Address) 00173 :Bus(PIN_SDA,PIN_SCL),_Pin(Pin),_Address(Address<<1){ 00174 unsigned char Temp; 00175 00176 Bus.start(); 00177 Bus.write(_Address & 0xFE); 00178 Bus.write(0x03); 00179 Bus.start(); 00180 Bus.write(_Address | 0x01); 00181 Temp=Bus.read(0); 00182 Bus.stop(); 00183 00184 Bus.start(); 00185 Bus.write(_Address & 0xFE); 00186 Bus.write(0x03); 00187 Bus.write((0x01<<_Pin)|Temp); 00188 Bus.stop(); 00189 } 00190 00191 int PCA9538PinIn::read(){ 00192 unsigned char Temp; 00193 00194 Bus.start(); 00195 Bus.write(_Address & 0xFE); 00196 Bus.write(0x00); 00197 Bus.start(); 00198 Bus.write(_Address | 0x01); 00199 Temp=Bus.read(0); 00200 Bus.stop(); 00201 00202 return((Temp>>_Pin)&0x01); 00203 } 00204 00205 PCA9538PinIn::operator int(){ 00206 00207 return(read()); 00208 } 00209 //***************************************************************************** 00210 class PCA9538{ 00211 public: 00212 PCA9538(PinName PIN_SDA,PinName PIN_SCL,unsigned char Address,PinName PIN_INT=NC); 00213 void vInit(unsigned char Dir,void (*fptr)(void)); 00214 void vSetConfiguration(unsigned char Dir); 00215 void vSetPolarity(unsigned char Pol); 00216 unsigned char cRead(void); 00217 void vWrite(unsigned char Data); 00218 void vEnableSetInterrupt(void (*fptr)(void)); 00219 void vDisableInterrupt(void); 00220 bool bReadPinINT(void); 00221 protected: 00222 I2C Bus; 00223 InterruptIn PCA9538_Event; 00224 DigitalIn _PIN_INT; 00225 unsigned char _Address; 00226 }; 00227 00228 PCA9538::PCA9538(PinName PIN_SDA,PinName PIN_SCL,unsigned char Address,PinName PIN_INT) 00229 : Bus(PIN_SDA,PIN_SCL),_PIN_INT(PIN_INT),PCA9538_Event(PIN_INT){ 00230 _Address=Address<<1; 00231 } 00232 00233 void PCA9538::vInit(unsigned char Dir,void (*fptr)(void)){ 00234 00235 //Bus.frequency(400000); 00236 00237 Bus.start(); 00238 Bus.write(_Address & 0xFE); 00239 Bus.write(0x03); 00240 Bus.write(Dir); 00241 Bus.stop(); 00242 00243 if (fptr!=NULL){ 00244 PCA9538_Event.fall(fptr); 00245 } 00246 } 00247 00248 void PCA9538::vSetConfiguration(unsigned char Dir){ 00249 00250 Bus.start(); 00251 Bus.write(_Address & 0xFE); 00252 Bus.write(0x03); 00253 Bus.write(Dir); 00254 Bus.stop(); 00255 } 00256 00257 void PCA9538::vSetPolarity(unsigned char Pol){ 00258 00259 Bus.start(); 00260 Bus.write(_Address & 0xFE); 00261 Bus.write(0x02); 00262 Bus.write(Pol); 00263 Bus.stop(); 00264 } 00265 00266 unsigned char PCA9538::cRead(void){ 00267 unsigned char Temp; 00268 00269 Bus.start(); 00270 Bus.write(_Address & 0xFE); 00271 Bus.write(0x00); 00272 Bus.start(); 00273 Bus.write(_Address | 0x01); 00274 Temp=Bus.read(0); 00275 Bus.stop(); 00276 00277 return(Temp); 00278 } 00279 00280 void PCA9538::vWrite(unsigned char Data){ 00281 00282 Bus.start(); 00283 Bus.write(_Address & 0xFE); 00284 Bus.write(0x01); 00285 Bus.write(Data); 00286 Bus.stop(); 00287 } 00288 00289 void PCA9538::vEnableSetInterrupt(void (*fptr)(void)){ 00290 PCA9538_Event.fall(fptr); 00291 } 00292 00293 void PCA9538::vDisableInterrupt(void){ 00294 PCA9538_Event.fall(NULL); 00295 } 00296 00297 bool PCA9538::bReadPinINT(void){ 00298 return(_PIN_INT); 00299 }
Generated on Wed Jul 20 2022 04:19:35 by 1.7.2