Plese use this class with my "i2cmaster" class.

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

Committer:
sgrsn
Date:
Sat Apr 16 04:25:19 2016 +0000
Revision:
0:69b088a9899b
Child:
1:cd92200b8a50
I2C_Slave class

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sgrsn 0:69b088a9899b 1 #include "i2cslave.h"
sgrsn 0:69b088a9899b 2
sgrsn 0:69b088a9899b 3 #if DEVICE_I2CSLAVE
sgrsn 0:69b088a9899b 4
sgrsn 0:69b088a9899b 5 namespace mbed {
sgrsn 0:69b088a9899b 6
sgrsn 0:69b088a9899b 7 i2cslave* instance;
sgrsn 0:69b088a9899b 8
sgrsn 0:69b088a9899b 9 i2cslave::i2cslave(PinName sda, PinName scl, char *_Registar) : I2CSlave(sda, scl)
sgrsn 0:69b088a9899b 10 {
sgrsn 0:69b088a9899b 11 frequency(400000);
sgrsn 0:69b088a9899b 12 i2cslave::attach(this, &i2cslave::getdata);
sgrsn 0:69b088a9899b 13 Registar = _Registar;
sgrsn 0:69b088a9899b 14 }
sgrsn 0:69b088a9899b 15
sgrsn 0:69b088a9899b 16 void i2cslave::getdata( void )
sgrsn 0:69b088a9899b 17 {
sgrsn 0:69b088a9899b 18 if(I2CSlave::receive()==I2CSlave::WriteAddressed)
sgrsn 0:69b088a9899b 19 {
sgrsn 0:69b088a9899b 20 char DATA[2] = {};
sgrsn 0:69b088a9899b 21 I2CSlave::read(DATA,2);
sgrsn 0:69b088a9899b 22 char reg=DATA[0];
sgrsn 0:69b088a9899b 23 char num =DATA[1];
sgrsn 0:69b088a9899b 24 char X[num];
sgrsn 0:69b088a9899b 25 char f=0;
sgrsn 0:69b088a9899b 26 wait_us(50);
sgrsn 0:69b088a9899b 27 switch(I2CSlave::receive())
sgrsn 0:69b088a9899b 28 {
sgrsn 0:69b088a9899b 29 case 0 :break;
sgrsn 0:69b088a9899b 30 case I2CSlave::ReadAddressed:
sgrsn 0:69b088a9899b 31 {
sgrsn 0:69b088a9899b 32 char *po = Registar+reg;
sgrsn 0:69b088a9899b 33 for(int i=0;i<num;i++)
sgrsn 0:69b088a9899b 34 X[i]=*po+i;
sgrsn 0:69b088a9899b 35 I2CSlave::write(X,num);
sgrsn 0:69b088a9899b 36 f=1;
sgrsn 0:69b088a9899b 37 do
sgrsn 0:69b088a9899b 38 {
sgrsn 0:69b088a9899b 39
sgrsn 0:69b088a9899b 40 //f = I2CSlave::write(Registar[reg]);
sgrsn 0:69b088a9899b 41 f = I2CSlave::write(*(Registar+reg));
sgrsn 0:69b088a9899b 42 reg++;
sgrsn 0:69b088a9899b 43 }while(f==1);
sgrsn 0:69b088a9899b 44 break;
sgrsn 0:69b088a9899b 45 }
sgrsn 0:69b088a9899b 46 case I2CSlave::WriteGeneral:{break;}
sgrsn 0:69b088a9899b 47 case I2CSlave::WriteAddressed:
sgrsn 0:69b088a9899b 48 {
sgrsn 0:69b088a9899b 49 char num = DATA[1];
sgrsn 0:69b088a9899b 50 for(int i=1; i<num; i++,reg++)
sgrsn 0:69b088a9899b 51 char X[num];
sgrsn 0:69b088a9899b 52 I2CSlave::read(X,num);
sgrsn 0:69b088a9899b 53 for (int i=0;i<num;i++)
sgrsn 0:69b088a9899b 54 {
sgrsn 0:69b088a9899b 55 //Registar[reg]=X[i];
sgrsn 0:69b088a9899b 56 *(Registar+reg) = X[i];
sgrsn 0:69b088a9899b 57 reg++;
sgrsn 0:69b088a9899b 58 }
sgrsn 0:69b088a9899b 59 break;
sgrsn 0:69b088a9899b 60 }
sgrsn 0:69b088a9899b 61 }
sgrsn 0:69b088a9899b 62 }
sgrsn 0:69b088a9899b 63 }
sgrsn 0:69b088a9899b 64 void i2cslave::attach(void (*fptr)(void)) {
sgrsn 0:69b088a9899b 65 fp.attach(fptr);
sgrsn 0:69b088a9899b 66 enable_attach();
sgrsn 0:69b088a9899b 67 }
sgrsn 0:69b088a9899b 68
sgrsn 0:69b088a9899b 69 void i2cslave::func_call(uint32_t id, uint8_t addr, uint8_t state) {
sgrsn 0:69b088a9899b 70 instance->fp.call();
sgrsn 0:69b088a9899b 71 }
sgrsn 0:69b088a9899b 72
sgrsn 0:69b088a9899b 73 void i2cslave::enable_attach() {
sgrsn 0:69b088a9899b 74 instance = this;
sgrsn 0:69b088a9899b 75 NVIC_SetVector(I2C_IRQn, (uint32_t)(&i2cslave::func_call));
sgrsn 0:69b088a9899b 76 NVIC_EnableIRQ(I2C_IRQn);
sgrsn 0:69b088a9899b 77 }
sgrsn 0:69b088a9899b 78
sgrsn 0:69b088a9899b 79 void i2cslave::disable_attach() {
sgrsn 0:69b088a9899b 80 NVIC_DisableIRQ(I2C_IRQn);
sgrsn 0:69b088a9899b 81 }
sgrsn 0:69b088a9899b 82
sgrsn 0:69b088a9899b 83 }
sgrsn 0:69b088a9899b 84
sgrsn 0:69b088a9899b 85 #endif