@@ -47,6 +47,9 @@ void TwoWire::begin(uint8_t address) {
4747 // Slave mode
4848 sercom->initSlaveWIRE (address);
4949 sercom->enableWIRE ();
50+
51+ pinPeripheral (_uc_pinSDA, g_APinDescription[_uc_pinSDA].ulPinType );
52+ pinPeripheral (_uc_pinSCL, g_APinDescription[_uc_pinSCL].ulPinType );
5053}
5154
5255void TwoWire::end () {
@@ -216,26 +219,11 @@ void TwoWire::onService(void)
216219{
217220 if ( sercom->isSlaveWIRE () )
218221 {
219- // Received data
220- if (sercom->isDataReadyWIRE ())
222+ if (sercom->isAddressMatch ()) // Address Match
221223 {
222- // Store data
223- rxBuffer.store_char (sercom->readDataWIRE ());
224-
225- // Stop or Restart detected
226- if (sercom->isStopDetectedWIRE () || sercom->isRestartDetectedWIRE ())
227- {
228- // Calling onReceiveCallback, if exists
229- if (onReceiveCallback)
230- {
231- onReceiveCallback (available ());
232- }
233- }
234- }
224+ sercom->prepareAckBitWIRE ();
225+ sercom->prepareCommandBitsWire (0x03 );
235226
236- // Address Match
237- if (sercom->isAddressMatch ())
238- {
239227 // Is a request ?
240228 if (sercom->isMasterReadOperationWIRE ())
241229 {
@@ -246,6 +234,32 @@ void TwoWire::onService(void)
246234 }
247235 }
248236 }
237+ else if (sercom->isDataReadyWIRE ()) // Received data
238+ {
239+ if (rxBuffer.isFull ()) {
240+ sercom->prepareNackBitWIRE ();
241+ } else {
242+ // Store data
243+ rxBuffer.store_char (sercom->readDataWIRE ());
244+
245+ sercom->prepareAckBitWIRE ();
246+ }
247+
248+ sercom->prepareCommandBitsWire (0x03 );
249+ }
250+ else if (sercom->isStopDetectedWIRE () || sercom->isRestartDetectedWIRE ()) // Stop or Restart detected
251+ {
252+ sercom->prepareAckBitWIRE ();
253+ sercom->prepareCommandBitsWire (0x03 );
254+
255+ // Calling onReceiveCallback, if exists
256+ if (onReceiveCallback)
257+ {
258+ onReceiveCallback (available ());
259+ }
260+
261+ rxBuffer.clear ();
262+ }
249263 }
250264}
251265
0 commit comments