From b3dd8ffc4188ac5b24527e71d7c5f0117ee9817e Mon Sep 17 00:00:00 2001 From: Tom Verbeure Date: Thu, 7 Apr 2011 18:43:04 -0700 Subject: [PATCH] Don't set TWSTO in tw_stop for slave transactions. This fixes non-working repeated-start sequences. --- libraries/Wire/utility/twi.c | 17 ++++++++++++++++- libraries/Wire/utility/twi.h | 1 + 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/libraries/Wire/utility/twi.c b/libraries/Wire/utility/twi.c index 9d728074321..fe8a9b2c7ac 100644 --- a/libraries/Wire/utility/twi.c +++ b/libraries/Wire/utility/twi.c @@ -314,6 +314,21 @@ void twi_stop(void) twi_state = TWI_READY; } +/* + * Function twi_stop_slv + * Desc relinquishes bus master status + * Input none + * Output none + */ +void twi_stop_slv(void) +{ + // send stop condition + TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT); + + // update twi state + twi_state = TWI_READY; +} + /* * Function twi_releaseBus * Desc releases bus control @@ -414,7 +429,7 @@ SIGNAL(TWI_vect) twi_rxBuffer[twi_rxBufferIndex] = '\0'; } // sends ack and stops interface for clock stretching - twi_stop(); + twi_stop_slv(); // callback to user defined callback twi_onSlaveReceive(twi_rxBuffer, twi_rxBufferIndex); // since we submit rx buffer to "wire" library, we can reset it diff --git a/libraries/Wire/utility/twi.h b/libraries/Wire/utility/twi.h index 71471c6ae61..fcd3e876b09 100755 --- a/libraries/Wire/utility/twi.h +++ b/libraries/Wire/utility/twi.h @@ -47,6 +47,7 @@ void twi_attachSlaveTxEvent( void (*)(void) ); void twi_reply(uint8_t); void twi_stop(void); + void twi_stop_slv(void); void twi_releaseBus(void); #endif