diff --git a/cores/arduino/SERCOM.cpp b/cores/arduino/SERCOM.cpp index 7d7e7f9db5b99695469428c2a0bff3ec523783e6..2cfb172aa2b4dfc7ccf9075342bc40031f1c978c 100644 --- a/cores/arduino/SERCOM.cpp +++ b/cores/arduino/SERCOM.cpp @@ -493,6 +493,12 @@ bool SERCOM::startTransmissionWIRE(uint8_t address, SercomWireReadWriteFlag flag { while( !sercom->I2CM.INTFLAG.bit.SB ) { + // If the slave NACKS the address, the MB bit will be set. + // In that case, send a stop condition and return false. + if (sercom->I2CM.INTFLAG.bit.MB) { + sercom->I2CM.CTRLB.bit.CMD = 3; // Stop condition + return false; + } // Wait transmission complete } @@ -518,7 +524,14 @@ bool SERCOM::sendDataMasterWIRE(uint8_t data) sercom->I2CM.DATA.bit.DATA = data; //Wait transmission successful - while(!sercom->I2CM.INTFLAG.bit.MB); + while(!sercom->I2CM.INTFLAG.bit.MB) { + + // If a bus error occurs, the MB bit may never be set. + // Check the bus error bit and bail if it's set. + if (sercom->I2CM.STATUS.bit.BUSERR) { + return false; + } + } //Problems on line? nack received? if(sercom->I2CM.STATUS.bit.RXNACK)