Developing Library for the MAX7314 I2C 16-bit I/O Expander w/ PWM
Dependencies: mbed PCA9538_Expander
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 }
Generated on Wed Jul 20 2022 04:19:35 by 1.7.2