PCA9538 I2C Expander

Dependents:   PCA9538_example MAX7314_Expander

Committer:
Suky
Date:
Wed Feb 02 21:20:33 2011 +0000
Revision:
0:d0e0b38e5991

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Suky 0:d0e0b38e5991 1 /*
Suky 0:d0e0b38e5991 2 \file PCA9538.h
Suky 0:d0e0b38e5991 3 \version: 1.0
Suky 0:d0e0b38e5991 4
Suky 0:d0e0b38e5991 5 \brief Este fichero contiene class para control de PCA9538 creando pin digitales
Suky 0:d0e0b38e5991 6 de salida o entrada, o control por registro (8-bits).
Suky 0:d0e0b38e5991 7
Suky 0:d0e0b38e5991 8 \web www.micros-designs.com.ar
Suky 0:d0e0b38e5991 9 \date 31/01/11
Suky 0:d0e0b38e5991 10
Suky 0:d0e0b38e5991 11 *- Version Log --------------------------------------------------------------*
Suky 0:d0e0b38e5991 12 * Fecha Autor Comentarios *
Suky 0:d0e0b38e5991 13 *----------------------------------------------------------------------------*
Suky 0:d0e0b38e5991 14 * 31/01/11 Suky Original *
Suky 0:d0e0b38e5991 15 *----------------------------------------------------------------------------*/
Suky 0:d0e0b38e5991 16 ///////////////////////////////////////////////////////////////////////////
Suky 0:d0e0b38e5991 17 //// ////
Suky 0:d0e0b38e5991 18 //// ////
Suky 0:d0e0b38e5991 19 //// (C) Copyright 2011 www.micros-designs.com.ar ////
Suky 0:d0e0b38e5991 20 //// Este código puede ser usado, modificado y distribuido libremente ////
Suky 0:d0e0b38e5991 21 //// sin eliminar esta cabecera y sin garantía de ningún tipo. ////
Suky 0:d0e0b38e5991 22 //// ////
Suky 0:d0e0b38e5991 23 //// ////
Suky 0:d0e0b38e5991 24 ///////////////////////////////////////////////////////////////////////////
Suky 0:d0e0b38e5991 25
Suky 0:d0e0b38e5991 26 /* EXAMPLE
Suky 0:d0e0b38e5991 27 #include "mbed.h"
Suky 0:d0e0b38e5991 28 #include "PCA9538.h"
Suky 0:d0e0b38e5991 29
Suky 0:d0e0b38e5991 30 //PCA9538 MyExpand(p9,p10,0x70,p21); // sda,scl,address,Interrupts
Suky 0:d0e0b38e5991 31 DigitalOut myled(LED1);
Suky 0:d0e0b38e5991 32 DigitalOut myled2(LED2);
Suky 0:d0e0b38e5991 33 PCA9538PinOut myled3(exp_p4,p9,p10,0x70); // pin del PCA,sda,scl,address
Suky 0:d0e0b38e5991 34 PCA9538PinOut myled4(exp_p7,p9,p10,0x70);
Suky 0:d0e0b38e5991 35 PCA9538PinIn mypuls(exp_p0,p9,p10,0x70);
Suky 0:d0e0b38e5991 36 //void vISRExpand(void);
Suky 0:d0e0b38e5991 37
Suky 0:d0e0b38e5991 38 int main() {
Suky 0:d0e0b38e5991 39 //MyExpand.vInit(0x0F,&vISRExpand);
Suky 0:d0e0b38e5991 40 //MyExpand.vWrite(0x00);
Suky 0:d0e0b38e5991 41 while(1) {
Suky 0:d0e0b38e5991 42 if(mypuls==0){
Suky 0:d0e0b38e5991 43 myled2=1;
Suky 0:d0e0b38e5991 44 wait(0.3);
Suky 0:d0e0b38e5991 45 myled2=0;
Suky 0:d0e0b38e5991 46 wait(0.3);
Suky 0:d0e0b38e5991 47 }else{
Suky 0:d0e0b38e5991 48 myled3=1;
Suky 0:d0e0b38e5991 49 myled4=1;
Suky 0:d0e0b38e5991 50 myled=myled3;
Suky 0:d0e0b38e5991 51 wait(0.5);
Suky 0:d0e0b38e5991 52 myled = 0;
Suky 0:d0e0b38e5991 53 myled3=0;
Suky 0:d0e0b38e5991 54 myled4=0;
Suky 0:d0e0b38e5991 55 wait(0.5);
Suky 0:d0e0b38e5991 56 }
Suky 0:d0e0b38e5991 57 }
Suky 0:d0e0b38e5991 58 }
Suky 0:d0e0b38e5991 59
Suky 0:d0e0b38e5991 60
Suky 0:d0e0b38e5991 61 //void vISRExpand(void){
Suky 0:d0e0b38e5991 62 //
Suky 0:d0e0b38e5991 63 // myled2=!myled2;
Suky 0:d0e0b38e5991 64 // MyExpand.vWrite(MyExpand.cRead()<<4);
Suky 0:d0e0b38e5991 65 //}
Suky 0:d0e0b38e5991 66 */
Suky 0:d0e0b38e5991 67 #include "mbed.h"
Suky 0:d0e0b38e5991 68
Suky 0:d0e0b38e5991 69 enum ExpPinName{
Suky 0:d0e0b38e5991 70 exp_p0=0,
Suky 0:d0e0b38e5991 71 exp_p1,
Suky 0:d0e0b38e5991 72 exp_p2,
Suky 0:d0e0b38e5991 73 exp_p3,
Suky 0:d0e0b38e5991 74 exp_p4,
Suky 0:d0e0b38e5991 75 exp_p5,
Suky 0:d0e0b38e5991 76 exp_p6,
Suky 0:d0e0b38e5991 77 exp_p7,
Suky 0:d0e0b38e5991 78 };
Suky 0:d0e0b38e5991 79
Suky 0:d0e0b38e5991 80 class PCA9538PinOut{
Suky 0:d0e0b38e5991 81 public:
Suky 0:d0e0b38e5991 82 PCA9538PinOut(ExpPinName Pin,PinName PIN_SDA,PinName PIN_SCL,unsigned char Address);
Suky 0:d0e0b38e5991 83 void vWrite(int value);
Suky 0:d0e0b38e5991 84 int read();
Suky 0:d0e0b38e5991 85 #ifdef MBED_OPERATORS
Suky 0:d0e0b38e5991 86 PCA9538PinOut& operator= (int value);
Suky 0:d0e0b38e5991 87 operator int();
Suky 0:d0e0b38e5991 88 #endif
Suky 0:d0e0b38e5991 89 protected:
Suky 0:d0e0b38e5991 90 ExpPinName _Pin;
Suky 0:d0e0b38e5991 91 unsigned char _Address;
Suky 0:d0e0b38e5991 92 I2C Bus;
Suky 0:d0e0b38e5991 93 };
Suky 0:d0e0b38e5991 94
Suky 0:d0e0b38e5991 95 PCA9538PinOut::PCA9538PinOut(ExpPinName Pin,PinName PIN_SDA,PinName PIN_SCL,unsigned char Address)
Suky 0:d0e0b38e5991 96 :Bus(PIN_SDA,PIN_SCL),_Pin(Pin),_Address(Address<<1){
Suky 0:d0e0b38e5991 97 unsigned char Temp;
Suky 0:d0e0b38e5991 98
Suky 0:d0e0b38e5991 99 Bus.start();
Suky 0:d0e0b38e5991 100 Bus.write(_Address & 0xFE);
Suky 0:d0e0b38e5991 101 Bus.write(0x03);
Suky 0:d0e0b38e5991 102 Bus.start();
Suky 0:d0e0b38e5991 103 Bus.write(_Address | 0x01);
Suky 0:d0e0b38e5991 104 Temp=Bus.read(0);
Suky 0:d0e0b38e5991 105 Bus.stop();
Suky 0:d0e0b38e5991 106
Suky 0:d0e0b38e5991 107 Bus.start();
Suky 0:d0e0b38e5991 108 Bus.write(_Address & 0xFE);
Suky 0:d0e0b38e5991 109 Bus.write(0x03);
Suky 0:d0e0b38e5991 110 Bus.write((~(0x01<<_Pin))&Temp);
Suky 0:d0e0b38e5991 111 Bus.stop();
Suky 0:d0e0b38e5991 112 }
Suky 0:d0e0b38e5991 113
Suky 0:d0e0b38e5991 114 void PCA9538PinOut::vWrite(int value){
Suky 0:d0e0b38e5991 115 unsigned char Temp;
Suky 0:d0e0b38e5991 116
Suky 0:d0e0b38e5991 117 Bus.start();
Suky 0:d0e0b38e5991 118 Bus.write(_Address & 0xFE);
Suky 0:d0e0b38e5991 119 Bus.write(0x01);
Suky 0:d0e0b38e5991 120 Bus.start();
Suky 0:d0e0b38e5991 121 Bus.write(_Address | 0x01);
Suky 0:d0e0b38e5991 122 Temp=Bus.read(0);
Suky 0:d0e0b38e5991 123 Bus.stop();
Suky 0:d0e0b38e5991 124
Suky 0:d0e0b38e5991 125 Bus.start();
Suky 0:d0e0b38e5991 126 Bus.write(_Address & 0xFE);
Suky 0:d0e0b38e5991 127 Bus.write(0x01);
Suky 0:d0e0b38e5991 128 if(value==0){
Suky 0:d0e0b38e5991 129 Bus.write((~(0x01<<_Pin))&Temp);
Suky 0:d0e0b38e5991 130 }else{
Suky 0:d0e0b38e5991 131 Bus.write((0x01<<_Pin)|Temp);
Suky 0:d0e0b38e5991 132 }
Suky 0:d0e0b38e5991 133 Bus.stop();
Suky 0:d0e0b38e5991 134 }
Suky 0:d0e0b38e5991 135
Suky 0:d0e0b38e5991 136 int PCA9538PinOut::read(){
Suky 0:d0e0b38e5991 137 unsigned char Temp;
Suky 0:d0e0b38e5991 138
Suky 0:d0e0b38e5991 139 Bus.start();
Suky 0:d0e0b38e5991 140 Bus.write(_Address & 0xFE);
Suky 0:d0e0b38e5991 141 Bus.write(0x01);
Suky 0:d0e0b38e5991 142 Bus.start();
Suky 0:d0e0b38e5991 143 Bus.write(_Address | 0x01);
Suky 0:d0e0b38e5991 144 Temp=Bus.read(0);
Suky 0:d0e0b38e5991 145 Bus.stop();
Suky 0:d0e0b38e5991 146
Suky 0:d0e0b38e5991 147 return((Temp>>_Pin)&0x01);
Suky 0:d0e0b38e5991 148 }
Suky 0:d0e0b38e5991 149
Suky 0:d0e0b38e5991 150 PCA9538PinOut& PCA9538PinOut::operator= (int value){
Suky 0:d0e0b38e5991 151 vWrite(value);
Suky 0:d0e0b38e5991 152 }
Suky 0:d0e0b38e5991 153
Suky 0:d0e0b38e5991 154 PCA9538PinOut::operator int(){
Suky 0:d0e0b38e5991 155
Suky 0:d0e0b38e5991 156 return(read());
Suky 0:d0e0b38e5991 157 }
Suky 0:d0e0b38e5991 158 //*****************************************************************************
Suky 0:d0e0b38e5991 159 class PCA9538PinIn{
Suky 0:d0e0b38e5991 160 public:
Suky 0:d0e0b38e5991 161 PCA9538PinIn(ExpPinName Pin,PinName PIN_SDA,PinName PIN_SCL,unsigned char Address);
Suky 0:d0e0b38e5991 162 int read();
Suky 0:d0e0b38e5991 163 #ifdef MBED_OPERATORS
Suky 0:d0e0b38e5991 164 operator int();
Suky 0:d0e0b38e5991 165 #endif
Suky 0:d0e0b38e5991 166 protected:
Suky 0:d0e0b38e5991 167 ExpPinName _Pin;
Suky 0:d0e0b38e5991 168 unsigned char _Address;
Suky 0:d0e0b38e5991 169 I2C Bus;
Suky 0:d0e0b38e5991 170 };
Suky 0:d0e0b38e5991 171
Suky 0:d0e0b38e5991 172 PCA9538PinIn::PCA9538PinIn(ExpPinName Pin,PinName PIN_SDA,PinName PIN_SCL,unsigned char Address)
Suky 0:d0e0b38e5991 173 :Bus(PIN_SDA,PIN_SCL),_Pin(Pin),_Address(Address<<1){
Suky 0:d0e0b38e5991 174 unsigned char Temp;
Suky 0:d0e0b38e5991 175
Suky 0:d0e0b38e5991 176 Bus.start();
Suky 0:d0e0b38e5991 177 Bus.write(_Address & 0xFE);
Suky 0:d0e0b38e5991 178 Bus.write(0x03);
Suky 0:d0e0b38e5991 179 Bus.start();
Suky 0:d0e0b38e5991 180 Bus.write(_Address | 0x01);
Suky 0:d0e0b38e5991 181 Temp=Bus.read(0);
Suky 0:d0e0b38e5991 182 Bus.stop();
Suky 0:d0e0b38e5991 183
Suky 0:d0e0b38e5991 184 Bus.start();
Suky 0:d0e0b38e5991 185 Bus.write(_Address & 0xFE);
Suky 0:d0e0b38e5991 186 Bus.write(0x03);
Suky 0:d0e0b38e5991 187 Bus.write((0x01<<_Pin)|Temp);
Suky 0:d0e0b38e5991 188 Bus.stop();
Suky 0:d0e0b38e5991 189 }
Suky 0:d0e0b38e5991 190
Suky 0:d0e0b38e5991 191 int PCA9538PinIn::read(){
Suky 0:d0e0b38e5991 192 unsigned char Temp;
Suky 0:d0e0b38e5991 193
Suky 0:d0e0b38e5991 194 Bus.start();
Suky 0:d0e0b38e5991 195 Bus.write(_Address & 0xFE);
Suky 0:d0e0b38e5991 196 Bus.write(0x00);
Suky 0:d0e0b38e5991 197 Bus.start();
Suky 0:d0e0b38e5991 198 Bus.write(_Address | 0x01);
Suky 0:d0e0b38e5991 199 Temp=Bus.read(0);
Suky 0:d0e0b38e5991 200 Bus.stop();
Suky 0:d0e0b38e5991 201
Suky 0:d0e0b38e5991 202 return((Temp>>_Pin)&0x01);
Suky 0:d0e0b38e5991 203 }
Suky 0:d0e0b38e5991 204
Suky 0:d0e0b38e5991 205 PCA9538PinIn::operator int(){
Suky 0:d0e0b38e5991 206
Suky 0:d0e0b38e5991 207 return(read());
Suky 0:d0e0b38e5991 208 }
Suky 0:d0e0b38e5991 209 //*****************************************************************************
Suky 0:d0e0b38e5991 210 class PCA9538{
Suky 0:d0e0b38e5991 211 public:
Suky 0:d0e0b38e5991 212 PCA9538(PinName PIN_SDA,PinName PIN_SCL,unsigned char Address,PinName PIN_INT=NC);
Suky 0:d0e0b38e5991 213 void vInit(unsigned char Dir,void (*fptr)(void));
Suky 0:d0e0b38e5991 214 void vSetConfiguration(unsigned char Dir);
Suky 0:d0e0b38e5991 215 void vSetPolarity(unsigned char Pol);
Suky 0:d0e0b38e5991 216 unsigned char cRead(void);
Suky 0:d0e0b38e5991 217 void vWrite(unsigned char Data);
Suky 0:d0e0b38e5991 218 void vEnableSetInterrupt(void (*fptr)(void));
Suky 0:d0e0b38e5991 219 void vDisableInterrupt(void);
Suky 0:d0e0b38e5991 220 bool bReadPinINT(void);
Suky 0:d0e0b38e5991 221 protected:
Suky 0:d0e0b38e5991 222 I2C Bus;
Suky 0:d0e0b38e5991 223 InterruptIn PCA9538_Event;
Suky 0:d0e0b38e5991 224 DigitalIn _PIN_INT;
Suky 0:d0e0b38e5991 225 unsigned char _Address;
Suky 0:d0e0b38e5991 226 };
Suky 0:d0e0b38e5991 227
Suky 0:d0e0b38e5991 228 PCA9538::PCA9538(PinName PIN_SDA,PinName PIN_SCL,unsigned char Address,PinName PIN_INT)
Suky 0:d0e0b38e5991 229 : Bus(PIN_SDA,PIN_SCL),_PIN_INT(PIN_INT),PCA9538_Event(PIN_INT){
Suky 0:d0e0b38e5991 230 _Address=Address<<1;
Suky 0:d0e0b38e5991 231 }
Suky 0:d0e0b38e5991 232
Suky 0:d0e0b38e5991 233 void PCA9538::vInit(unsigned char Dir,void (*fptr)(void)){
Suky 0:d0e0b38e5991 234
Suky 0:d0e0b38e5991 235 //Bus.frequency(400000);
Suky 0:d0e0b38e5991 236
Suky 0:d0e0b38e5991 237 Bus.start();
Suky 0:d0e0b38e5991 238 Bus.write(_Address & 0xFE);
Suky 0:d0e0b38e5991 239 Bus.write(0x03);
Suky 0:d0e0b38e5991 240 Bus.write(Dir);
Suky 0:d0e0b38e5991 241 Bus.stop();
Suky 0:d0e0b38e5991 242
Suky 0:d0e0b38e5991 243 if (fptr!=NULL){
Suky 0:d0e0b38e5991 244 PCA9538_Event.fall(fptr);
Suky 0:d0e0b38e5991 245 }
Suky 0:d0e0b38e5991 246 }
Suky 0:d0e0b38e5991 247
Suky 0:d0e0b38e5991 248 void PCA9538::vSetConfiguration(unsigned char Dir){
Suky 0:d0e0b38e5991 249
Suky 0:d0e0b38e5991 250 Bus.start();
Suky 0:d0e0b38e5991 251 Bus.write(_Address & 0xFE);
Suky 0:d0e0b38e5991 252 Bus.write(0x03);
Suky 0:d0e0b38e5991 253 Bus.write(Dir);
Suky 0:d0e0b38e5991 254 Bus.stop();
Suky 0:d0e0b38e5991 255 }
Suky 0:d0e0b38e5991 256
Suky 0:d0e0b38e5991 257 void PCA9538::vSetPolarity(unsigned char Pol){
Suky 0:d0e0b38e5991 258
Suky 0:d0e0b38e5991 259 Bus.start();
Suky 0:d0e0b38e5991 260 Bus.write(_Address & 0xFE);
Suky 0:d0e0b38e5991 261 Bus.write(0x02);
Suky 0:d0e0b38e5991 262 Bus.write(Pol);
Suky 0:d0e0b38e5991 263 Bus.stop();
Suky 0:d0e0b38e5991 264 }
Suky 0:d0e0b38e5991 265
Suky 0:d0e0b38e5991 266 unsigned char PCA9538::cRead(void){
Suky 0:d0e0b38e5991 267 unsigned char Temp;
Suky 0:d0e0b38e5991 268
Suky 0:d0e0b38e5991 269 Bus.start();
Suky 0:d0e0b38e5991 270 Bus.write(_Address & 0xFE);
Suky 0:d0e0b38e5991 271 Bus.write(0x00);
Suky 0:d0e0b38e5991 272 Bus.start();
Suky 0:d0e0b38e5991 273 Bus.write(_Address | 0x01);
Suky 0:d0e0b38e5991 274 Temp=Bus.read(0);
Suky 0:d0e0b38e5991 275 Bus.stop();
Suky 0:d0e0b38e5991 276
Suky 0:d0e0b38e5991 277 return(Temp);
Suky 0:d0e0b38e5991 278 }
Suky 0:d0e0b38e5991 279
Suky 0:d0e0b38e5991 280 void PCA9538::vWrite(unsigned char Data){
Suky 0:d0e0b38e5991 281
Suky 0:d0e0b38e5991 282 Bus.start();
Suky 0:d0e0b38e5991 283 Bus.write(_Address & 0xFE);
Suky 0:d0e0b38e5991 284 Bus.write(0x01);
Suky 0:d0e0b38e5991 285 Bus.write(Data);
Suky 0:d0e0b38e5991 286 Bus.stop();
Suky 0:d0e0b38e5991 287 }
Suky 0:d0e0b38e5991 288
Suky 0:d0e0b38e5991 289 void PCA9538::vEnableSetInterrupt(void (*fptr)(void)){
Suky 0:d0e0b38e5991 290 PCA9538_Event.fall(fptr);
Suky 0:d0e0b38e5991 291 }
Suky 0:d0e0b38e5991 292
Suky 0:d0e0b38e5991 293 void PCA9538::vDisableInterrupt(void){
Suky 0:d0e0b38e5991 294 PCA9538_Event.fall(NULL);
Suky 0:d0e0b38e5991 295 }
Suky 0:d0e0b38e5991 296
Suky 0:d0e0b38e5991 297 bool PCA9538::bReadPinINT(void){
Suky 0:d0e0b38e5991 298 return(_PIN_INT);
Suky 0:d0e0b38e5991 299 }