_RB_INLINE bool check_RX_done(int dev) { unsigned long nowtime; unsigned char statreg; for (nowtime=0; nowtime<100000L; nowtime++) //trick for speed; timer_nowtime() is time-consuming in some OS if (i2c_CheckRXRdy(dev) == true) goto RX_SUCCESS; nowtime = timer_nowtime(); while ((i2c_CheckRXRdy(dev) == false) && ((timer_nowtime() - nowtime) < I2C_TIMEOUT)); RX_SUCCESS: statreg = i2c_ReadStatREG(dev); //ugly code for speed:p i2c_ClearRXRdy(dev); if ((statreg & 0x08) != 0) //if (i2cmaster_CheckARLoss(dev) == true) { err_SetMsg(ERROR_I2CARLOSS, "arbitration loss for I2C bus"); i2cmaster_ClearARLoss(dev); return false; } if ((statreg & 0x01) == 0) //if (i2c_IsMaster(dev) == false) { err_SetMsg(ERROR_I2CFAIL, "I2C%d module isn't in Master Mode", dev); return false; } if ((statreg & 0x40) == 0) //if (i2c_CheckRXRdy(dev) == false) { err_SetMsg(ERROR_I2CFAIL, "I2C%d module doesn't respond", dev); return false; } return true; }
DMP_INLINE(bool) check_TX_done(int dev) { unsigned long nowtime; unsigned char statreg; for (nowtime=0; nowtime<100000L; nowtime++) //trick for speed; timer_NowTime() is time-consuming in some OS if (i2c_CheckTXDone(dev) == true) goto TX_SUCCESS; nowtime = timer_NowTime(); while ((i2c_CheckTXDone(dev) == false) && ((timer_NowTime() - nowtime) < I2C_TIMEOUT)); TX_SUCCESS: statreg = i2c_ReadStatREG(dev); //ugly code for speed:p i2c_ClearTXDone(dev); if ((statreg & 0x08) != 0) //if (i2cmaster_CheckARLoss(dev) == true) { err_print("arbitration loss for I2C bus"); i2cmaster_ClearARLoss(dev); } if ((statreg & 0x10) != 0) //if (i2cmaster_CheckAckErr(dev) == true) { err_print("receive no ACK after transmitting"); i2cmaster_ClearAckErr(dev); } if ((statreg & (0x10 + 0x08)) != 0) return false; if ((statreg & 0x01) == 0) //if (i2c_IsMaster(dev) == false) { err_print("I2C%d module isn't in Master Mode", dev); return false; } if ((statreg & 0x20) == 0) //if (i2c_CheckTXDone(dev) == false) { err_print("I2C%d module doesn't respond", dev); return false; } return true; }