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
uasenden 0:7e32b01354d3 3 MAX7314.cpp
uasenden 0:7e32b01354d3 4
uasenden 0:7e32b01354d3 5 Library implementation file for the MAX7314 16-bit I/O Expander with PWM
uasenden 0:7e32b01354d3 6
uasenden 0:7e32b01354d3 7 Tom Gambone
uasenden 0:7e32b01354d3 8 Chad Joppeck
uasenden 0:7e32b01354d3 9
uasenden 0:7e32b01354d3 10 Based on code by mBed user: "Ale C.-" / Suky (PCA9538_Expander Library)
uasenden 0:7e32b01354d3 11
uasenden 0:7e32b01354d3 12 4/13/2011 - Initial porting
uasenden 0:7e32b01354d3 13
uasenden 0:7e32b01354d3 14 */
uasenden 0:7e32b01354d3 15
uasenden 0:7e32b01354d3 16 #include "mbed.h"
uasenden 0:7e32b01354d3 17
uasenden 0:7e32b01354d3 18
uasenden 0:7e32b01354d3 19
uasenden 0:7e32b01354d3 20
uasenden 0:7e32b01354d3 21 //*****************************************************************************
uasenden 0:7e32b01354d3 22
uasenden 0:7e32b01354d3 23
uasenden 0:7e32b01354d3 24
uasenden 0:7e32b01354d3 25 MAX7314_OutputPin::MAX7314_OutputPin(ExpPinName Pin,PinName PIN_SDA,PinName PIN_SCL,unsigned char Address)
uasenden 0:7e32b01354d3 26 :Bus(PIN_SDA,PIN_SCL),_Pin(Pin),_Address(Address<<1) {
uasenden 0:7e32b01354d3 27
uasenden 0:7e32b01354d3 28 unsigned char Temp;
uasenden 0:7e32b01354d3 29
uasenden 0:7e32b01354d3 30 Bus.start();
uasenden 0:7e32b01354d3 31 Bus.write(_Address & 0xFE);
uasenden 0:7e32b01354d3 32 Bus.write(0x03);
uasenden 0:7e32b01354d3 33 Bus.start();
uasenden 0:7e32b01354d3 34 Bus.write(_Address | 0x01);
uasenden 0:7e32b01354d3 35 Temp=Bus.read(0);
uasenden 0:7e32b01354d3 36 Bus.stop();
uasenden 0:7e32b01354d3 37
uasenden 0:7e32b01354d3 38 Bus.start();
uasenden 0:7e32b01354d3 39 Bus.write(_Address & 0xFE);
uasenden 0:7e32b01354d3 40 Bus.write(0x03);
uasenden 0:7e32b01354d3 41 Bus.write((~(0x01<<_Pin))&Temp);
uasenden 0:7e32b01354d3 42 Bus.stop();
uasenden 0:7e32b01354d3 43 }
uasenden 0:7e32b01354d3 44
uasenden 0:7e32b01354d3 45 void MAX7314_OutputPin::vWrite(int value) {
uasenden 0:7e32b01354d3 46 unsigned char Temp;
uasenden 0:7e32b01354d3 47
uasenden 0:7e32b01354d3 48 Bus.start();
uasenden 0:7e32b01354d3 49 Bus.write(_Address & 0xFE);
uasenden 0:7e32b01354d3 50 Bus.write(0x01);
uasenden 0:7e32b01354d3 51 Bus.start();
uasenden 0:7e32b01354d3 52 Bus.write(_Address | 0x01);
uasenden 0:7e32b01354d3 53 Temp=Bus.read(0);
uasenden 0:7e32b01354d3 54 Bus.stop();
uasenden 0:7e32b01354d3 55
uasenden 0:7e32b01354d3 56 Bus.start();
uasenden 0:7e32b01354d3 57 Bus.write(_Address & 0xFE);
uasenden 0:7e32b01354d3 58 Bus.write(0x01);
uasenden 0:7e32b01354d3 59 if (value==0) {
uasenden 0:7e32b01354d3 60 Bus.write((~(0x01<<_Pin))&Temp);
uasenden 0:7e32b01354d3 61 } else {
uasenden 0:7e32b01354d3 62 Bus.write((0x01<<_Pin)|Temp);
uasenden 0:7e32b01354d3 63 }
uasenden 0:7e32b01354d3 64 Bus.stop();
uasenden 0:7e32b01354d3 65 }
uasenden 0:7e32b01354d3 66
uasenden 0:7e32b01354d3 67 int MAX7314_OutputPin::read() {
uasenden 0:7e32b01354d3 68 unsigned char Temp;
uasenden 0:7e32b01354d3 69
uasenden 0:7e32b01354d3 70 Bus.start();
uasenden 0:7e32b01354d3 71 Bus.write(_Address & 0xFE);
uasenden 0:7e32b01354d3 72 Bus.write(0x01);
uasenden 0:7e32b01354d3 73 Bus.start();
uasenden 0:7e32b01354d3 74 Bus.write(_Address | 0x01);
uasenden 0:7e32b01354d3 75 Temp=Bus.read(0);
uasenden 0:7e32b01354d3 76 Bus.stop();
uasenden 0:7e32b01354d3 77
uasenden 0:7e32b01354d3 78 return((Temp>>_Pin)&0x01);
uasenden 0:7e32b01354d3 79 }
uasenden 0:7e32b01354d3 80
uasenden 0:7e32b01354d3 81 MAX7314_OutputPin& MAX7314_OutputPin::operator= (int value) {
uasenden 0:7e32b01354d3 82 vWrite(value);
uasenden 0:7e32b01354d3 83 }
uasenden 0:7e32b01354d3 84
uasenden 0:7e32b01354d3 85 MAX7314_OutputPin::operator int() {
uasenden 0:7e32b01354d3 86
uasenden 0:7e32b01354d3 87 return(read());
uasenden 0:7e32b01354d3 88 }
uasenden 0:7e32b01354d3 89
uasenden 0:7e32b01354d3 90
uasenden 0:7e32b01354d3 91
uasenden 0:7e32b01354d3 92 //*****************************************************************************
uasenden 0:7e32b01354d3 93
uasenden 0:7e32b01354d3 94
uasenden 0:7e32b01354d3 95
uasenden 0:7e32b01354d3 96 MAX7314_InputPin::MAX7314_InputPin(ExpPinName Pin,PinName PIN_SDA,PinName PIN_SCL,unsigned char Address)
uasenden 0:7e32b01354d3 97 :Bus(PIN_SDA,PIN_SCL),_Pin(Pin),_Address(Address<<1) {
uasenden 0:7e32b01354d3 98 unsigned char Temp;
uasenden 0:7e32b01354d3 99
uasenden 0:7e32b01354d3 100 Bus.start();
uasenden 0:7e32b01354d3 101 Bus.write(_Address & 0xFE);
uasenden 0:7e32b01354d3 102 Bus.write(0x03);
uasenden 0:7e32b01354d3 103 Bus.start();
uasenden 0:7e32b01354d3 104 Bus.write(_Address | 0x01);
uasenden 0:7e32b01354d3 105 Temp=Bus.read(0);
uasenden 0:7e32b01354d3 106 Bus.stop();
uasenden 0:7e32b01354d3 107
uasenden 0:7e32b01354d3 108 Bus.start();
uasenden 0:7e32b01354d3 109 Bus.write(_Address & 0xFE);
uasenden 0:7e32b01354d3 110 Bus.write(0x03);
uasenden 0:7e32b01354d3 111 Bus.write((0x01<<_Pin)|Temp);
uasenden 0:7e32b01354d3 112 Bus.stop();
uasenden 0:7e32b01354d3 113 }
uasenden 0:7e32b01354d3 114
uasenden 0:7e32b01354d3 115 int MAX7314_InputPin::read() {
uasenden 0:7e32b01354d3 116 unsigned char Temp;
uasenden 0:7e32b01354d3 117
uasenden 0:7e32b01354d3 118 Bus.start();
uasenden 0:7e32b01354d3 119 Bus.write(_Address & 0xFE);
uasenden 0:7e32b01354d3 120 Bus.write(0x00);
uasenden 0:7e32b01354d3 121 Bus.start();
uasenden 0:7e32b01354d3 122 Bus.write(_Address | 0x01);
uasenden 0:7e32b01354d3 123 Temp=Bus.read(0);
uasenden 0:7e32b01354d3 124 Bus.stop();
uasenden 0:7e32b01354d3 125
uasenden 0:7e32b01354d3 126 return((Temp>>_Pin)&0x01);
uasenden 0:7e32b01354d3 127 }
uasenden 0:7e32b01354d3 128
uasenden 0:7e32b01354d3 129 MAX7314_InputPin::operator int() {
uasenden 0:7e32b01354d3 130
uasenden 0:7e32b01354d3 131 return(read());
uasenden 0:7e32b01354d3 132 }
uasenden 0:7e32b01354d3 133
uasenden 0:7e32b01354d3 134
uasenden 0:7e32b01354d3 135
uasenden 0:7e32b01354d3 136 //*****************************************************************************
uasenden 0:7e32b01354d3 137
uasenden 0:7e32b01354d3 138
uasenden 0:7e32b01354d3 139
uasenden 0:7e32b01354d3 140 MAX7314::MAX7314(PinName PIN_SDA,PinName PIN_SCL,unsigned char Address,PinName PIN_INT)
uasenden 0:7e32b01354d3 141 : Bus(PIN_SDA,PIN_SCL),_PIN_INT(PIN_INT),MAX7314_Event(PIN_INT) {
uasenden 0:7e32b01354d3 142 _Address=Address<<1;
uasenden 0:7e32b01354d3 143 }
uasenden 0:7e32b01354d3 144
uasenden 0:7e32b01354d3 145 void MAX7314::vInit(unsigned char Dir,void (*fptr)(void)) {
uasenden 0:7e32b01354d3 146
uasenden 0:7e32b01354d3 147 //Bus.frequency(400000);
uasenden 0:7e32b01354d3 148
uasenden 0:7e32b01354d3 149 Bus.start();
uasenden 0:7e32b01354d3 150 Bus.write(_Address & 0xFE);
uasenden 0:7e32b01354d3 151 Bus.write(0x03);
uasenden 0:7e32b01354d3 152 Bus.write(Dir);
uasenden 0:7e32b01354d3 153 Bus.stop();
uasenden 0:7e32b01354d3 154
uasenden 0:7e32b01354d3 155 if (fptr!=NULL) {
uasenden 0:7e32b01354d3 156 MAX7314_Event.fall(fptr);
uasenden 0:7e32b01354d3 157 }
uasenden 0:7e32b01354d3 158 }
uasenden 0:7e32b01354d3 159
uasenden 0:7e32b01354d3 160 void MAX7314::vSetConfiguration(unsigned char Dir) {
uasenden 0:7e32b01354d3 161
uasenden 0:7e32b01354d3 162 Bus.start();
uasenden 0:7e32b01354d3 163 Bus.write(_Address & 0xFE);
uasenden 0:7e32b01354d3 164 Bus.write(0x03);
uasenden 0:7e32b01354d3 165 Bus.write(Dir);
uasenden 0:7e32b01354d3 166 Bus.stop();
uasenden 0:7e32b01354d3 167 }
uasenden 0:7e32b01354d3 168
uasenden 0:7e32b01354d3 169 void MAX7314::vSetPolarity(unsigned char Pol) {
uasenden 0:7e32b01354d3 170
uasenden 0:7e32b01354d3 171 Bus.start();
uasenden 0:7e32b01354d3 172 Bus.write(_Address & 0xFE);
uasenden 0:7e32b01354d3 173 Bus.write(0x02);
uasenden 0:7e32b01354d3 174 Bus.write(Pol);
uasenden 0:7e32b01354d3 175 Bus.stop();
uasenden 0:7e32b01354d3 176 }
uasenden 0:7e32b01354d3 177
uasenden 0:7e32b01354d3 178 unsigned char MAX7314::cRead(void) {
uasenden 0:7e32b01354d3 179 unsigned char Temp;
uasenden 0:7e32b01354d3 180
uasenden 0:7e32b01354d3 181 Bus.start();
uasenden 0:7e32b01354d3 182 Bus.write(_Address & 0xFE);
uasenden 0:7e32b01354d3 183 Bus.write(0x00);
uasenden 0:7e32b01354d3 184 Bus.start();
uasenden 0:7e32b01354d3 185 Bus.write(_Address | 0x01);
uasenden 0:7e32b01354d3 186 Temp=Bus.read(0);
uasenden 0:7e32b01354d3 187 Bus.stop();
uasenden 0:7e32b01354d3 188
uasenden 0:7e32b01354d3 189 return(Temp);
uasenden 0:7e32b01354d3 190 }
uasenden 0:7e32b01354d3 191
uasenden 0:7e32b01354d3 192 void MAX7314::vWrite(unsigned char Data) {
uasenden 0:7e32b01354d3 193
uasenden 0:7e32b01354d3 194 Bus.start();
uasenden 0:7e32b01354d3 195 Bus.write(_Address & 0xFE);
uasenden 0:7e32b01354d3 196 Bus.write(0x01);
uasenden 0:7e32b01354d3 197 Bus.write(Data);
uasenden 0:7e32b01354d3 198 Bus.stop();
uasenden 0:7e32b01354d3 199 }
uasenden 0:7e32b01354d3 200
uasenden 0:7e32b01354d3 201 void MAX7314::vEnableSetInterrupt(void (*fptr)(void)) {
uasenden 0:7e32b01354d3 202 MAX7314_Event.fall(fptr);
uasenden 0:7e32b01354d3 203 }
uasenden 0:7e32b01354d3 204
uasenden 0:7e32b01354d3 205 void MAX7314::vDisableInterrupt(void) {
uasenden 0:7e32b01354d3 206 MAX7314_Event.fall(NULL);
uasenden 0:7e32b01354d3 207 }
uasenden 0:7e32b01354d3 208
uasenden 0:7e32b01354d3 209 bool MAX7314::bReadPinINT(void) {
uasenden 0:7e32b01354d3 210 return(_PIN_INT);
uasenden 0:7e32b01354d3 211 }