Developing Library for the MAX7314 I2C 16-bit I/O Expander w/ PWM
Dependencies: mbed PCA9538_Expander
Diff: MAX7314.cpp
- Revision:
- 0:7e32b01354d3
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MAX7314.cpp Wed Apr 13 23:17:22 2011 +0000 @@ -0,0 +1,211 @@ +/* + + MAX7314.cpp + + Library implementation file for the MAX7314 16-bit I/O Expander with PWM + + Tom Gambone + Chad Joppeck + + Based on code by mBed user: "Ale C.-" / Suky (PCA9538_Expander Library) + + 4/13/2011 - Initial porting + +*/ + +#include "mbed.h" + + + + +//***************************************************************************** + + + +MAX7314_OutputPin::MAX7314_OutputPin(ExpPinName Pin,PinName PIN_SDA,PinName PIN_SCL,unsigned char Address) + :Bus(PIN_SDA,PIN_SCL),_Pin(Pin),_Address(Address<<1) { + + unsigned char Temp; + + Bus.start(); + Bus.write(_Address & 0xFE); + Bus.write(0x03); + Bus.start(); + Bus.write(_Address | 0x01); + Temp=Bus.read(0); + Bus.stop(); + + Bus.start(); + Bus.write(_Address & 0xFE); + Bus.write(0x03); + Bus.write((~(0x01<<_Pin))&Temp); + Bus.stop(); +} + +void MAX7314_OutputPin::vWrite(int value) { + unsigned char Temp; + + Bus.start(); + Bus.write(_Address & 0xFE); + Bus.write(0x01); + Bus.start(); + Bus.write(_Address | 0x01); + Temp=Bus.read(0); + Bus.stop(); + + Bus.start(); + Bus.write(_Address & 0xFE); + Bus.write(0x01); + if (value==0) { + Bus.write((~(0x01<<_Pin))&Temp); + } else { + Bus.write((0x01<<_Pin)|Temp); + } + Bus.stop(); +} + +int MAX7314_OutputPin::read() { + unsigned char Temp; + + Bus.start(); + Bus.write(_Address & 0xFE); + Bus.write(0x01); + Bus.start(); + Bus.write(_Address | 0x01); + Temp=Bus.read(0); + Bus.stop(); + + return((Temp>>_Pin)&0x01); +} + +MAX7314_OutputPin& MAX7314_OutputPin::operator= (int value) { + vWrite(value); +} + +MAX7314_OutputPin::operator int() { + + return(read()); +} + + + +//***************************************************************************** + + + +MAX7314_InputPin::MAX7314_InputPin(ExpPinName Pin,PinName PIN_SDA,PinName PIN_SCL,unsigned char Address) + :Bus(PIN_SDA,PIN_SCL),_Pin(Pin),_Address(Address<<1) { + unsigned char Temp; + + Bus.start(); + Bus.write(_Address & 0xFE); + Bus.write(0x03); + Bus.start(); + Bus.write(_Address | 0x01); + Temp=Bus.read(0); + Bus.stop(); + + Bus.start(); + Bus.write(_Address & 0xFE); + Bus.write(0x03); + Bus.write((0x01<<_Pin)|Temp); + Bus.stop(); +} + +int MAX7314_InputPin::read() { + unsigned char Temp; + + Bus.start(); + Bus.write(_Address & 0xFE); + Bus.write(0x00); + Bus.start(); + Bus.write(_Address | 0x01); + Temp=Bus.read(0); + Bus.stop(); + + return((Temp>>_Pin)&0x01); +} + +MAX7314_InputPin::operator int() { + + return(read()); +} + + + +//***************************************************************************** + + + +MAX7314::MAX7314(PinName PIN_SDA,PinName PIN_SCL,unsigned char Address,PinName PIN_INT) + : Bus(PIN_SDA,PIN_SCL),_PIN_INT(PIN_INT),MAX7314_Event(PIN_INT) { + _Address=Address<<1; +} + +void MAX7314::vInit(unsigned char Dir,void (*fptr)(void)) { + + //Bus.frequency(400000); + + Bus.start(); + Bus.write(_Address & 0xFE); + Bus.write(0x03); + Bus.write(Dir); + Bus.stop(); + + if (fptr!=NULL) { + MAX7314_Event.fall(fptr); + } +} + +void MAX7314::vSetConfiguration(unsigned char Dir) { + + Bus.start(); + Bus.write(_Address & 0xFE); + Bus.write(0x03); + Bus.write(Dir); + Bus.stop(); +} + +void MAX7314::vSetPolarity(unsigned char Pol) { + + Bus.start(); + Bus.write(_Address & 0xFE); + Bus.write(0x02); + Bus.write(Pol); + Bus.stop(); +} + +unsigned char MAX7314::cRead(void) { + unsigned char Temp; + + Bus.start(); + Bus.write(_Address & 0xFE); + Bus.write(0x00); + Bus.start(); + Bus.write(_Address | 0x01); + Temp=Bus.read(0); + Bus.stop(); + + return(Temp); +} + +void MAX7314::vWrite(unsigned char Data) { + + Bus.start(); + Bus.write(_Address & 0xFE); + Bus.write(0x01); + Bus.write(Data); + Bus.stop(); +} + +void MAX7314::vEnableSetInterrupt(void (*fptr)(void)) { + MAX7314_Event.fall(fptr); +} + +void MAX7314::vDisableInterrupt(void) { + MAX7314_Event.fall(NULL); +} + +bool MAX7314::bReadPinINT(void) { + return(_PIN_INT); +}