Skip to content

Commit e5166fb

Browse files
committed
Use TX buffer for slave writes, empty on master read mode + DRDY IRQ
1 parent 214f990 commit e5166fb

File tree

2 files changed

+30
-34
lines changed

2 files changed

+30
-34
lines changed

cores/arduino/SERCOM.cpp

+1-4
Original file line numberDiff line numberDiff line change
@@ -557,11 +557,8 @@ bool SERCOM::sendDataSlaveWIRE(uint8_t data)
557557
//Send data
558558
sercom->I2CS.DATA.bit.DATA = data;
559559

560-
//Wait data transmission successful
561-
while(!sercom->I2CS.INTFLAG.bit.DRDY);
562-
563560
//Problems on line? nack received?
564-
if(sercom->I2CS.STATUS.bit.RXNACK)
561+
if(!sercom->I2CS.INTFLAG.bit.DRDY || sercom->I2CS.STATUS.bit.RXNACK)
565562
return false;
566563
else
567564
return true;

libraries/Wire/Wire.cpp

+29-30
Original file line numberDiff line numberDiff line change
@@ -153,27 +153,15 @@ uint8_t TwoWire::endTransmission()
153153

154154
size_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

179167
size_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

Comments
 (0)