@@ -151,27 +151,15 @@ uint8_t TwoWire::endTransmission()
151
151
152
152
size_t TwoWire::write (uint8_t ucData)
153
153
{
154
- if (sercom->isMasterWIRE ())
154
+ // No writing, without begun transmission or a full buffer
155
+ if ( !transmissionBegun || txBuffer.isFull () )
155
156
{
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 ;
172
158
}
173
159
174
- return 0 ;
160
+ txBuffer.store_char ( ucData ) ;
161
+
162
+ return 1 ;
175
163
}
176
164
177
165
size_t TwoWire::write (const uint8_t *data, size_t quantity)
@@ -244,9 +232,9 @@ void TwoWire::onService(void)
244
232
245
233
if (sercom->isMasterReadOperationWIRE ()) // Is a request ?
246
234
{
247
- // wait for data ready flag,
248
- // before calling request callback
249
- while (!sercom-> isDataReadyWIRE ()) ;
235
+ txBuffer. clear ();
236
+
237
+ transmissionBegun = true ;
250
238
251
239
// Calling onRequestCallback, if exists
252
240
if (onRequestCallback)
@@ -255,18 +243,29 @@ void TwoWire::onService(void)
255
243
}
256
244
}
257
245
}
258
- else if (sercom->isDataReadyWIRE ()) // Received data
246
+ else if (sercom->isDataReadyWIRE ())
259
247
{
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 ;
265
251
266
- sercom->prepareAckBitWIRE ();
267
- }
252
+ if ( txBuffer.available () ) {
253
+ c = txBuffer.read_char ();
254
+ }
268
255
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
+ }
270
269
}
271
270
}
272
271
}
0 commit comments