Skip to content

Commit

Permalink
arduino#42 Integrate solution from my https://github.com/wmarkow/Ardu…
Browse files Browse the repository at this point in the history
  • Loading branch information
wmarkow committed Sep 17, 2018
1 parent 2663be1 commit 8b37c06
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 1 deletion.
5 changes: 5 additions & 0 deletions libraries/Wire/src/Wire.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,11 @@ void TwoWire::setClock(uint32_t clock)
twi_setFrequency(clock);
}

void TwoWire::setTimeoutInMillis(uint8_t timeout)
{
twi_setTimeoutInMillis(timeout);
}

uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity, uint32_t iaddress, uint8_t isize, uint8_t sendStop)
{
if (isize > 0) {
Expand Down
1 change: 1 addition & 0 deletions libraries/Wire/src/Wire.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ class TwoWire : public Stream
void begin(int);
void end();
void setClock(uint32_t);
void setTimeoutInMillis(uint8_t);
void beginTransmission(uint8_t);
void beginTransmission(int);
uint8_t endTransmission(void);
Expand Down
50 changes: 49 additions & 1 deletion libraries/Wire/src/utility/twi.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
#include <avr/io.h>
#include <avr/interrupt.h>
#include <compat/twi.h>
#include "Arduino.h" // for digitalWrite
#include "Arduino.h" // for digitalWrite and millis

#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
Expand All @@ -42,6 +42,7 @@ static volatile uint8_t twi_state;
static volatile uint8_t twi_slarw;
static volatile uint8_t twi_sendStop; // should the transaction end with a stop
static volatile uint8_t twi_inRepStart; // in the middle of a repeated start
static volatile uint8_t twi_timeout_ms = 0;

static void (*twi_onSlaveTransmit)(void);
static void (*twi_onSlaveReceive)(uint8_t*, int);
Expand Down Expand Up @@ -154,7 +155,15 @@ uint8_t twi_readFrom(uint8_t address, uint8_t* data, uint8_t length, uint8_t sen
}

// wait until twi is ready, become master receiver
uint32_t startMillis = millis();
while(TWI_READY != twi_state){
if((twi_timeout_ms > 0) && (millis() - startMillis > twi_timeout_ms)) {
//timeout
twi_disable();
twi_init();

return 0;
}
continue;
}
twi_state = TWI_MRX;
Expand Down Expand Up @@ -193,7 +202,15 @@ 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
startMillis = millis();
while(TWI_MRX == twi_state){
if((twi_timeout_ms > 0) && (millis() - startMillis > twi_timeout_ms)) {
//timeout
twi_disable();
twi_init();

return 0;
}
continue;
}

Expand Down Expand Up @@ -233,7 +250,15 @@ uint8_t twi_writeTo(uint8_t address, uint8_t* data, uint8_t length, uint8_t wait
}

// wait until twi is ready, become master transmitter
uint32_t startMillis = millis();
while(TWI_READY != twi_state){
if((twi_timeout_ms > 0) && (millis() - startMillis > twi_timeout_ms)) {
//timeout
twi_disable();
twi_init();

return 4;
}
continue;
}
twi_state = TWI_MTX;
Expand Down Expand Up @@ -275,7 +300,15 @@ 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
startMillis = millis();
while(wait && (TWI_MTX == twi_state)){
if((twi_timeout_ms > 0) && (millis() - startMillis > twi_timeout_ms)) {
//timeout
twi_disable();
twi_init();

return 4;
}
continue;
}

Expand Down Expand Up @@ -373,7 +406,17 @@ void twi_stop(void)

// wait for stop condition to be exectued on bus
// TWINT is not set after a stop condition!
uint32_t counter = 0;
while(TWCR & _BV(TWSTO)){
counter++;
if((twi_timeout_ms > 0) && (counter >= 25000)) {
// timeout
twi_disable();
twi_init();

return;
}

continue;
}

Expand All @@ -396,6 +439,11 @@ void twi_releaseBus(void)
twi_state = TWI_READY;
}

void twi_setTimeoutInMillis(uint8_t timeout)
{
twi_timeout_ms = timeout;
}

ISR(TWI_vect)
{
switch(TW_STATUS){
Expand Down
1 change: 1 addition & 0 deletions libraries/Wire/src/utility/twi.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
void twi_reply(uint8_t);
void twi_stop(void);
void twi_releaseBus(void);
void twi_setTimeoutInMillis(uint8_t);

#endif

0 comments on commit 8b37c06

Please sign in to comment.