diff --git a/cores/arduino/SERCOM.cpp b/cores/arduino/SERCOM.cpp index b45ecdc42ac2850db91a865f9aaf3600eca260bf..dacae22747aa6cfcba22d3d254a9db4195e4cf7e 100644 --- a/cores/arduino/SERCOM.cpp +++ b/cores/arduino/SERCOM.cpp @@ -476,17 +476,12 @@ void SERCOM::prepareCommandBitsWire(SercomMasterCommandWire cmd) } bool SERCOM::startTransmissionWIRE(uint8_t address, SercomWireReadWriteFlag flag) -{ - return startTransmissionWIRE(address, flag, false); -} - -bool SERCOM::startTransmissionWIRE(uint8_t address, SercomWireReadWriteFlag flag, bool repeatedStart) { // 7-bits address + 1-bits R/W address = (address << 0x1ul) | flag; - // Wait idle bus mode - while ( !repeatedStart && !isBusIdleWIRE()); + // Wait idle or owner bus mode + while ( !isBusIdleWIRE() && !isBusOwnerWIRE() ); // Send start and address sercom->I2CM.ADDR.bit.ADDR = address; @@ -580,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 307f5a9c3686a7b0b3c407f1f2705a69c5d53a6a..26a437e8fb8273b316db413a23664b18b8d0c8a8 100644 --- a/cores/arduino/SERCOM.h +++ b/cores/arduino/SERCOM.h @@ -194,12 +194,12 @@ class SERCOM void prepareAckBitWIRE( void ) ; void prepareCommandBitsWire(SercomMasterCommandWire cmd); bool startTransmissionWIRE(uint8_t address, SercomWireReadWriteFlag flag) ; - bool startTransmissionWIRE(uint8_t address, SercomWireReadWriteFlag flag, bool repeatedStart) ; bool sendDataMasterWIRE(uint8_t data) ; bool sendDataSlaveWIRE(uint8_t data) ; 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 c4747947bf69a7f16bd1fd5940bbbd0d8e79c36f..21d39f71dd2c46d00eac208f7a0500532cdcd270 100644 --- a/libraries/Wire/Wire.cpp +++ b/libraries/Wire/Wire.cpp @@ -68,7 +68,7 @@ uint8_t TwoWire::requestFrom(uint8_t address, size_t quantity, bool stopBit) size_t byteRead = 0; - if(sercom->startTransmissionWIRE(address, WIRE_READ_FLAG, repeatedStart)) + if(sercom->startTransmissionWIRE(address, WIRE_READ_FLAG)) { // Read first data rxBuffer.store_char(sercom->readDataWIRE()); @@ -83,7 +83,6 @@ 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 - repeatedStart = !stopBit; if (stopBit) { sercom->prepareCommandBitsWire(WIRE_MASTER_ACT_STOP); // Send Stop @@ -117,7 +116,7 @@ uint8_t TwoWire::endTransmission(bool stopBit) transmissionBegun = false ; // Start I2C transmission - if ( !sercom->startTransmissionWIRE( txAddress, WIRE_WRITE_FLAG, repeatedStart ) ) + if ( !sercom->startTransmissionWIRE( txAddress, WIRE_WRITE_FLAG ) ) { sercom->prepareCommandBitsWire(WIRE_MASTER_ACT_STOP); return 2 ; // Address error @@ -134,7 +133,6 @@ uint8_t TwoWire::endTransmission(bool stopBit) } } - repeatedStart = !stopBit; if (stopBit) { sercom->prepareCommandBitsWire(WIRE_MASTER_ACT_STOP); diff --git a/libraries/Wire/Wire.h b/libraries/Wire/Wire.h index bc2968abcac23bbbbe0aaaea42aabbba378f4698..ab7ccae60b4bf37ac2ed1474ce9ae1d5087d1929 100644 --- a/libraries/Wire/Wire.h +++ b/libraries/Wire/Wire.h @@ -67,7 +67,6 @@ class TwoWire : public Stream uint8_t _uc_pinSCL; bool transmissionBegun; - bool repeatedStart; // RX Buffer RingBuffer rxBuffer;