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:
Thu Jul 12 10:17:19 2018 +0000
Revision:
2:0dff052266ca
Parent:
1:cd92200b8a50
Child:
3:6e9ecf7b83e3
perfect

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sgrsn 0:69b088a9899b 1 #include "i2cslave.h"
sgrsn 0:69b088a9899b 2
sgrsn 2:0dff052266ca 3 /*example*************************************************
sgrsn 2:0dff052266ca 4
sgrsn 2:0dff052266ca 5 #include "mbed.h"
sgrsn 2:0dff052266ca 6 #include "i2cslave.h"
sgrsn 2:0dff052266ca 7
sgrsn 2:0dff052266ca 8 int32_t Registar[0x20];
sgrsn 2:0dff052266ca 9 i2cslave i2c(p28, p27, Registar);
sgrsn 2:0dff052266ca 10
sgrsn 2:0dff052266ca 11 int main()
sgrsn 2:0dff052266ca 12 {
sgrsn 2:0dff052266ca 13 i2c.address(0xa0);
sgrsn 2:0dff052266ca 14 Registar[10] = 0;
sgrsn 2:0dff052266ca 15 while(1)
sgrsn 2:0dff052266ca 16 {
sgrsn 2:0dff052266ca 17 printf("%d\r\n", Registar[0]);
sgrsn 2:0dff052266ca 18 Registar[1] = 1234;
sgrsn 2:0dff052266ca 19 wait_ms(500);
sgrsn 2:0dff052266ca 20 Registar[1] = 5678;
sgrsn 2:0dff052266ca 21 wait_ms(500);
sgrsn 2:0dff052266ca 22 }
sgrsn 2:0dff052266ca 23 }
sgrsn 2:0dff052266ca 24
sgrsn 2:0dff052266ca 25 **********************************************************/
sgrsn 2:0dff052266ca 26
sgrsn 0:69b088a9899b 27 #if DEVICE_I2CSLAVE
sgrsn 0:69b088a9899b 28
sgrsn 0:69b088a9899b 29 namespace mbed {
sgrsn 0:69b088a9899b 30
sgrsn 0:69b088a9899b 31 i2cslave* instance;
sgrsn 0:69b088a9899b 32
sgrsn 2:0dff052266ca 33 i2cslave::i2cslave(PinName sda, PinName scl, int32_t *_Registar) : I2CSlave(sda, scl)
sgrsn 0:69b088a9899b 34 {
sgrsn 0:69b088a9899b 35 frequency(400000);
sgrsn 0:69b088a9899b 36 i2cslave::attach(this, &i2cslave::getdata);
sgrsn 0:69b088a9899b 37 Registar = _Registar;
sgrsn 0:69b088a9899b 38 }
sgrsn 0:69b088a9899b 39
sgrsn 0:69b088a9899b 40 void i2cslave::getdata( void )
sgrsn 0:69b088a9899b 41 {
sgrsn 0:69b088a9899b 42 if(I2CSlave::receive()==I2CSlave::WriteAddressed)
sgrsn 0:69b088a9899b 43 {
sgrsn 0:69b088a9899b 44 char DATA[2] = {};
sgrsn 0:69b088a9899b 45 I2CSlave::read(DATA,2);
sgrsn 0:69b088a9899b 46 char reg=DATA[0];
sgrsn 0:69b088a9899b 47 char num =DATA[1];
sgrsn 0:69b088a9899b 48 char X[num];
sgrsn 2:0dff052266ca 49 for(int i = 0; i < num; i++)X[i] = 0;
sgrsn 2:0dff052266ca 50 int32_t tmp = 0;
sgrsn 0:69b088a9899b 51 wait_us(50);
sgrsn 0:69b088a9899b 52 switch(I2CSlave::receive())
sgrsn 0:69b088a9899b 53 {
sgrsn 0:69b088a9899b 54 case 0 :break;
sgrsn 0:69b088a9899b 55 case I2CSlave::ReadAddressed:
sgrsn 0:69b088a9899b 56 {
sgrsn 2:0dff052266ca 57 int32_t tmp = *(Registar+reg);
sgrsn 2:0dff052266ca 58 for(int i = 0; i < num; i++)
sgrsn 2:0dff052266ca 59 {
sgrsn 2:0dff052266ca 60 X[i] = (tmp >> i*8) & 0xFF;
sgrsn 2:0dff052266ca 61 }
sgrsn 0:69b088a9899b 62 I2CSlave::write(X,num);
sgrsn 0:69b088a9899b 63 break;
sgrsn 0:69b088a9899b 64 }
sgrsn 2:0dff052266ca 65 case I2CSlave::WriteGeneral:break;
sgrsn 0:69b088a9899b 66 case I2CSlave::WriteAddressed:
sgrsn 0:69b088a9899b 67 {
sgrsn 2:0dff052266ca 68 I2CSlave::read(X, num);
sgrsn 2:0dff052266ca 69 for (int i=0; i < num; i++)
sgrsn 2:0dff052266ca 70 {
sgrsn 2:0dff052266ca 71 tmp |= X[i] << (i*8);
sgrsn 2:0dff052266ca 72 }
sgrsn 2:0dff052266ca 73 *(Registar+reg) = tmp;
sgrsn 0:69b088a9899b 74 break;
sgrsn 0:69b088a9899b 75 }
sgrsn 0:69b088a9899b 76 }
sgrsn 0:69b088a9899b 77 }
sgrsn 0:69b088a9899b 78 }
sgrsn 0:69b088a9899b 79 void i2cslave::attach(void (*fptr)(void)) {
sgrsn 0:69b088a9899b 80 fp.attach(fptr);
sgrsn 0:69b088a9899b 81 enable_attach();
sgrsn 0:69b088a9899b 82 }
sgrsn 0:69b088a9899b 83
sgrsn 0:69b088a9899b 84 void i2cslave::func_call(uint32_t id, uint8_t addr, uint8_t state) {
sgrsn 0:69b088a9899b 85 instance->fp.call();
sgrsn 0:69b088a9899b 86 }
sgrsn 0:69b088a9899b 87
sgrsn 0:69b088a9899b 88 void i2cslave::enable_attach() {
sgrsn 0:69b088a9899b 89 instance = this;
sgrsn 1:cd92200b8a50 90 //NVIC_SetVector(I2C_IRQn, (uint32_t)(&i2cslave::func_call)); //lpc1114
sgrsn 1:cd92200b8a50 91 NVIC_SetVector(I2C2_IRQn, (uint32_t)(&i2cslave::func_call)); //lpc1768 (pin28, pin27)
sgrsn 1:cd92200b8a50 92 NVIC_EnableIRQ(I2C2_IRQn);
sgrsn 0:69b088a9899b 93 }
sgrsn 0:69b088a9899b 94
sgrsn 0:69b088a9899b 95 void i2cslave::disable_attach() {
sgrsn 1:cd92200b8a50 96 //NVIC_DisableIRQ(I2C_IRQn); //lp1114
sgrsn 1:cd92200b8a50 97 NVIC_DisableIRQ(I2C2_IRQn); //lpc1768 (pin28, pin27)
sgrsn 0:69b088a9899b 98 }
sgrsn 0:69b088a9899b 99
sgrsn 0:69b088a9899b 100 }
sgrsn 0:69b088a9899b 101
sgrsn 0:69b088a9899b 102 #endif