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 MAX7314.cpp Source File

MAX7314.cpp

00001 /*
00002 
00003     MAX7314.cpp
00004 
00005     Library implementation file for the MAX7314 16-bit I/O Expander with PWM
00006 
00007     Tom Gambone
00008     Chad Joppeck
00009 
00010     Based on code by mBed user: "Ale C.-" / Suky (PCA9538_Expander Library)
00011 
00012     4/13/2011 - Initial porting
00013 
00014 */
00015 
00016 #include "mbed.h"
00017 
00018 
00019 
00020 
00021 //*****************************************************************************
00022 
00023 
00024 
00025 MAX7314_OutputPin::MAX7314_OutputPin(ExpPinName Pin,PinName PIN_SDA,PinName PIN_SCL,unsigned char Address)
00026         :Bus(PIN_SDA,PIN_SCL),_Pin(Pin),_Address(Address<<1) {
00027 
00028     unsigned char Temp;
00029 
00030     Bus.start();
00031     Bus.write(_Address & 0xFE);
00032     Bus.write(0x03);
00033     Bus.start();
00034     Bus.write(_Address | 0x01);
00035     Temp=Bus.read(0);
00036     Bus.stop();
00037 
00038     Bus.start();
00039     Bus.write(_Address & 0xFE);
00040     Bus.write(0x03);
00041     Bus.write((~(0x01<<_Pin))&Temp);
00042     Bus.stop();
00043 }
00044 
00045 void MAX7314_OutputPin::vWrite(int value) {
00046     unsigned char Temp;
00047 
00048     Bus.start();
00049     Bus.write(_Address & 0xFE);
00050     Bus.write(0x01);
00051     Bus.start();
00052     Bus.write(_Address | 0x01);
00053     Temp=Bus.read(0);
00054     Bus.stop();
00055 
00056     Bus.start();
00057     Bus.write(_Address & 0xFE);
00058     Bus.write(0x01);
00059     if (value==0) {
00060         Bus.write((~(0x01<<_Pin))&Temp);
00061     } else {
00062         Bus.write((0x01<<_Pin)|Temp);
00063     }
00064     Bus.stop();
00065 }
00066 
00067 int MAX7314_OutputPin::read() {
00068     unsigned char Temp;
00069 
00070     Bus.start();
00071     Bus.write(_Address & 0xFE);
00072     Bus.write(0x01);
00073     Bus.start();
00074     Bus.write(_Address | 0x01);
00075     Temp=Bus.read(0);
00076     Bus.stop();
00077 
00078     return((Temp>>_Pin)&0x01);
00079 }
00080 
00081 MAX7314_OutputPin& MAX7314_OutputPin::operator= (int value) {
00082     vWrite(value);
00083 }
00084 
00085 MAX7314_OutputPin::operator int() {
00086 
00087     return(read());
00088 }
00089 
00090 
00091 
00092 //*****************************************************************************
00093 
00094 
00095 
00096 MAX7314_InputPin::MAX7314_InputPin(ExpPinName Pin,PinName PIN_SDA,PinName PIN_SCL,unsigned char Address)
00097         :Bus(PIN_SDA,PIN_SCL),_Pin(Pin),_Address(Address<<1) {
00098     unsigned char Temp;
00099 
00100     Bus.start();
00101     Bus.write(_Address & 0xFE);
00102     Bus.write(0x03);
00103     Bus.start();
00104     Bus.write(_Address | 0x01);
00105     Temp=Bus.read(0);
00106     Bus.stop();
00107 
00108     Bus.start();
00109     Bus.write(_Address & 0xFE);
00110     Bus.write(0x03);
00111     Bus.write((0x01<<_Pin)|Temp);
00112     Bus.stop();
00113 }
00114 
00115 int MAX7314_InputPin::read() {
00116     unsigned char Temp;
00117 
00118     Bus.start();
00119     Bus.write(_Address & 0xFE);
00120     Bus.write(0x00);
00121     Bus.start();
00122     Bus.write(_Address | 0x01);
00123     Temp=Bus.read(0);
00124     Bus.stop();
00125 
00126     return((Temp>>_Pin)&0x01);
00127 }
00128 
00129 MAX7314_InputPin::operator int() {
00130 
00131     return(read());
00132 }
00133 
00134 
00135 
00136 //*****************************************************************************
00137 
00138 
00139 
00140 MAX7314::MAX7314(PinName PIN_SDA,PinName PIN_SCL,unsigned char Address,PinName PIN_INT)
00141         : Bus(PIN_SDA,PIN_SCL),_PIN_INT(PIN_INT),MAX7314_Event(PIN_INT) {
00142     _Address=Address<<1;
00143 }
00144 
00145 void MAX7314::vInit(unsigned char Dir,void (*fptr)(void)) {
00146 
00147     //Bus.frequency(400000);
00148 
00149     Bus.start();
00150     Bus.write(_Address & 0xFE);
00151     Bus.write(0x03);
00152     Bus.write(Dir);
00153     Bus.stop();
00154 
00155     if (fptr!=NULL) {
00156         MAX7314_Event.fall(fptr);
00157     }
00158 }
00159 
00160 void MAX7314::vSetConfiguration(unsigned char Dir) {
00161 
00162     Bus.start();
00163     Bus.write(_Address & 0xFE);
00164     Bus.write(0x03);
00165     Bus.write(Dir);
00166     Bus.stop();
00167 }
00168 
00169 void MAX7314::vSetPolarity(unsigned char Pol) {
00170 
00171     Bus.start();
00172     Bus.write(_Address & 0xFE);
00173     Bus.write(0x02);
00174     Bus.write(Pol);
00175     Bus.stop();
00176 }
00177 
00178 unsigned char MAX7314::cRead(void) {
00179     unsigned char Temp;
00180 
00181     Bus.start();
00182     Bus.write(_Address & 0xFE);
00183     Bus.write(0x00);
00184     Bus.start();
00185     Bus.write(_Address | 0x01);
00186     Temp=Bus.read(0);
00187     Bus.stop();
00188 
00189     return(Temp);
00190 }
00191 
00192 void MAX7314::vWrite(unsigned char Data) {
00193 
00194     Bus.start();
00195     Bus.write(_Address & 0xFE);
00196     Bus.write(0x01);
00197     Bus.write(Data);
00198     Bus.stop();
00199 }
00200 
00201 void MAX7314::vEnableSetInterrupt(void (*fptr)(void)) {
00202     MAX7314_Event.fall(fptr);
00203 }
00204 
00205 void MAX7314::vDisableInterrupt(void) {
00206     MAX7314_Event.fall(NULL);
00207 }
00208 
00209 bool MAX7314::bReadPinINT(void) {
00210     return(_PIN_INT);
00211 }