@@ -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::setClock (uint32_t baudrate) {
@@ -212,36 +215,51 @@ void TwoWire::onService(void)
212215{
213216 if ( sercom->isSlaveWIRE () )
214217 {
215- // Received data
216- if (sercom->isDataReadyWIRE ())
218+ if (sercom-> isStopDetectedWIRE () ||
219+ (sercom->isAddressMatch () && sercom-> isRestartDetectedWIRE () && !sercom-> isMasterReadOperationWIRE ())) // Stop or Restart detected
217220 {
218- // Store data
219- rxBuffer. store_char ( sercom->readDataWIRE () );
221+ sercom-> prepareAckBitWIRE ();
222+ sercom->prepareCommandBitsWire ( 0x03 );
220223
221- // Stop or Restart detected
222- if (sercom-> isStopDetectedWIRE () || sercom-> isRestartDetectedWIRE () )
224+ // Calling onReceiveCallback, if exists
225+ if (onReceiveCallback )
223226 {
224- // Calling onReceiveCallback, if exists
225- if (onReceiveCallback)
226- {
227- onReceiveCallback (available ());
228- }
227+ onReceiveCallback (available ());
229228 }
229+
230+ rxBuffer.clear ();
230231 }
231-
232- // Address Match
233- if (sercom->isAddressMatch ())
232+ else if (sercom->isAddressMatch ()) // Address Match
234233 {
235- // Is a request ?
236- if (sercom->isMasterReadOperationWIRE ())
234+ sercom->prepareAckBitWIRE ();
235+ sercom->prepareCommandBitsWire (0x03 );
236+
237+ if (sercom->isMasterReadOperationWIRE ()) // Is a request ?
237238 {
239+ // wait for data ready flag,
240+ // before calling request callback
241+ while (!sercom->isDataReadyWIRE ());
242+
238243 // Calling onRequestCallback, if exists
239244 if (onRequestCallback)
240245 {
241246 onRequestCallback ();
242247 }
243248 }
244249 }
250+ else if (sercom->isDataReadyWIRE ()) // Received data
251+ {
252+ if (rxBuffer.isFull ()) {
253+ sercom->prepareNackBitWIRE ();
254+ } else {
255+ // Store data
256+ rxBuffer.store_char (sercom->readDataWIRE ());
257+
258+ sercom->prepareAckBitWIRE ();
259+ }
260+
261+ sercom->prepareCommandBitsWire (0x03 );
262+ }
245263 }
246264}
247265
0 commit comments