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