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:
2:0dff052266ca
Parent:
1:cd92200b8a50
Child:
3:6e9ecf7b83e3

File content as of revision 2:0dff052266ca:

#include "i2cslave.h"

/*example*************************************************

#include "mbed.h"
#include "i2cslave.h"

int32_t Registar[0x20];
i2cslave i2c(p28, p27, Registar);
    
int main()
{
    i2c.address(0xa0);
    Registar[10] = 0;
    while(1)
    {
        printf("%d\r\n", Registar[0]);
        Registar[1] = 1234;
        wait_ms(500);
        Registar[1] = 5678;
        wait_ms(500);
    }
}

**********************************************************/

#if DEVICE_I2CSLAVE

namespace mbed {

i2cslave* instance;

i2cslave::i2cslave(PinName sda, PinName scl, int32_t *_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];
        for(int i = 0; i < num; i++)X[i] = 0;
        int32_t tmp = 0;
        wait_us(50);
        switch(I2CSlave::receive())
        {
            case 0 :break;
            case I2CSlave::ReadAddressed:
            {
                int32_t tmp = *(Registar+reg);
                for(int i = 0; i < num; i++)
                {
                    X[i] = (tmp >> i*8) & 0xFF;
                }
                I2CSlave::write(X,num);
                break;
            }
            case I2CSlave::WriteGeneral:break;
            case I2CSlave::WriteAddressed:
            {
                I2CSlave::read(X, num);
                for (int i=0; i < num; i++)
                {
                    tmp |= X[i] << (i*8);
                }
                *(Registar+reg) = tmp;
                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