Skip to content

Commit e0b1836

Browse files
committed
Use TX buffer for slave writes, empty on master read mode + DRDY IRQ
1 parent 2a6d856 commit e0b1836

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
@@ -553,11 +553,8 @@ bool SERCOM::sendDataSlaveWIRE(uint8_t data)
553553
//Send data
554554
sercom->I2CS.DATA.bit.DATA = data;
555555

556-
//Wait data transmission successful
557-
while(!sercom->I2CS.INTFLAG.bit.DRDY);
558-
559556
//Problems on line? nack received?
560-
if(sercom->I2CS.STATUS.bit.RXNACK)
557+
if(!sercom->I2CS.INTFLAG.bit.DRDY || sercom->I2CS.STATUS.bit.RXNACK)
561558
return false;
562559
else
563560
return true;

libraries/Wire/Wire.cpp

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

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

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

Comments
 (0)