@@ -59,6 +59,8 @@ static volatile uint8_t twi_rxBufferIndex;
59
59
60
60
static volatile uint8_t twi_error ;
61
61
62
+ volatile uint32_t twi_iter_count ;
63
+
62
64
/*
63
65
* Function twi_init
64
66
* 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
122
124
}
123
125
124
126
// wait until twi is ready, become master receiver
125
- while (TWI_READY != twi_state ){
127
+ twi_timeout_guard (1 );
128
+ while ((TWI_READY != twi_state ) && !twi_timeout_guard (0 )){
126
129
continue ;
127
130
}
128
131
twi_state = TWI_MRX ;
@@ -159,7 +162,8 @@ uint8_t twi_readFrom(uint8_t address, uint8_t* data, uint8_t length, uint8_t sen
159
162
TWCR = _BV (TWEN ) | _BV (TWIE ) | _BV (TWEA ) | _BV (TWINT ) | _BV (TWSTA );
160
163
161
164
// wait for read operation to complete
162
- while (TWI_MRX == twi_state ){
165
+ twi_timeout_guard (1 );
166
+ while ((TWI_MRX == twi_state ) && !twi_timeout_guard (0 )){
163
167
continue ;
164
168
}
165
169
@@ -199,7 +203,8 @@ uint8_t twi_writeTo(uint8_t address, uint8_t* data, uint8_t length, uint8_t wait
199
203
}
200
204
201
205
// wait until twi is ready, become master transmitter
202
- while (TWI_READY != twi_state ){
206
+ twi_timeout_guard (1 );
207
+ while ((TWI_READY != twi_state ) && !twi_timeout_guard (0 )){
203
208
continue ;
204
209
}
205
210
twi_state = TWI_MTX ;
@@ -239,7 +244,8 @@ uint8_t twi_writeTo(uint8_t address, uint8_t* data, uint8_t length, uint8_t wait
239
244
TWCR = _BV (TWINT ) | _BV (TWEA ) | _BV (TWEN ) | _BV (TWIE ) | _BV (TWSTA ); // enable INTs
240
245
241
246
// wait for write operation to complete
242
- while (wait && (TWI_MTX == twi_state )){
247
+ twi_timeout_guard (1 );
248
+ while ((wait && (TWI_MTX == twi_state )) && !twi_timeout_guard (0 )){
243
249
continue ;
244
250
}
245
251
@@ -337,7 +343,8 @@ void twi_stop(void)
337
343
338
344
// wait for stop condition to be exectued on bus
339
345
// TWINT is not set after a stop condition!
340
- while (TWCR & _BV (TWSTO )){
346
+ twi_timeout_guard (1 );
347
+ while ((TWCR & _BV (TWSTO )) && !twi_timeout_guard (0 )){
341
348
continue ;
342
349
}
343
350
@@ -525,3 +532,20 @@ ISR(TWI_vect)
525
532
}
526
533
}
527
534
535
+ uint8_t twi_timeout_guard (uint8_t init )
536
+ {
537
+ if (init )
538
+ twi_iter_count = 0 ;
539
+ else
540
+ {
541
+ twi_iter_count ++ ;
542
+ if (twi_iter_count > TWI_MAX_ITERS )
543
+ {
544
+ twi_init ();
545
+ TWCR = 0 ;
546
+ return 1 ;
547
+ }
548
+ }
549
+ return 0 ;
550
+ }
551
+
0 commit comments