Skip to content

Commit 4028bdc

Browse files
committed
arduino#1476. Introduce timeout when checking twi_state variable.
1 parent 73158f9 commit 4028bdc

File tree

1 file changed

+29
-1
lines changed
  • hardware/arduino/avr/libraries/Wire/src/utility

1 file changed

+29
-1
lines changed

Diff for: hardware/arduino/avr/libraries/Wire/src/utility/twi.c

+29-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
#include <avr/io.h>
2626
#include <avr/interrupt.h>
2727
#include <compat/twi.h>
28-
#include "Arduino.h" // for digitalWrite
28+
#include "Arduino.h" // for digitalWrite and millis
2929

3030
#ifndef cbi
3131
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
@@ -155,7 +155,14 @@ uint8_t twi_readFrom(uint8_t address, uint8_t* data, uint8_t length, uint8_t sen
155155
}
156156

157157
// wait until twi is ready, become master receiver
158+
uint32_t startMillis = millis();
158159
while(TWI_READY != twi_state){
160+
if((twi_timeout_ms > 0) && (millis() - startMillis > twi_timeout_ms)) {
161+
//timeout
162+
twi_init();
163+
164+
return 0;
165+
}
159166
continue;
160167
}
161168
twi_state = TWI_MRX;
@@ -194,7 +201,14 @@ uint8_t twi_readFrom(uint8_t address, uint8_t* data, uint8_t length, uint8_t sen
194201
TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTA);
195202

196203
// wait for read operation to complete
204+
startMillis = millis();
197205
while(TWI_MRX == twi_state){
206+
if((twi_timeout_ms > 0) && (millis() - startMillis > twi_timeout_ms)) {
207+
//timeout
208+
twi_init();
209+
210+
return 0;
211+
}
198212
continue;
199213
}
200214

@@ -234,7 +248,14 @@ uint8_t twi_writeTo(uint8_t address, uint8_t* data, uint8_t length, uint8_t wait
234248
}
235249

236250
// wait until twi is ready, become master transmitter
251+
uint32_t startMillis = millis();
237252
while(TWI_READY != twi_state){
253+
if((twi_timeout_ms > 0) && (millis() - startMillis > twi_timeout_ms)) {
254+
//timeout
255+
twi_init();
256+
257+
return 4;
258+
}
238259
continue;
239260
}
240261
twi_state = TWI_MTX;
@@ -276,7 +297,14 @@ uint8_t twi_writeTo(uint8_t address, uint8_t* data, uint8_t length, uint8_t wait
276297
TWCR = _BV(TWINT) | _BV(TWEA) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA); // enable INTs
277298

278299
// wait for write operation to complete
300+
startMillis = millis();
279301
while(wait && (TWI_MTX == twi_state)){
302+
if((twi_timeout_ms > 0) && (millis() - startMillis > twi_timeout_ms)) {
303+
//timeout
304+
twi_init();
305+
306+
return 4;
307+
}
280308
continue;
281309
}
282310

0 commit comments

Comments
 (0)