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@3:6e9ecf7b83e3, 2019-12-17 (annotated)
- Committer:
- sgrsn
- Date:
- Tue Dec 17 07:16:20 2019 +0000
- Revision:
- 3:6e9ecf7b83e3
- Parent:
- 2:0dff052266ca
Fix anything
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 | 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 | 3:6e9ecf7b83e3 | 90 | NVIC_SetVector(I2C_IRQn, (uint32_t)(&i2cslave::func_call)); //lpc1114 |
sgrsn | 3:6e9ecf7b83e3 | 91 | //NVIC_SetVector(I2C2_IRQn, (uint32_t)(&i2cslave::func_call)); //lpc1768 (pin28, pin27) |
sgrsn | 3:6e9ecf7b83e3 | 92 | NVIC_EnableIRQ(I2C_IRQn); |
sgrsn | 0:69b088a9899b | 93 | } |
sgrsn | 0:69b088a9899b | 94 | |
sgrsn | 0:69b088a9899b | 95 | void i2cslave::disable_attach() { |
sgrsn | 3:6e9ecf7b83e3 | 96 | NVIC_DisableIRQ(I2C_IRQn); //lp1114 |
sgrsn | 3:6e9ecf7b83e3 | 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 |