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:
- 2016-04-16
- Revision:
- 0:69b088a9899b
- Child:
- 1:cd92200b8a50
File content as of revision 0:69b088a9899b:
#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)); NVIC_EnableIRQ(I2C_IRQn); } void i2cslave::disable_attach() { NVIC_DisableIRQ(I2C_IRQn); } } #endif