Skip to content

Commit b993249

Browse files
legomanwwsandeepmistry
authored andcommitted
Add I2C Repeated Start Capability
Adjust requestFrom, endTransmission, and startTransmissionWire to handle repeated starts
1 parent 0d83c96 commit b993249

File tree

4 files changed

+23
-6
lines changed

4 files changed

+23
-6
lines changed

cores/arduino/SERCOM.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -476,12 +476,17 @@ void SERCOM::prepareCommandBitsWire(SercomMasterCommandWire cmd)
476476
}
477477

478478
bool SERCOM::startTransmissionWIRE(uint8_t address, SercomWireReadWriteFlag flag)
479+
{
480+
return startTransmissionWIRE(address, flag, false);
481+
}
482+
483+
bool SERCOM::startTransmissionWIRE(uint8_t address, SercomWireReadWriteFlag flag, bool repeatedStart)
479484
{
480485
// 7-bits address + 1-bits R/W
481486
address = (address << 0x1ul) | flag;
482487

483488
// Wait idle bus mode
484-
while ( !isBusIdleWIRE() );
489+
while ( !repeatedStart && !isBusIdleWIRE());
485490

486491
// Send start and address
487492
sercom->I2CM.ADDR.bit.ADDR = address;

cores/arduino/SERCOM.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ class SERCOM
194194
void prepareAckBitWIRE( void ) ;
195195
void prepareCommandBitsWire(SercomMasterCommandWire cmd);
196196
bool startTransmissionWIRE(uint8_t address, SercomWireReadWriteFlag flag) ;
197+
bool startTransmissionWIRE(uint8_t address, SercomWireReadWriteFlag flag, bool repeatedStart) ;
197198
bool sendDataMasterWIRE(uint8_t data) ;
198199
bool sendDataSlaveWIRE(uint8_t data) ;
199200
bool isMasterWIRE( void ) ;

libraries/Wire/Wire.cpp

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ uint8_t TwoWire::requestFrom(uint8_t address, size_t quantity, bool stopBit)
6868

6969
size_t byteRead = 0;
7070

71-
if(sercom->startTransmissionWIRE(address, WIRE_READ_FLAG))
71+
if(sercom->startTransmissionWIRE(address, WIRE_READ_FLAG, repeatedStart))
7272
{
7373
// Read first data
7474
rxBuffer.store_char(sercom->readDataWIRE());
@@ -82,7 +82,12 @@ uint8_t TwoWire::requestFrom(uint8_t address, size_t quantity, bool stopBit)
8282
}
8383
sercom->prepareNackBitWIRE(); // Prepare NACK to stop slave transmission
8484
//sercom->readDataWIRE(); // Clear data register to send NACK
85-
sercom->prepareCommandBitsWire(WIRE_MASTER_ACT_STOP); // Send Stop
85+
86+
repeatedStart = !stopBit;
87+
if (stopBit)
88+
{
89+
sercom->prepareCommandBitsWire(WIRE_MASTER_ACT_STOP); // Send Stop
90+
}
8691
}
8792

8893
return byteRead;
@@ -112,7 +117,7 @@ uint8_t TwoWire::endTransmission(bool stopBit)
112117
transmissionBegun = false ;
113118

114119
// Start I2C transmission
115-
if ( !sercom->startTransmissionWIRE( txAddress, WIRE_WRITE_FLAG ) )
120+
if ( !sercom->startTransmissionWIRE( txAddress, WIRE_WRITE_FLAG, repeatedStart ) )
116121
{
117122
sercom->prepareCommandBitsWire(WIRE_MASTER_ACT_STOP);
118123
return 2 ; // Address error
@@ -128,7 +133,12 @@ uint8_t TwoWire::endTransmission(bool stopBit)
128133
return 3 ; // Nack or error
129134
}
130135
}
131-
sercom->prepareCommandBitsWire(WIRE_MASTER_ACT_STOP);
136+
137+
repeatedStart = !stopBit;
138+
if (stopBit)
139+
{
140+
sercom->prepareCommandBitsWire(WIRE_MASTER_ACT_STOP);
141+
}
132142

133143
return 0;
134144
}

libraries/Wire/Wire.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,8 @@ class TwoWire : public Stream
6767
uint8_t _uc_pinSCL;
6868

6969
bool transmissionBegun;
70-
70+
bool repeatedStart;
71+
7172
// RX Buffer
7273
RingBuffer rxBuffer;
7374

0 commit comments

Comments
 (0)