diff --git a/libraries/Wire/Wire.cpp b/libraries/Wire/Wire.cpp index bae7b9e6e..f3e07bff4 100644 --- a/libraries/Wire/Wire.cpp +++ b/libraries/Wire/Wire.cpp @@ -219,61 +219,60 @@ void TwoWire::onRequest(void(*function)(void)) void TwoWire::onService(void) { - if ( sercom->isSlaveWIRE() ) + if (sercom->isSlaveWIRE()) { - if(sercom->isStopDetectedWIRE() || - (sercom->isAddressMatch() && sercom->isRestartDetectedWIRE() && !sercom->isMasterReadOperationWIRE())) //Stop or Restart detected + if (sercom->isStopDetectedWIRE() || sercom->isAddressMatch()) { sercom->prepareAckBitWIRE(); sercom->prepareCommandBitsWire(0x03); - //Calling onReceiveCallback, if exists - if(onReceiveCallback) - { - onReceiveCallback(available()); + if (sercom->isStopDetectedWIRE() || + (sercom->isRestartDetectedWIRE() && available())) + { // Stop or Restart after Rx detected + + // Calling onReceiveCallback, if exists + if (onReceiveCallback) + { + onReceiveCallback(available()); + } + rxBuffer.clear(); } - - rxBuffer.clear(); - } - else if(sercom->isAddressMatch()) //Address Match - { - sercom->prepareAckBitWIRE(); - sercom->prepareCommandBitsWire(0x03); - if(sercom->isMasterReadOperationWIRE()) //Is a request ? - { + if (sercom->isMasterReadOperationWIRE()) + { // Is a request ? txBuffer.clear(); - transmissionBegun = true; - - //Calling onRequestCallback, if exists - if(onRequestCallback) + // Calling onRequestCallback, if exists + if (onRequestCallback) { onRequestCallback(); } } } - else if(sercom->isDataReadyWIRE()) + else if (sercom->isDataReadyWIRE()) { if (sercom->isMasterReadOperationWIRE()) { uint8_t c = 0xff; - - if( txBuffer.available() ) { + if (txBuffer.available()) + { c = txBuffer.read_char(); } - transmissionBegun = sercom->sendDataSlaveWIRE(c); - } else { //Received data - if (rxBuffer.isFull()) { - sercom->prepareNackBitWIRE(); - } else { - //Store data + } + else + { + // Received data + if (rxBuffer.isFull()) + { + sercom->prepareNackBitWIRE(); + } + else + { + // Store data rxBuffer.store_char(sercom->readDataWIRE()); - - sercom->prepareAckBitWIRE(); + sercom->prepareAckBitWIRE(); } - sercom->prepareCommandBitsWire(0x03); } }
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: