From 5e0fd7741125d4c933127ecf31d0a98a930e121c Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Sat, 1 Feb 2014 21:29:44 +0000 Subject: [PATCH 1/2] Added TWI max iteration timeout to while loops --- libraries/Wire/utility/twi.c | 34 +++++++++++++++++++++++++++++----- libraries/Wire/utility/twi.h | 3 +++ 2 files changed, 32 insertions(+), 5 deletions(-) mode change 100755 => 100644 libraries/Wire/utility/twi.h diff --git a/libraries/Wire/utility/twi.c b/libraries/Wire/utility/twi.c index 201d7d1bbbf..a16829213a5 100644 --- a/libraries/Wire/utility/twi.c +++ b/libraries/Wire/utility/twi.c @@ -59,6 +59,8 @@ static volatile uint8_t twi_rxBufferIndex; static volatile uint8_t twi_error; +volatile uint32_t twi_tog_count; + /* * Function twi_init * Desc readys twi pins and sets twi bitrate @@ -122,7 +124,8 @@ uint8_t twi_readFrom(uint8_t address, uint8_t* data, uint8_t length, uint8_t sen } // wait until twi is ready, become master receiver - while(TWI_READY != twi_state){ + twi_timeout_guard(1); + while((TWI_READY != twi_state) && !twi_timeout_guard(0)){ continue; } twi_state = TWI_MRX; @@ -159,7 +162,8 @@ uint8_t twi_readFrom(uint8_t address, uint8_t* data, uint8_t length, uint8_t sen TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTA); // wait for read operation to complete - while(TWI_MRX == twi_state){ + twi_timeout_guard(1); + while((TWI_MRX == twi_state) && !twi_timeout_guard(0)){ continue; } @@ -199,7 +203,8 @@ uint8_t twi_writeTo(uint8_t address, uint8_t* data, uint8_t length, uint8_t wait } // wait until twi is ready, become master transmitter - while(TWI_READY != twi_state){ + twi_timeout_guard(1); + while((TWI_READY != twi_state) && !twi_timeout_guard(0)){ continue; } twi_state = TWI_MTX; @@ -239,7 +244,8 @@ uint8_t twi_writeTo(uint8_t address, uint8_t* data, uint8_t length, uint8_t wait TWCR = _BV(TWINT) | _BV(TWEA) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA); // enable INTs // wait for write operation to complete - while(wait && (TWI_MTX == twi_state)){ + twi_timeout_guard(1); + while((wait && (TWI_MTX == twi_state)) && !twi_timeout_guard(0)){ continue; } @@ -337,7 +343,8 @@ void twi_stop(void) // wait for stop condition to be exectued on bus // TWINT is not set after a stop condition! - while(TWCR & _BV(TWSTO)){ + twi_timeout_guard(1); + while((TWCR & _BV(TWSTO)) && !twi_timeout_guard(0)){ continue; } @@ -525,3 +532,20 @@ ISR(TWI_vect) } } +uint8_t twi_timeout_guard(uint8_t init) +{ + if(init) + twi_tog_count = 0; + else + { + twi_tog_count++; + if(twi_tog_count > TWI_MAX_ITERS) + { + twi_init(); + TWCR = 0; + return 1; + } + } + return 0; +} + diff --git a/libraries/Wire/utility/twi.h b/libraries/Wire/utility/twi.h old mode 100755 new mode 100644 index 6526593394e..8b8699ffbf1 --- a/libraries/Wire/utility/twi.h +++ b/libraries/Wire/utility/twi.h @@ -37,6 +37,8 @@ #define TWI_MTX 2 #define TWI_SRX 3 #define TWI_STX 4 + + #define TWI_MAX_ITERS 100000UL void twi_init(void); void twi_setAddress(uint8_t); @@ -48,6 +50,7 @@ void twi_reply(uint8_t); void twi_stop(void); void twi_releaseBus(void); + uint8_t twi_timeout_guard(uint8_t); #endif From 6169a08763e6f00d0f17293ac60aacbf3061f3d6 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Sat, 1 Feb 2014 21:33:06 +0000 Subject: [PATCH 2/2] Refactoring --- libraries/Wire/utility/twi.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/Wire/utility/twi.c b/libraries/Wire/utility/twi.c index a16829213a5..94e2df191f4 100644 --- a/libraries/Wire/utility/twi.c +++ b/libraries/Wire/utility/twi.c @@ -59,7 +59,7 @@ static volatile uint8_t twi_rxBufferIndex; static volatile uint8_t twi_error; -volatile uint32_t twi_tog_count; +volatile uint32_t twi_iter_count; /* * Function twi_init @@ -535,11 +535,11 @@ ISR(TWI_vect) uint8_t twi_timeout_guard(uint8_t init) { if(init) - twi_tog_count = 0; + twi_iter_count = 0; else { - twi_tog_count++; - if(twi_tog_count > TWI_MAX_ITERS) + twi_iter_count++; + if(twi_iter_count > TWI_MAX_ITERS) { twi_init(); TWCR = 0;