@@ -151,27 +151,15 @@ uint8_t TwoWire::endTransmission()
151151
152152size_t TwoWire::write (uint8_t ucData)
153153{
154- if (sercom->isMasterWIRE ())
154+ // No writing, without begun transmission or a full buffer
155+ if ( !transmissionBegun || txBuffer.isFull () )
155156 {
156- // No writing, without begun transmission or a full buffer
157- if ( !transmissionBegun || txBuffer.isFull () )
158- {
159- return 0 ;
160- }
161-
162- txBuffer.store_char ( ucData ) ;
163-
164- return 1 ;
165- }
166- else
167- {
168- if (sercom->sendDataSlaveWIRE ( ucData ))
169- {
170- return 1 ;
171- }
157+ return 0 ;
172158 }
173159
174- return 0 ;
160+ txBuffer.store_char ( ucData ) ;
161+
162+ return 1 ;
175163}
176164
177165size_t TwoWire::write (const uint8_t *data, size_t quantity)
@@ -244,9 +232,9 @@ void TwoWire::onService(void)
244232
245233 if (sercom->isMasterReadOperationWIRE ()) // Is a request ?
246234 {
247- // wait for data ready flag,
248- // before calling request callback
249- while (!sercom-> isDataReadyWIRE ()) ;
235+ txBuffer. clear ();
236+
237+ transmissionBegun = true ;
250238
251239 // Calling onRequestCallback, if exists
252240 if (onRequestCallback)
@@ -255,18 +243,29 @@ void TwoWire::onService(void)
255243 }
256244 }
257245 }
258- else if (sercom->isDataReadyWIRE ()) // Received data
246+ else if (sercom->isDataReadyWIRE ())
259247 {
260- if (rxBuffer.isFull ()) {
261- sercom->prepareNackBitWIRE ();
262- } else {
263- // Store data
264- rxBuffer.store_char (sercom->readDataWIRE ());
248+ if (sercom->isMasterReadOperationWIRE ())
249+ {
250+ uint8_t c = 0xff ;
265251
266- sercom->prepareAckBitWIRE ();
267- }
252+ if ( txBuffer.available () ) {
253+ c = txBuffer.read_char ();
254+ }
268255
269- sercom->prepareCommandBitsWire (0x03 );
256+ transmissionBegun = sercom->sendDataSlaveWIRE (c);
257+ } else { // Received data
258+ if (rxBuffer.isFull ()) {
259+ sercom->prepareNackBitWIRE ();
260+ } else {
261+ // Store data
262+ rxBuffer.store_char (sercom->readDataWIRE ());
263+
264+ sercom->prepareAckBitWIRE ();
265+ }
266+
267+ sercom->prepareCommandBitsWire (0x03 );
268+ }
270269 }
271270 }
272271}
0 commit comments