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);
}