i2c slave class to RaspberryPi with interrupt

Fork of i2cslave by hidaka sato

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?

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 #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