Plese use this class with my "i2cmaster" class.

Dependents:   2016_slave_rorikon_2 2016_slave_cylinder 2016_slave_MD 2016_slave_MD_rorikon ... more

i2cslave.cpp

Committer:
sgrsn
Date:
2018-07-12
Revision:
1:cd92200b8a50
Parent:
0:69b088a9899b
Child:
2:0dff052266ca

File content as of revision 1:cd92200b8a50:

#include "i2cslave.h"

#if DEVICE_I2CSLAVE

namespace mbed {

i2cslave* instance;

i2cslave::i2cslave(PinName sda, PinName scl, char *_Registar) : I2CSlave(sda, scl)
{
    frequency(400000);
    i2cslave::attach(this, &i2cslave::getdata);
    Registar = _Registar;
}

void i2cslave::getdata( void )
{
    if(I2CSlave::receive()==I2CSlave::WriteAddressed)
    {
        char DATA[2] = {}; 
        I2CSlave::read(DATA,2);
        char reg=DATA[0];
        char num =DATA[1]; 
        char X[num];
        char f=0;
        wait_us(50);
        switch(I2CSlave::receive())
        {
            case 0 :break;
            case I2CSlave::ReadAddressed:
            {
                char *po = Registar+reg;
                for(int i=0;i<num;i++)
                    X[i]=*po+i;
                I2CSlave::write(X,num);
                f=1;
                do
                {

                    //f = I2CSlave::write(Registar[reg]);
                    f = I2CSlave::write(*(Registar+reg));
                    reg++;
                }while(f==1);
                break;
            }
            case I2CSlave::WriteGeneral:{break;}
            case I2CSlave::WriteAddressed:
            {
                char num = DATA[1];
                for(int i=1; i<num; i++,reg++)
                    char X[num];
                    I2CSlave::read(X,num);
                    for (int i=0;i<num;i++)
                    {
                        //Registar[reg]=X[i];
                        *(Registar+reg) = X[i];
                        reg++;
                    }
                break;
            }
        }
    }
}
void i2cslave::attach(void (*fptr)(void)) {
    fp.attach(fptr);
    enable_attach();
}

void i2cslave::func_call(uint32_t id, uint8_t addr, uint8_t state) {
    instance->fp.call();
}

void i2cslave::enable_attach() {
    instance = this;
    //NVIC_SetVector(I2C_IRQn, (uint32_t)(&i2cslave::func_call));   //lpc1114
    NVIC_SetVector(I2C2_IRQn, (uint32_t)(&i2cslave::func_call));    //lpc1768 (pin28, pin27)
    NVIC_EnableIRQ(I2C2_IRQn);    
}

void i2cslave::disable_attach() {
    //NVIC_DisableIRQ(I2C_IRQn);    //lp1114
    NVIC_DisableIRQ(I2C2_IRQn);    //lpc1768 (pin28, pin27)
}

}

#endif