Index: firmware/App/Drivers/Battery.c =================================================================== diff -u -r569bc4e8119455be23c9d57353243e4479f4afcd -re010519fe8f7bdfcf518544d480baa15424a70a7 --- firmware/App/Drivers/Battery.c (.../Battery.c) (revision 569bc4e8119455be23c9d57353243e4479f4afcd) +++ firmware/App/Drivers/Battery.c (.../Battery.c) (revision e010519fe8f7bdfcf518544d480baa15424a70a7) @@ -30,12 +30,14 @@ #define BATTERY_SLAVE_ADDRESS 0x9 ///< Battery charger controller device address. #define BATTERY_STATUS_CMD 0x13 ///< Command to get battery status. #define BATTERY_STATUS_AC_PRESENT_MASK 0x8000 ///< Battery status AC present bit mask. +#define BATTERY_COMM_TIME_OUT_MS 25 ///< Battery communication time out in ms. #define BATTERY_MONITOR_INTERVAL_MS MS_PER_SECOND ///< Battery monitor interval in ms. // ********** private data ********** static U16 batteryStatus = 0; ///< Battery current status. -static U32 lastBatteryMonitorTime = 0; ///< Previous battery monitor time. +static U32 lastBatteryMonitorTime = 0; ///< Previous battery monitor time. +static BOOL isBatteryCommTimeOut = FALSE; ///< Flag indicates battery communication time out. // ********** private function prototypes ********** @@ -67,8 +69,19 @@ if ( TRUE == didTimeout( lastBatteryMonitorTime, BATTERY_MONITOR_INTERVAL_MS ) ) { lastBatteryMonitorTime = getMSTimerCount(); - getBatteryStatus(); + if ( FALSE == isBatteryCommTimeOut ) + { + getBatteryStatus(); + } + else + { + isBatteryCommTimeOut = FALSE; + + // Reset i2c bus if comm timeout + setupI2CDriver(); + } + if ( ( batteryStatus & BATTERY_STATUS_AC_PRESENT_MASK ) == 0 ) { SET_ALARM_WITH_1_U32_DATA( ALARM_ID_HD_AC_POWER_LOST, (U32)batteryStatus ); @@ -105,19 +118,28 @@ *************************************************************************/ static void getBatteryStatus( void ) { + U32 const startCommTime = getMSTimerCount(); + if ( FALSE == i2cIsBusBusy( i2cREG1 ) ) { i2cSetMode( i2cREG1, I2C_MASTER ); i2cSetDirection( i2cREG1, I2C_TRANSMITTER ); i2cSetStart( i2cREG1 ); i2cSendByte( i2cREG1, BATTERY_STATUS_CMD ); - while ( 0 == i2cIsTxReady( i2cREG1 ) ) {} - i2cSetDirection( i2cREG1, I2C_RECEIVER ); - i2cSetStart( i2cREG1 ); - batteryStatus = i2cReceiveByte( i2cREG1); - i2cSetStop( i2cREG1 ); - batteryStatus = ( batteryStatus | ( i2cReceiveByte( i2cREG1) << 8 ) ); + while ( ( 0 == i2cIsTxReady( i2cREG1 ) ) || ( TRUE == isBatteryCommTimeOut ) ) + { + isBatteryCommTimeOut = didTimeout( startCommTime, BATTERY_COMM_TIME_OUT_MS ); + } + + if ( FALSE == isBatteryCommTimeOut ) + { + i2cSetDirection( i2cREG1, I2C_RECEIVER ); + i2cSetStart( i2cREG1 ); + batteryStatus = i2cReceiveByte( i2cREG1); + i2cSetStop( i2cREG1 ); + batteryStatus = ( batteryStatus | ( i2cReceiveByte( i2cREG1) << 8 ) ); + } } }