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

Dependencies:   mbed PCA9538_Expander

Committer:
uasenden
Date:
Wed Apr 13 23:17:22 2011 +0000
Revision:
0:7e32b01354d3
Rev 0

Who changed what in which revision?

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