From 52eb52c033de61225eb18ea2eb0155575adf843c Mon Sep 17 00:00:00 2001 From: Thomas Reufer Date: Fri, 25 Dec 2020 20:36:12 +0100 Subject: [PATCH] Slave Wire: fix TwoWire::onService() to handle repeated start Combined I2C write/read transactions with repeated start conditions were not possible, since only onRequestCallback was called. Any previously received data was passed to onReceiveCallback as part of a subsequent master write. --- libraries/Wire/Wire.cpp | 63 ++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 32 deletions(-) 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); } } pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

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:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy