diff --git a/cores/arduino/SERCOM.cpp b/cores/arduino/SERCOM.cpp index b88159f1d..dacae2274 100644 --- a/cores/arduino/SERCOM.cpp +++ b/cores/arduino/SERCOM.cpp @@ -480,8 +480,8 @@ bool SERCOM::startTransmissionWIRE(uint8_t address, SercomWireReadWriteFlag flag // 7-bits address + 1-bits R/W address = (address << 0x1ul) | flag; - // Wait idle bus mode - while ( !isBusIdleWIRE() ); + // Wait idle or owner bus mode + while ( !isBusIdleWIRE() && !isBusOwnerWIRE() ); // Send start and address sercom->I2CM.ADDR.bit.ADDR = address; @@ -575,6 +575,11 @@ bool SERCOM::isBusIdleWIRE( void ) return sercom->I2CM.STATUS.bit.BUSSTATE == WIRE_IDLE_STATE; } +bool SERCOM::isBusOwnerWIRE( void ) +{ + return sercom->I2CM.STATUS.bit.BUSSTATE == WIRE_OWNER_STATE; +} + bool SERCOM::isDataReadyWIRE( void ) { return sercom->I2CS.INTFLAG.bit.DRDY; diff --git a/cores/arduino/SERCOM.h b/cores/arduino/SERCOM.h index 7608386c9..26a437e8f 100644 --- a/cores/arduino/SERCOM.h +++ b/cores/arduino/SERCOM.h @@ -199,6 +199,7 @@ class SERCOM bool isMasterWIRE( void ) ; bool isSlaveWIRE( void ) ; bool isBusIdleWIRE( void ) ; + bool isBusOwnerWIRE( void ) ; bool isDataReadyWIRE( void ) ; bool isStopDetectedWIRE( void ) ; bool isRestartDetectedWIRE( void ) ; diff --git a/libraries/Wire/Wire.cpp b/libraries/Wire/Wire.cpp index d45bfe379..21d39f71d 100644 --- a/libraries/Wire/Wire.cpp +++ b/libraries/Wire/Wire.cpp @@ -82,7 +82,11 @@ uint8_t TwoWire::requestFrom(uint8_t address, size_t quantity, bool stopBit) } sercom->prepareNackBitWIRE(); // Prepare NACK to stop slave transmission //sercom->readDataWIRE(); // Clear data register to send NACK - sercom->prepareCommandBitsWire(WIRE_MASTER_ACT_STOP); // Send Stop + + if (stopBit) + { + sercom->prepareCommandBitsWire(WIRE_MASTER_ACT_STOP); // Send Stop + } } return byteRead; @@ -128,7 +132,11 @@ uint8_t TwoWire::endTransmission(bool stopBit) return 3 ; // Nack or error } } - sercom->prepareCommandBitsWire(WIRE_MASTER_ACT_STOP); + + if (stopBit) + { + sercom->prepareCommandBitsWire(WIRE_MASTER_ACT_STOP); + } return 0; }