RBAPI(bool) i2cmaster_Start(int dev, unsigned char addr, unsigned char rwbit) { bool result = true; if (I2C_action[dev] != I2CACT_IDLE) { err_SetMsg(ERROR_I2CWRONGUSAGE, "can't start a transaction because I2C%d isn't idle", dev); return false; } I2C_rsInfo[dev].restart = false; if (I2C_swMode[dev] != I2CSW_DISABLE) result = i2csw_Start(dev, addr, rwbit, false); else { if (I2C_speedMode[dev] == I2CMODE_HIGHSPEED) result = i2cmaster_Start1(dev, 0x07, I2C_WRITE); //send high-speed master code if (result == true) result = i2cmaster_Start1(dev, addr, rwbit); } if (result == true) { I2C_action[dev] = (rwbit == I2C_WRITE)? I2CACT_MASTERWRITE : I2CACT_MASTERREAD; I2C_curAddr[dev] = addr; } return result; }
RBAPI(bool) i2cmaster_Start(int dev, unsigned char addr, unsigned char rwbit) { if (I2C_action[dev] != I2CACT_IDLE) { err_SetMsg(ERROR_I2CWRONGUSAGE, "can't start a transaction because I2C%d isn't idle", dev); return false; } I2C_rsInfo[dev].restart = false; if (I2C_speedMode[dev] == I2CMODE_HIGHSPEED) //&& if (i2cmaster_Start1(dev, 0x07, I2C_WRITE) == false) //send high-speed code return false; return i2cmaster_Start1(dev, addr, rwbit); }
RBAPI(bool) i2cmaster_WriteLast(int dev, unsigned char val) { bool result = true; if (i2cmaster_Write(dev, val) == false) return false; else I2C_action[dev] = I2CACT_IDLE; // case of I2C RESTART after write if (I2C_rsInfo[dev].restart == true) { I2C_rsInfo[dev].restart = false; if (I2C_swMode[dev] != I2CSW_DISABLE) result = i2csw_Start(dev, I2C_rsInfo[dev].addr, I2C_rsInfo[dev].rwbit, true); else result = i2cmaster_Start1(dev, I2C_rsInfo[dev].addr, I2C_rsInfo[dev].rwbit); if (result == true) { I2C_action[dev] = (I2C_rsInfo[dev].rwbit == I2C_WRITE)? I2CACT_MASTERWRITE : I2CACT_MASTERREAD; I2C_count[dev] = I2C_rsInfo[dev].count; } return result; } // case of I2C STOP after write if (I2C_swMode[dev] != I2CSW_DISABLE) i2csw_Stop(dev); else { i2cmaster_SetStopBit(dev); result = check_STOP_done(dev); } return result; }
RBAPI(bool) i2cmaster_WriteLast(int dev, unsigned char val) { if (i2cmaster_Write(dev, val) == false) return false; else I2C_action[dev] = I2CACT_IDLE; if (I2C_rsInfo[dev].restart == true) { I2C_rsInfo[dev].restart = false; if (i2cmaster_Start1(dev, I2C_rsInfo[dev].addr, I2C_rsInfo[dev].rwbit) == false) return false; I2C_count = I2C_rsInfo[dev].count; return true; } i2cmaster_SetStopBit(dev); return check_STOP_done(dev); }