diff --git a/libraries/Wire/Wire.cpp b/libraries/Wire/Wire.cpp index bae7b9e6e..9911aacc2 100644 --- a/libraries/Wire/Wire.cpp +++ b/libraries/Wire/Wire.cpp @@ -217,67 +217,74 @@ void TwoWire::onRequest(void(*function)(void)) onRequestCallback = function; } -void TwoWire::onService(void) -{ - if ( sercom->isSlaveWIRE() ) - { - if(sercom->isStopDetectedWIRE() || - (sercom->isAddressMatch() && sercom->isRestartDetectedWIRE() && !sercom->isMasterReadOperationWIRE())) //Stop or Restart detected - { - sercom->prepareAckBitWIRE(); - sercom->prepareCommandBitsWire(0x03); - - //Calling onReceiveCallback, if exists - if(onReceiveCallback) - { - onReceiveCallback(available()); - } - - rxBuffer.clear(); - } - else if(sercom->isAddressMatch()) //Address Match - { - sercom->prepareAckBitWIRE(); - sercom->prepareCommandBitsWire(0x03); - - if(sercom->isMasterReadOperationWIRE()) //Is a request ? - { - txBuffer.clear(); - - transmissionBegun = true; - - //Calling onRequestCallback, if exists - if(onRequestCallback) - { - onRequestCallback(); - } - } - } - else if(sercom->isDataReadyWIRE()) - { - if (sercom->isMasterReadOperationWIRE()) - { - uint8_t c = 0xff; - - if( txBuffer.available() ) { - c = txBuffer.read_char(); - } - - transmissionBegun = sercom->sendDataSlaveWIRE(c); - } else { //Received data - if (rxBuffer.isFull()) { - sercom->prepareNackBitWIRE(); - } else { - //Store data - rxBuffer.store_char(sercom->readDataWIRE()); - - sercom->prepareAckBitWIRE(); - } - - sercom->prepareCommandBitsWire(0x03); - } - } - } +void TwoWire::onService(void) { + if (sercom->isSlaveWIRE()) { + if (sercom->isAddressMatch()) { // address match interrupt + if (sercom->isMasterReadOperationWIRE()) { // the master is making a read request + sercom->prepareAckBitWIRE(); + sercom->prepareCommandBitsWire(0x03); + + txBuffer.clear(); + transmissionBegun = true; + + // call the onRequest callback to put bytes in the txBuffer + if(onRequestCallback) { + onRequestCallback(); + } + + while(!sercom->isStopDetectedWIRE()) { // write the bytes out to the master + if (sercom->isDataReadyWIRE()) { + uint8_t c = 0xff; + if (txBuffer.available()) { + c = txBuffer.read_char(); + } + + sercom->sendDataSlaveWIRE(c); + } + } + + // done sending bytes, NACK to shut things down + sercom->prepareNackBitWIRE(); + sercom->prepareCommandBitsWire(0x03); + + } else if (!(sercom->isMasterReadOperationWIRE())) { // acknowledge master write request + sercom->prepareAckBitWIRE(); + sercom->prepareCommandBitsWire(0x03); + + while(!(sercom->isStopDetectedWIRE() || sercom->isRestartDetectedWIRE())) { // read bytes from the master + if(sercom->isDataReadyWIRE()) { + if (rxBuffer.isFull()) { + sercom->prepareNackBitWIRE(); + sercom->prepareCommandBitsWire(0x03); + break; + } else { + rxBuffer.store_char(sercom->readDataWIRE()); + sercom->prepareAckBitWIRE(); + sercom->prepareCommandBitsWire(0x03); + } + } + } + + if(sercom->isStopDetectedWIRE() || sercom->isRestartDetectedWIRE()) { + if (onReceiveCallback) { + onReceiveCallback(available()); + } + + rxBuffer.clear(); + } + + if(sercom->isStopDetectedWIRE()) { + sercom->prepareNackBitWIRE(); + sercom->prepareCommandBitsWire(0x03); + } + + } else { + // do nothing + } + } else { + // do nothing + } + } } #if WIRE_INTERFACES_COUNT > 0
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: