//I2C function// uint8_t ucRxdata[2] = { }; UCB1I2CSA = ucSlaveAddress; // set Slave Address as 0x55 UCB1CTL1 &= ~UCSWRST; UCB1CTL1 |= UCTR | UCTXSTT; // I2C tx, start condition for (g_uloopcount = 0; g_uloopcount < LOOP_COUNT; g_uloopcount++) { if (((UCB1CTL1 & UCTXSTT) == 0) && (UCB1IFG & UCTXIFG)) // if ((UCB1IFG & UCTXIFG)) { break; } } if (g_uloopcount == LOOP_COUNT) { /* Stop the I2C transmission */ UCB1CTL1 |= UCTXSTP; //send previous value return prev_value; } /* Check for NACK/ACK - after start+address byte */ if (UCB1IFG & UCNACKIFG) { /* Stop the I2C transmission */ UCB1CTL1 |= UCTXSTP; /* Clear the interrupt flag */ UCB1IFG &= ~UCNACKIFG; //should reset MSP if Battery Percentage I2C is called first time and encounters I2C error if(one_time_flag == false) { one_time_flag = true; return BatteryFuelGuageI2CMasterReceive(ucSlaveAddress, ucCmd, ucDataLength, prev_value); } else { //send previous value return prev_value; } } UCB1TXBUF = ucCmd; // wait until cmd got sent for (g_uloopcount = 0; g_uloopcount < LOOP_COUNT; g_uloopcount++) { if (UCB1IFG & UCTXIFG) { break; } } if (g_uloopcount == LOOP_COUNT) { /* Stop the I2C transmission */ UCB1CTL1 |= UCTXSTP; //send previous value return prev_value; } UCB1CTL1 &= ~UCTR; UCB1CTL1 |= UCTXSTT; //wait till the start condition is cleared for (g_uloopcount = 0; g_uloopcount < LOOP_COUNT; g_uloopcount++) { if ((UCB1CTL1 & UCTXSTT) == 0) { break; } } if (g_uloopcount == LOOP_COUNT) { /* Stop the I2C transmission */ UCB1CTL1 |= UCTXSTP; //send previous value return prev_value; } /* Check for ACK */ if (UCB1IFG & UCNACKIFG) { /* Stop the I2C transmission */ UCB1CTL1 |= UCTXSTP; /* Clear the interrupt flag */ UCB1IFG &= ~UCNACKIFG; //should reset MSP if Battery Percentage I2C is called first time and encounters I2C error if (one_time_flag == false) { one_time_flag = true; return BatteryFuelGuageI2CMasterReceive(ucSlaveAddress, ucCmd, ucDataLength, prev_value); } else { //send previous value return prev_value; } } unsigned int uiCounter = 0; unsigned int uiRxCounter = 2; while (uiRxCounter > 0) { for (g_uloopcount = 0; g_uloopcount < LOOP_COUNT; g_uloopcount++) { if (UCB1IFG & UCRXIFG) { break; } } if (g_uloopcount == LOOP_COUNT) { /* Stop the I2C transmission */ UCB1CTL1 |= UCTXSTP; //send previous value return prev_value; } /* Check for ACK */ if (UCB1IFG & UCNACKIFG) { /* Stop the I2C transmission */ UCB1CTL1 |= UCTXSTP; /* Clear the interrupt flag */ UCB1IFG &= ~UCNACKIFG; if (one_time_flag == false) { one_time_flag = true; return BatteryFuelGuageI2CMasterReceive(ucSlaveAddress, ucCmd, ucDataLength, prev_value); } else { //send previous value return prev_value; } } ucRxdata[uiCounter] = UCB1RXBUF; // Receive data from fuel gauge if (uiCounter == 0) { //Send stop condition. UCB1CTL1 |= UCTXSTP; } uiCounter++; uiRxCounter--; } UCB1IFG &= ~UCRXIFG; /* Clear USCI_B1 TX int flag */ UCB1IFG &= ~UCTXIFG; g_uBatteryInfo = (uint16_t) ucRxdata[0] << 8 | ucRxdata[1]; //Transmit received data byte by byte return g_uBatteryInfo;