Skip to content

Commit 4efe39e

Browse files
committed
Changes to get Wire slave receiver working
1 parent b0e8ff0 commit 4efe39e

File tree

3 files changed

+56
-32
lines changed

3 files changed

+56
-32
lines changed

cores/arduino/SERCOM.cpp

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -410,14 +410,12 @@ void SERCOM::initSlaveWIRE( uint8_t ucAddress )
410410
// Set slave mode
411411
sercom->I2CS.CTRLA.bit.MODE = I2C_SLAVE_OPERATION ;
412412

413-
// Enable Quick Command
414-
sercom->I2CM.CTRLB.bit.QCEN = 1 ;
415-
416413
sercom->I2CS.ADDR.reg = SERCOM_I2CS_ADDR_ADDR( ucAddress & 0x7Ful ) | // 0x7F, select only 7 bits
417414
SERCOM_I2CS_ADDR_ADDRMASK( 0x3FFul ) ; // 0x3FF all bits set
418415

419416
// Set the interrupt register
420-
sercom->I2CS.INTENSET.reg = SERCOM_I2CS_INTENSET_AMATCH | // Address Match
417+
sercom->I2CS.INTENSET.reg = SERCOM_I2CS_INTENSET_PREC | // Stop
418+
SERCOM_I2CS_INTENSET_AMATCH | // Address Match
421419
SERCOM_I2CS_INTENSET_DRDY ; // Data Ready
422420

423421
while ( sercom->I2CM.SYNCBUSY.bit.SYSOP != 0 )
@@ -450,23 +448,35 @@ void SERCOM::initMasterWIRE( uint32_t baudrate )
450448

451449
void SERCOM::prepareNackBitWIRE( void )
452450
{
453-
// Send a NACK
454-
sercom->I2CM.CTRLB.bit.ACKACT = 1;
451+
if(isMasterWIRE()) {
452+
// Send a NACK
453+
sercom->I2CM.CTRLB.bit.ACKACT = 1;
454+
} else {
455+
sercom->I2CS.CTRLB.bit.ACKACT = 1;
456+
}
455457
}
456458

457459
void SERCOM::prepareAckBitWIRE( void )
458460
{
459-
// Send an ACK
460-
sercom->I2CM.CTRLB.bit.ACKACT = 0;
461+
if(isMasterWIRE()) {
462+
// Send an ACK
463+
sercom->I2CM.CTRLB.bit.ACKACT = 0;
464+
} else {
465+
sercom->I2CS.CTRLB.bit.ACKACT = 0;
466+
}
461467
}
462468

463-
void SERCOM::prepareCommandBitsWire(SercomMasterCommandWire cmd)
469+
void SERCOM::prepareCommandBitsWire(uint8_t cmd)
464470
{
465-
sercom->I2CM.CTRLB.bit.CMD = cmd;
471+
if(isMasterWIRE()) {
472+
sercom->I2CM.CTRLB.bit.CMD = cmd;
466473

467-
while(sercom->I2CM.SYNCBUSY.bit.SYSOP)
468-
{
469-
// Waiting for synchronization
474+
while(sercom->I2CM.SYNCBUSY.bit.SYSOP)
475+
{
476+
// Waiting for synchronization
477+
}
478+
} else {
479+
sercom->I2CS.CTRLB.bit.CMD = cmd;
470480
}
471481
}
472482

cores/arduino/SERCOM.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ class SERCOM
191191
void disableWIRE( void );
192192
void prepareNackBitWIRE( void ) ;
193193
void prepareAckBitWIRE( void ) ;
194-
void prepareCommandBitsWire(SercomMasterCommandWire cmd);
194+
void prepareCommandBitsWire(uint8_t cmd);
195195
bool startTransmissionWIRE(uint8_t address, SercomWireReadWriteFlag flag) ;
196196
bool sendDataMasterWIRE(uint8_t data) ;
197197
bool sendDataSlaveWIRE(uint8_t data) ;

libraries/Wire/Wire.cpp

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ void TwoWire::begin(uint8_t address) {
4747
//Slave mode
4848
sercom->initSlaveWIRE(address);
4949
sercom->enableWIRE();
50+
51+
pinPeripheral(_uc_pinSDA, g_APinDescription[_uc_pinSDA].ulPinType);
52+
pinPeripheral(_uc_pinSCL, g_APinDescription[_uc_pinSCL].ulPinType);
5053
}
5154

5255
void TwoWire::end() {
@@ -216,26 +219,11 @@ void TwoWire::onService(void)
216219
{
217220
if ( sercom->isSlaveWIRE() )
218221
{
219-
//Received data
220-
if(sercom->isDataReadyWIRE())
222+
if(sercom->isAddressMatch()) //Address Match
221223
{
222-
//Store data
223-
rxBuffer.store_char(sercom->readDataWIRE());
224-
225-
//Stop or Restart detected
226-
if(sercom->isStopDetectedWIRE() || sercom->isRestartDetectedWIRE())
227-
{
228-
//Calling onReceiveCallback, if exists
229-
if(onReceiveCallback)
230-
{
231-
onReceiveCallback(available());
232-
}
233-
}
234-
}
224+
sercom->prepareAckBitWIRE();
225+
sercom->prepareCommandBitsWire(0x03);
235226

236-
//Address Match
237-
if(sercom->isAddressMatch())
238-
{
239227
//Is a request ?
240228
if(sercom->isMasterReadOperationWIRE())
241229
{
@@ -246,6 +234,32 @@ void TwoWire::onService(void)
246234
}
247235
}
248236
}
237+
else if(sercom->isDataReadyWIRE()) //Received data
238+
{
239+
if (rxBuffer.isFull()) {
240+
sercom->prepareNackBitWIRE();
241+
} else {
242+
//Store data
243+
rxBuffer.store_char(sercom->readDataWIRE());
244+
245+
sercom->prepareAckBitWIRE();
246+
}
247+
248+
sercom->prepareCommandBitsWire(0x03);
249+
}
250+
else if(sercom->isStopDetectedWIRE() || sercom->isRestartDetectedWIRE()) //Stop or Restart detected
251+
{
252+
sercom->prepareAckBitWIRE();
253+
sercom->prepareCommandBitsWire(0x03);
254+
255+
//Calling onReceiveCallback, if exists
256+
if(onReceiveCallback)
257+
{
258+
onReceiveCallback(available());
259+
}
260+
261+
rxBuffer.clear();
262+
}
249263
}
250264
}
251265

0 commit comments

Comments
 (0)