Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 1 addition & 4 deletions cores/arduino/SERCOM.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -557,11 +557,8 @@ bool SERCOM::sendDataSlaveWIRE(uint8_t data)
//Send data
sercom->I2CS.DATA.bit.DATA = data;

//Wait data transmission successful
while(!sercom->I2CS.INTFLAG.bit.DRDY);

//Problems on line? nack received?
if(sercom->I2CS.STATUS.bit.RXNACK)
if(!sercom->I2CS.INTFLAG.bit.DRDY || sercom->I2CS.STATUS.bit.RXNACK)
return false;
else
return true;
Expand Down
59 changes: 29 additions & 30 deletions libraries/Wire/Wire.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -153,27 +153,15 @@ uint8_t TwoWire::endTransmission()

size_t TwoWire::write(uint8_t ucData)
{
if(sercom->isMasterWIRE())
// No writing, without begun transmission or a full buffer
if ( !transmissionBegun || txBuffer.isFull() )
{
// No writing, without begun transmission or a full buffer
if ( !transmissionBegun || txBuffer.isFull() )
{
return 0 ;
}

txBuffer.store_char( ucData ) ;

return 1 ;
}
else
{
if(sercom->sendDataSlaveWIRE( ucData ))
{
return 1;
}
return 0 ;
}

return 0;
txBuffer.store_char( ucData ) ;

return 1 ;
}

size_t TwoWire::write(const uint8_t *data, size_t quantity)
Expand Down Expand Up @@ -246,9 +234,9 @@ void TwoWire::onService(void)

if(sercom->isMasterReadOperationWIRE()) //Is a request ?
{
// wait for data ready flag,
// before calling request callback
while(!sercom->isDataReadyWIRE());
txBuffer.clear();

transmissionBegun = true;

//Calling onRequestCallback, if exists
if(onRequestCallback)
Expand All @@ -257,18 +245,29 @@ void TwoWire::onService(void)
}
}
}
else if(sercom->isDataReadyWIRE()) //Received data
else if(sercom->isDataReadyWIRE())
{
if (rxBuffer.isFull()) {
sercom->prepareNackBitWIRE();
} else {
//Store data
rxBuffer.store_char(sercom->readDataWIRE());
if (sercom->isMasterReadOperationWIRE())
{
uint8_t c = 0xff;

sercom->prepareAckBitWIRE();
}
if( txBuffer.available() ) {
c = txBuffer.read_char();
}

sercom->prepareCommandBitsWire(0x03);
transmissionBegun = sercom->sendDataSlaveWIRE(c);
} else { //Received data
if (rxBuffer.isFull()) {
sercom->prepareNackBitWIRE();
} else {
//Store data
rxBuffer.store_char(sercom->readDataWIRE());

sercom->prepareAckBitWIRE();
}

sercom->prepareCommandBitsWire(0x03);
}
}
}
}
Expand Down