Other Parts Discussed in Thread: TPS65381-Q1
Is there example code to calculate the answer-bytes for the Q&A watchdog in the device or should a look up table be used?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
Is there example code to calculate the answer-bytes for the Q&A watchdog in the device or should a look up table be used?
To improve fault coverage of a microcontroller unit (MCU), an independent watchdog may be used to monitor the MCU. One type of watchdog is a question and answer (Q&A) watchdog, and is used in some devices like TPS65381A-Q1.
The Q&A watchdog issues a question each watchdog sequence, and expects 4 answer bytes in the proper order and with the proper value. These questions are to test the MCU’s logic operation and provide higher diagnostic coverage of the MCU than a window watchdog. The MCU should calculate the answer bytes based on the question and answer count instead of using a look up table to maximize the diagnostic coverage. The following code provides an example of how to calculate the proper answer-bytes for the TPS65381A-Q1.
// question is the current value in WD_QUESTION register (WD_TOKEN_VALUE register in TPS65381-Q1)
// answerCount is the current value in WD_ANSW_CNT register
uint8_t calculateAnswer(uint8_t question, uint8_t answerCount) {
// answer0 is bit 0 of the answer byte, answer1 is bit 1 of the answer byte, etc.
uint8_t answer0 = (question & 1) ^ ((answerCount & 2) >> 1) ^ ((question & 8) >> 3);
uint8_t answer1 = (question & 1) ^ ((question & 4) >> 2) ^ ((question & 2) >> 1) ^ ((answerCount & 2) >> 1);
uint8_t answer2 = (question & 1) ^ ((question & 8) >> 3) ^ ((question & 2) >> 1) ^ ((answerCount & 2) >> 1);
uint8_t answer3 = ((question & 4) >> 2) ^ (question & 1) ^ ((question & 8) >> 3) ^ ((answerCount & 2) >> 1);
uint8_t answer4 = ((question & 2) >> 1) ^ (answerCount & 1);
uint8_t answer5 = ((question & 8) >> 3) ^ (answerCount & 1);
uint8_t answer6 = (question & 1) ^ (answerCount & 1);
uint8_t answer7 = ((question & 4) >> 2) ^ (answerCount & 1);
return answer0 | (answer1 << 1) | (answer2 << 2) | (answer3 << 3) | (answer4 << 4) | (answer5 << 5) | (answer6 << 6) | (answer7 << 7);
}