Skip to content

Commit 8b37c06

Browse files
committed
1 parent 2663be1 commit 8b37c06

File tree

4 files changed

+56
-1
lines changed

4 files changed

+56
-1
lines changed

Diff for: libraries/Wire/src/Wire.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,11 @@ void TwoWire::setClock(uint32_t clock)
8686
twi_setFrequency(clock);
8787
}
8888

89+
void TwoWire::setTimeoutInMillis(uint8_t timeout)
90+
{
91+
twi_setTimeoutInMillis(timeout);
92+
}
93+
8994
uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity, uint32_t iaddress, uint8_t isize, uint8_t sendStop)
9095
{
9196
if (isize > 0) {

Diff for: libraries/Wire/src/Wire.h

+1
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ class TwoWire : public Stream
5454
void begin(int);
5555
void end();
5656
void setClock(uint32_t);
57+
void setTimeoutInMillis(uint8_t);
5758
void beginTransmission(uint8_t);
5859
void beginTransmission(int);
5960
uint8_t endTransmission(void);

Diff for: libraries/Wire/src/utility/twi.c

+49-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))
@@ -42,6 +42,7 @@ static volatile uint8_t twi_state;
4242
static volatile uint8_t twi_slarw;
4343
static volatile uint8_t twi_sendStop; // should the transaction end with a stop
4444
static volatile uint8_t twi_inRepStart; // in the middle of a repeated start
45+
static volatile uint8_t twi_timeout_ms = 0;
4546

4647
static void (*twi_onSlaveTransmit)(void);
4748
static void (*twi_onSlaveReceive)(uint8_t*, int);
@@ -154,7 +155,15 @@ uint8_t twi_readFrom(uint8_t address, uint8_t* data, uint8_t length, uint8_t sen
154155
}
155156

156157
// wait until twi is ready, become master receiver
158+
uint32_t startMillis = millis();
157159
while(TWI_READY != twi_state){
160+
if((twi_timeout_ms > 0) && (millis() - startMillis > twi_timeout_ms)) {
161+
//timeout
162+
twi_disable();
163+
twi_init();
164+
165+
return 0;
166+
}
158167
continue;
159168
}
160169
twi_state = TWI_MRX;
@@ -193,7 +202,15 @@ uint8_t twi_readFrom(uint8_t address, uint8_t* data, uint8_t length, uint8_t sen
193202
TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTA);
194203

195204
// wait for read operation to complete
205+
startMillis = millis();
196206
while(TWI_MRX == twi_state){
207+
if((twi_timeout_ms > 0) && (millis() - startMillis > twi_timeout_ms)) {
208+
//timeout
209+
twi_disable();
210+
twi_init();
211+
212+
return 0;
213+
}
197214
continue;
198215
}
199216

@@ -233,7 +250,15 @@ uint8_t twi_writeTo(uint8_t address, uint8_t* data, uint8_t length, uint8_t wait
233250
}
234251

235252
// wait until twi is ready, become master transmitter
253+
uint32_t startMillis = millis();
236254
while(TWI_READY != twi_state){
255+
if((twi_timeout_ms > 0) && (millis() - startMillis > twi_timeout_ms)) {
256+
//timeout
257+
twi_disable();
258+
twi_init();
259+
260+
return 4;
261+
}
237262
continue;
238263
}
239264
twi_state = TWI_MTX;
@@ -275,7 +300,15 @@ uint8_t twi_writeTo(uint8_t address, uint8_t* data, uint8_t length, uint8_t wait
275300
TWCR = _BV(TWINT) | _BV(TWEA) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA); // enable INTs
276301

277302
// wait for write operation to complete
303+
startMillis = millis();
278304
while(wait && (TWI_MTX == twi_state)){
305+
if((twi_timeout_ms > 0) && (millis() - startMillis > twi_timeout_ms)) {
306+
//timeout
307+
twi_disable();
308+
twi_init();
309+
310+
return 4;
311+
}
279312
continue;
280313
}
281314

@@ -373,7 +406,17 @@ void twi_stop(void)
373406

374407
// wait for stop condition to be exectued on bus
375408
// TWINT is not set after a stop condition!
409+
uint32_t counter = 0;
376410
while(TWCR & _BV(TWSTO)){
411+
counter++;
412+
if((twi_timeout_ms > 0) && (counter >= 25000)) {
413+
// timeout
414+
twi_disable();
415+
twi_init();
416+
417+
return;
418+
}
419+
377420
continue;
378421
}
379422

@@ -396,6 +439,11 @@ void twi_releaseBus(void)
396439
twi_state = TWI_READY;
397440
}
398441

442+
void twi_setTimeoutInMillis(uint8_t timeout)
443+
{
444+
twi_timeout_ms = timeout;
445+
}
446+
399447
ISR(TWI_vect)
400448
{
401449
switch(TW_STATUS){

Diff for: libraries/Wire/src/utility/twi.h

+1
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
void twi_reply(uint8_t);
5151
void twi_stop(void);
5252
void twi_releaseBus(void);
53+
void twi_setTimeoutInMillis(uint8_t);
5354

5455
#endif
5556

0 commit comments

Comments
 (0)