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@0:69b088a9899b, 2016-04-16 (annotated)
- 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?
User | Revision | Line number | New 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 |