Developing Library for the MAX7314 I2C 16-bit I/O Expander w/ PWM
Dependencies: mbed PCA9538_Expander
MAX7314.cpp
- Committer:
- uasenden
- Date:
- 2011-04-13
- Revision:
- 0:7e32b01354d3
File content as of revision 0:7e32b01354d3:
/* 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); }