@@ -153,27 +153,15 @@ uint8_t TwoWire::endTransmission()
153153
154154size_t TwoWire::write (uint8_t ucData)
155155{
156- if (sercom->isMasterWIRE ())
156+ // No writing, without begun transmission or a full buffer
157+ if ( !transmissionBegun || txBuffer.isFull () )
157158 {
158- // No writing, without begun transmission or a full buffer
159- if ( !transmissionBegun || txBuffer.isFull () )
160- {
161- return 0 ;
162- }
163-
164- txBuffer.store_char ( ucData ) ;
165-
166- return 1 ;
167- }
168- else
169- {
170- if (sercom->sendDataSlaveWIRE ( ucData ))
171- {
172- return 1 ;
173- }
159+ return 0 ;
174160 }
175161
176- return 0 ;
162+ txBuffer.store_char ( ucData ) ;
163+
164+ return 1 ;
177165}
178166
179167size_t TwoWire::write (const uint8_t *data, size_t quantity)
@@ -246,9 +234,9 @@ void TwoWire::onService(void)
246234
247235 if (sercom->isMasterReadOperationWIRE ()) // Is a request ?
248236 {
249- // wait for data ready flag,
250- // before calling request callback
251- while (!sercom-> isDataReadyWIRE ()) ;
237+ txBuffer. clear ();
238+
239+ transmissionBegun = true ;
252240
253241 // Calling onRequestCallback, if exists
254242 if (onRequestCallback)
@@ -257,18 +245,29 @@ void TwoWire::onService(void)
257245 }
258246 }
259247 }
260- else if (sercom->isDataReadyWIRE ()) // Received data
248+ else if (sercom->isDataReadyWIRE ())
261249 {
262- if (rxBuffer.isFull ()) {
263- sercom->prepareNackBitWIRE ();
264- } else {
265- // Store data
266- rxBuffer.store_char (sercom->readDataWIRE ());
250+ if (sercom->isMasterReadOperationWIRE ())
251+ {
252+ uint8_t c = 0xff ;
267253
268- sercom->prepareAckBitWIRE ();
269- }
254+ if ( txBuffer.available () ) {
255+ c = txBuffer.read_char ();
256+ }
270257
271- sercom->prepareCommandBitsWire (0x03 );
258+ transmissionBegun = sercom->sendDataSlaveWIRE (c);
259+ } else { // Received data
260+ if (rxBuffer.isFull ()) {
261+ sercom->prepareNackBitWIRE ();
262+ } else {
263+ // Store data
264+ rxBuffer.store_char (sercom->readDataWIRE ());
265+
266+ sercom->prepareAckBitWIRE ();
267+ }
268+
269+ sercom->prepareCommandBitsWire (0x03 );
270+ }
272271 }
273272 }
274273}
0 commit comments