diff --git a/source/i2c.c b/source/i2c.c index 3367034..848372c 100644 --- a/source/i2c.c +++ b/source/i2c.c @@ -25,6 +25,7 @@ */ #include "i2c.h" +#include "utils.h" //----------------------------------------------------------------------------- @@ -115,6 +116,31 @@ static bool i2cSelectRegister(u8 bus_id, u8 reg) //----------------------------------------------------------------------------- +u8 i2cReadRegister(u8 dev_id, u8 reg) +{ + u8 bus_id = i2cGetDeviceBusId(dev_id), + dev_addr = i2cGetDeviceRegAddr(dev_id); + + for(u32 i = 0; i < 8; i++) + { + if(i2cSelectDevice(bus_id, dev_addr) && i2cSelectRegister(bus_id, reg)) + { + if(i2cSelectDevice(bus_id, dev_addr | 1)) + { + i2cWaitBusy(bus_id); + i2cStop(bus_id, 1); + i2cWaitBusy(bus_id); + + return *i2cGetDataReg(bus_id); + } + } + *i2cGetCntReg(bus_id) = 0xC5; + i2cWaitBusy(bus_id); + } + + return 0xFF; +} + bool i2cWriteRegister(u8 dev_id, u8 reg, u8 data) { u8 bus_id = i2cGetDeviceBusId(dev_id), @@ -129,7 +155,16 @@ bool i2cWriteRegister(u8 dev_id, u8 reg, u8 data) *i2cGetCntReg(bus_id) = 0xC1; i2cStop(bus_id, 0); - if(i2cGetResult(bus_id)) return true; + if(i2cGetResult(bus_id)) + { + if(dev_id == I2C_DEV_MCU) + { + startChrono(); + while(chrono(true) < 2); + } + + return true; + } } *i2cGetCntReg(bus_id) = 0xC5; i2cWaitBusy(bus_id); diff --git a/source/i2c.h b/source/i2c.h index 0099d61..f00a301 100644 --- a/source/i2c.h +++ b/source/i2c.h @@ -41,4 +41,5 @@ #define I2C_DEV_GYRO 10 #define I2C_DEV_IR 13 +u8 i2cReadRegister(u8 dev_id, u8 reg); bool i2cWriteRegister(u8 dev_id, u8 reg, u8 data); \ No newline at end of file diff --git a/source/utils.c b/source/utils.c index 30fd1c4..60af492 100644 --- a/source/utils.c +++ b/source/utils.c @@ -50,6 +50,7 @@ u32 waitInput(bool isMenu) if(!key) { + if(i2cReadRegister(I2C_DEV_MCU, 0x10) == 1) mcuPowerOff(); oldKey = key; dPadDelay = 0; }