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

Changes to get Wire slave receiver working

parent b0e8ff06
No related branches found
No related tags found
No related merge requests found
...@@ -410,14 +410,12 @@ void SERCOM::initSlaveWIRE( uint8_t ucAddress ) ...@@ -410,14 +410,12 @@ void SERCOM::initSlaveWIRE( uint8_t ucAddress )
// Set slave mode // Set slave mode
sercom->I2CS.CTRLA.bit.MODE = I2C_SLAVE_OPERATION ; sercom->I2CS.CTRLA.bit.MODE = I2C_SLAVE_OPERATION ;
// Enable Quick Command
sercom->I2CM.CTRLB.bit.QCEN = 1 ;
sercom->I2CS.ADDR.reg = SERCOM_I2CS_ADDR_ADDR( ucAddress & 0x7Ful ) | // 0x7F, select only 7 bits sercom->I2CS.ADDR.reg = SERCOM_I2CS_ADDR_ADDR( ucAddress & 0x7Ful ) | // 0x7F, select only 7 bits
SERCOM_I2CS_ADDR_ADDRMASK( 0x3FFul ) ; // 0x3FF all bits set SERCOM_I2CS_ADDR_ADDRMASK( 0x3FFul ) ; // 0x3FF all bits set
// Set the interrupt register // Set the interrupt register
sercom->I2CS.INTENSET.reg = SERCOM_I2CS_INTENSET_AMATCH | // Address Match sercom->I2CS.INTENSET.reg = SERCOM_I2CS_INTENSET_PREC | // Stop
SERCOM_I2CS_INTENSET_AMATCH | // Address Match
SERCOM_I2CS_INTENSET_DRDY ; // Data Ready SERCOM_I2CS_INTENSET_DRDY ; // Data Ready
while ( sercom->I2CM.SYNCBUSY.bit.SYSOP != 0 ) while ( sercom->I2CM.SYNCBUSY.bit.SYSOP != 0 )
...@@ -450,23 +448,35 @@ void SERCOM::initMasterWIRE( uint32_t baudrate ) ...@@ -450,23 +448,35 @@ void SERCOM::initMasterWIRE( uint32_t baudrate )
void SERCOM::prepareNackBitWIRE( void ) void SERCOM::prepareNackBitWIRE( void )
{ {
// Send a NACK if(isMasterWIRE()) {
sercom->I2CM.CTRLB.bit.ACKACT = 1; // Send a NACK
sercom->I2CM.CTRLB.bit.ACKACT = 1;
} else {
sercom->I2CS.CTRLB.bit.ACKACT = 1;
}
} }
void SERCOM::prepareAckBitWIRE( void ) void SERCOM::prepareAckBitWIRE( void )
{ {
// Send an ACK if(isMasterWIRE()) {
sercom->I2CM.CTRLB.bit.ACKACT = 0; // Send an ACK
sercom->I2CM.CTRLB.bit.ACKACT = 0;
} else {
sercom->I2CS.CTRLB.bit.ACKACT = 0;
}
} }
void SERCOM::prepareCommandBitsWire(SercomMasterCommandWire cmd) void SERCOM::prepareCommandBitsWire(uint8_t cmd)
{ {
sercom->I2CM.CTRLB.bit.CMD = cmd; if(isMasterWIRE()) {
sercom->I2CM.CTRLB.bit.CMD = cmd;
while(sercom->I2CM.SYNCBUSY.bit.SYSOP) while(sercom->I2CM.SYNCBUSY.bit.SYSOP)
{ {
// Waiting for synchronization // Waiting for synchronization
}
} else {
sercom->I2CS.CTRLB.bit.CMD = cmd;
} }
} }
......
...@@ -191,7 +191,7 @@ class SERCOM ...@@ -191,7 +191,7 @@ class SERCOM
void disableWIRE( void ); void disableWIRE( void );
void prepareNackBitWIRE( void ) ; void prepareNackBitWIRE( void ) ;
void prepareAckBitWIRE( void ) ; void prepareAckBitWIRE( void ) ;
void prepareCommandBitsWire(SercomMasterCommandWire cmd); void prepareCommandBitsWire(uint8_t cmd);
bool startTransmissionWIRE(uint8_t address, SercomWireReadWriteFlag flag) ; bool startTransmissionWIRE(uint8_t address, SercomWireReadWriteFlag flag) ;
bool sendDataMasterWIRE(uint8_t data) ; bool sendDataMasterWIRE(uint8_t data) ;
bool sendDataSlaveWIRE(uint8_t data) ; bool sendDataSlaveWIRE(uint8_t data) ;
......
...@@ -47,6 +47,9 @@ void TwoWire::begin(uint8_t address) { ...@@ -47,6 +47,9 @@ void TwoWire::begin(uint8_t address) {
//Slave mode //Slave mode
sercom->initSlaveWIRE(address); sercom->initSlaveWIRE(address);
sercom->enableWIRE(); sercom->enableWIRE();
pinPeripheral(_uc_pinSDA, g_APinDescription[_uc_pinSDA].ulPinType);
pinPeripheral(_uc_pinSCL, g_APinDescription[_uc_pinSCL].ulPinType);
} }
void TwoWire::end() { void TwoWire::end() {
...@@ -216,26 +219,11 @@ void TwoWire::onService(void) ...@@ -216,26 +219,11 @@ void TwoWire::onService(void)
{ {
if ( sercom->isSlaveWIRE() ) if ( sercom->isSlaveWIRE() )
{ {
//Received data if(sercom->isAddressMatch()) //Address Match
if(sercom->isDataReadyWIRE())
{ {
//Store data sercom->prepareAckBitWIRE();
rxBuffer.store_char(sercom->readDataWIRE()); sercom->prepareCommandBitsWire(0x03);
//Stop or Restart detected
if(sercom->isStopDetectedWIRE() || sercom->isRestartDetectedWIRE())
{
//Calling onReceiveCallback, if exists
if(onReceiveCallback)
{
onReceiveCallback(available());
}
}
}
//Address Match
if(sercom->isAddressMatch())
{
//Is a request ? //Is a request ?
if(sercom->isMasterReadOperationWIRE()) if(sercom->isMasterReadOperationWIRE())
{ {
...@@ -246,6 +234,32 @@ void TwoWire::onService(void) ...@@ -246,6 +234,32 @@ void TwoWire::onService(void)
} }
} }
} }
else if(sercom->isDataReadyWIRE()) //Received data
{
if (rxBuffer.isFull()) {
sercom->prepareNackBitWIRE();
} else {
//Store data
rxBuffer.store_char(sercom->readDataWIRE());
sercom->prepareAckBitWIRE();
}
sercom->prepareCommandBitsWire(0x03);
}
else if(sercom->isStopDetectedWIRE() || sercom->isRestartDetectedWIRE()) //Stop or Restart detected
{
sercom->prepareAckBitWIRE();
sercom->prepareCommandBitsWire(0x03);
//Calling onReceiveCallback, if exists
if(onReceiveCallback)
{
onReceiveCallback(available());
}
rxBuffer.clear();
}
} }
} }
......
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