Developing Library for the MAX7314 I2C 16-bit I/O Expander w/ PWM

Dependencies:   mbed PCA9538_Expander

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers PCA9538.h Source File

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 }