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

This commit is contained in:
Sandeep Mistry 2016-01-18 17:42:05 -05:00
parent 214f990bdb
commit e5166fb922
2 changed files with 30 additions and 34 deletions

View file

@ -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;

View file

@ -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();
}
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);
}
sercom->prepareCommandBitsWire(0x03);
}
}
}