i2c slave class to RaspberryPi with interrupt
Fork of i2cslave by
i2cslave.cpp@3:5d19d3a231b3, 2018-07-15 (annotated)
- Committer:
- sgrsn
- Date:
- Sun Jul 15 14:20:26 2018 +0000
- Revision:
- 3:5d19d3a231b3
- Parent:
- 2:0dff052266ca
i2c slave class to RaspberryPi with interrupt
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 | #include "mbed.h" |
sgrsn | 2:0dff052266ca | 5 | #include "i2cslave.h" |
sgrsn | 2:0dff052266ca | 6 | |
sgrsn | 3:5d19d3a231b3 | 7 | #define ADDR 0x1D |
sgrsn | 3:5d19d3a231b3 | 8 | #define _ADDR ADDR<<1 //on raspi |
sgrsn | 3:5d19d3a231b3 | 9 | |
sgrsn | 3:5d19d3a231b3 | 10 | union U{ |
sgrsn | 3:5d19d3a231b3 | 11 | int8_t _Registar[0x40]; |
sgrsn | 3:5d19d3a231b3 | 12 | int32_t Registar[0x10]; |
sgrsn | 3:5d19d3a231b3 | 13 | }; |
sgrsn | 3:5d19d3a231b3 | 14 | union U u = { 0 }; |
sgrsn | 3:5d19d3a231b3 | 15 | i2cslave slave(p28, p27, u._Registar); |
sgrsn | 3:5d19d3a231b3 | 16 | Serial PC(USBTX, USBRX); |
sgrsn | 3:5d19d3a231b3 | 17 | |
sgrsn | 2:0dff052266ca | 18 | int main() |
sgrsn | 2:0dff052266ca | 19 | { |
sgrsn | 3:5d19d3a231b3 | 20 | slave.address(_ADDR); |
sgrsn | 3:5d19d3a231b3 | 21 | while(1){ |
sgrsn | 3:5d19d3a231b3 | 22 | PC.printf("%d, %d\r\n", u.Registar[0], u.Registar[1]); |
sgrsn | 3:5d19d3a231b3 | 23 | wait_ms(100); |
sgrsn | 2:0dff052266ca | 24 | } |
sgrsn | 2:0dff052266ca | 25 | } |
sgrsn | 2:0dff052266ca | 26 | **********************************************************/ |
sgrsn | 2:0dff052266ca | 27 | |
sgrsn | 0:69b088a9899b | 28 | #if DEVICE_I2CSLAVE |
sgrsn | 0:69b088a9899b | 29 | |
sgrsn | 0:69b088a9899b | 30 | namespace mbed { |
sgrsn | 0:69b088a9899b | 31 | |
sgrsn | 0:69b088a9899b | 32 | i2cslave* instance; |
sgrsn | 0:69b088a9899b | 33 | |
sgrsn | 3:5d19d3a231b3 | 34 | i2cslave::i2cslave(PinName sda, PinName scl, int8_t *_Registar) : I2CSlave(sda, scl) |
sgrsn | 0:69b088a9899b | 35 | { |
sgrsn | 0:69b088a9899b | 36 | frequency(400000); |
sgrsn | 0:69b088a9899b | 37 | i2cslave::attach(this, &i2cslave::getdata); |
sgrsn | 0:69b088a9899b | 38 | Registar = _Registar; |
sgrsn | 0:69b088a9899b | 39 | } |
sgrsn | 0:69b088a9899b | 40 | |
sgrsn | 0:69b088a9899b | 41 | void i2cslave::getdata( void ) |
sgrsn | 0:69b088a9899b | 42 | { |
sgrsn | 0:69b088a9899b | 43 | if(I2CSlave::receive()==I2CSlave::WriteAddressed) |
sgrsn | 0:69b088a9899b | 44 | { |
sgrsn | 3:5d19d3a231b3 | 45 | char DATA[3] = {}; |
sgrsn | 3:5d19d3a231b3 | 46 | I2CSlave::read(DATA, 3); |
sgrsn | 0:69b088a9899b | 47 | char reg=DATA[0]; |
sgrsn | 3:5d19d3a231b3 | 48 | char size =DATA[1]; |
sgrsn | 3:5d19d3a231b3 | 49 | char cmd = DATA[2]; |
sgrsn | 3:5d19d3a231b3 | 50 | char X[size]; |
sgrsn | 3:5d19d3a231b3 | 51 | for(int i = 0; i < size; i++)X[i] = 0; |
sgrsn | 3:5d19d3a231b3 | 52 | int8_t tmp = 0; |
sgrsn | 3:5d19d3a231b3 | 53 | //wait_us(50); //to mbed devices |
sgrsn | 3:5d19d3a231b3 | 54 | wait_us(500); //to RaspberryPi |
sgrsn | 3:5d19d3a231b3 | 55 | switch(cmd) |
sgrsn | 0:69b088a9899b | 56 | { |
sgrsn | 3:5d19d3a231b3 | 57 | case ReadRequired: |
sgrsn | 3:5d19d3a231b3 | 58 | I2CSlave::read(X, size); |
sgrsn | 3:5d19d3a231b3 | 59 | for(int i = 0; i < size; i++) |
sgrsn | 2:0dff052266ca | 60 | { |
sgrsn | 3:5d19d3a231b3 | 61 | *(Registar+reg*4+i) = X[i]; |
sgrsn | 2:0dff052266ca | 62 | } |
sgrsn | 0:69b088a9899b | 63 | break; |
sgrsn | 3:5d19d3a231b3 | 64 | |
sgrsn | 3:5d19d3a231b3 | 65 | case WriteRequired: |
sgrsn | 3:5d19d3a231b3 | 66 | I2CSlave::read(DATA, 1); //捨て受信 |
sgrsn | 3:5d19d3a231b3 | 67 | |
sgrsn | 3:5d19d3a231b3 | 68 | int8_t tmp = *(Registar+reg); |
sgrsn | 3:5d19d3a231b3 | 69 | I2CSlave::write(tmp); |
sgrsn | 3:5d19d3a231b3 | 70 | I2CSlave::write(tmp); |
sgrsn | 3:5d19d3a231b3 | 71 | I2CSlave::write(tmp); |
sgrsn | 0:69b088a9899b | 72 | break; |
sgrsn | 0:69b088a9899b | 73 | } |
sgrsn | 0:69b088a9899b | 74 | } |
sgrsn | 0:69b088a9899b | 75 | } |
sgrsn | 0:69b088a9899b | 76 | void i2cslave::attach(void (*fptr)(void)) { |
sgrsn | 0:69b088a9899b | 77 | fp.attach(fptr); |
sgrsn | 0:69b088a9899b | 78 | enable_attach(); |
sgrsn | 0:69b088a9899b | 79 | } |
sgrsn | 0:69b088a9899b | 80 | |
sgrsn | 0:69b088a9899b | 81 | void i2cslave::func_call(uint32_t id, uint8_t addr, uint8_t state) { |
sgrsn | 0:69b088a9899b | 82 | instance->fp.call(); |
sgrsn | 0:69b088a9899b | 83 | } |
sgrsn | 0:69b088a9899b | 84 | |
sgrsn | 0:69b088a9899b | 85 | void i2cslave::enable_attach() { |
sgrsn | 0:69b088a9899b | 86 | instance = this; |
sgrsn | 1:cd92200b8a50 | 87 | //NVIC_SetVector(I2C_IRQn, (uint32_t)(&i2cslave::func_call)); //lpc1114 |
sgrsn | 1:cd92200b8a50 | 88 | NVIC_SetVector(I2C2_IRQn, (uint32_t)(&i2cslave::func_call)); //lpc1768 (pin28, pin27) |
sgrsn | 1:cd92200b8a50 | 89 | NVIC_EnableIRQ(I2C2_IRQn); |
sgrsn | 0:69b088a9899b | 90 | } |
sgrsn | 0:69b088a9899b | 91 | |
sgrsn | 0:69b088a9899b | 92 | void i2cslave::disable_attach() { |
sgrsn | 1:cd92200b8a50 | 93 | //NVIC_DisableIRQ(I2C_IRQn); //lp1114 |
sgrsn | 1:cd92200b8a50 | 94 | NVIC_DisableIRQ(I2C2_IRQn); //lpc1768 (pin28, pin27) |
sgrsn | 0:69b088a9899b | 95 | } |
sgrsn | 0:69b088a9899b | 96 | |
sgrsn | 0:69b088a9899b | 97 | } |
sgrsn | 0:69b088a9899b | 98 | |
sgrsn | 0:69b088a9899b | 99 | #endif |