Skip to content
Snippets Groups Projects
Commit e5166fb9 authored by Sandeep Mistry's avatar Sandeep Mistry
Browse files

Use TX buffer for slave writes, empty on master read mode + DRDY IRQ

parent 214f990b
No related branches found
No related tags found
No related merge requests found
......@@ -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;
......
......@@ -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)
......@@ -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)
......@@ -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);
}
}
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment