Index: RTC.c =================================================================== diff -u -r1fefd39b8a84c561aae2e4f95149661452f238c9 -re5968292e753478c4d28d6db94d3772c36a1c33b --- RTC.c (.../RTC.c) (revision 1fefd39b8a84c561aae2e4f95149661452f238c9) +++ RTC.c (.../RTC.c) (revision e5968292e753478c4d28d6db94d3772c36a1c33b) @@ -232,6 +232,7 @@ // ********** Private function prototypes ********* static BOOL serviceRTC( U16* bufferTransmit, U16* bufferReceive, U16 bufferLength ); +static void logSPIFailure( void ); static BOOL isRTCFunctional( void ); static U08 convertBCD2Decimal( U08 bcd ); static U08 convertDecimal2BCD( U08 decimal ); @@ -750,11 +751,17 @@ previousTransferLength = bufferLength; RTCServiceState = RTC_WAIT_FOR_TRANSFER_AND_READ; } - else + else if ( numberOfFailedRTCTransfers >= MAX_ALLOWED_FAILED_RTC_TRANSFERS ) { + logSPIFailure(); RTCServiceState = RTC_SERVICE_COMPLETE; } - isRTCServiceOnEntry = FALSE; + else + { + numberOfFailedRTCTransfers++; + logSPIFailure(); + } + //wjbisRTCServiceOnEntry = FALSE; break; case RTC_WAIT_FOR_TRANSFER_AND_READ: @@ -767,16 +774,15 @@ } else if ( numberOfFailedRTCTransfers >= MAX_ALLOWED_FAILED_RTC_TRANSFERS ) { + logSPIFailure(); RTCServiceState = RTC_SERVICE_COMPLETE; numberOfFailedRTCTransfers = 0; } else { // Transfer to RTC failed. This transfer should be done in 50ms numberOfFailedRTCTransfers++; - memset( debugEventBuffer, 0x00, sizeof(debugEventBuffer) ); - snprintf( debugEventBuffer, sizeof( debugEventBuffer ), "$RTC SPI: %d, %d", RTCServiceState, numberOfFailedRTCTransfers ); - broadcastData( DEBUG_EVENT_MSG_ID, COMM_BUFFER_OUT_CAN_BROADCAST, debugEventBuffer, sizeof( debugEventBuffer ) ); + logSPIFailure( ); } // Done with read (successful or failed) // get ready for another call @@ -798,6 +804,21 @@ /*********************************************************************//** * @brief + * The logSPIFailur logs an occurrence of an SPI failure. + * @details Inputs: none + * @details Outputs: debugEventBuffer, RTCServiceState, + * numberOfFaileRTCTransfers + * @return None + *************************************************************************/ +static void logSPIFailure( void ) +{ + memset( debugEventBuffer, 0x00, sizeof(debugEventBuffer) ); + snprintf( debugEventBuffer, sizeof( debugEventBuffer ), "$RTC SPI: %d, %d", RTCServiceState, numberOfFailedRTCTransfers ); + broadcastData( DEBUG_EVENT_MSG_ID, COMM_BUFFER_OUT_CAN_BROADCAST, debugEventBuffer, sizeof( debugEventBuffer ) ); +} + +/*********************************************************************//** + * @brief * The isRTCFunctional checks whether the RTC is still functional by checking * the bits in the first 3 control registers. The function ignore the clear * flags. @@ -1225,7 +1246,7 @@ SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_NVDATA_RTC_RAM_OPS_FAILURE, result ) #endif #ifdef _HD_ - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_NVDATA_RTC_RAM_OPS_FAILURE, result ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_NVDATA_RTC_RAM_OPS_FAILURE, result ) #endif result = RTC_EXEC_STATE_IDLE; hasWriteToRTCRequested = FALSE; @@ -1265,7 +1286,7 @@ SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_NVDATA_RTC_RAM_OPS_FAILURE, result ) #endif #ifdef _HD_ - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_NVDATA_RTC_RAM_OPS_FAILURE, result ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_NVDATA_RTC_RAM_OPS_FAILURE, result ) #endif result = RTC_EXEC_STATE_IDLE; } @@ -1344,7 +1365,7 @@ SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_NVDATA_RTC_RAM_OPS_FAILURE, result ) #endif #ifdef _HD_ - SET_ALARM_WITH_2_U32_DATA( ALARM_ID_DG_SOFTWARE_FAULT, SW_FAULT_ID_NVDATA_RTC_RAM_OPS_FAILURE, result ) + SET_ALARM_WITH_2_U32_DATA( ALARM_ID_HD_SOFTWARE_FAULT, SW_FAULT_ID_NVDATA_RTC_RAM_OPS_FAILURE, result ) #endif result = RTC_EXEC_STATE_IDLE; hasReadFromRAMRequested = FALSE;