Skip to content

Commit a2949d5

Browse files
committed
Wait for idle or bus owner state in startTransmissionWIRE instead of storing repeated start state.
1 parent 9977fa3 commit a2949d5

File tree

4 files changed

+10
-13
lines changed

4 files changed

+10
-13
lines changed

cores/arduino/SERCOM.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -476,17 +476,12 @@ 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)
484479
{
485480
// 7-bits address + 1-bits R/W
486481
address = (address << 0x1ul) | flag;
487482

488-
// Wait idle bus mode
489-
while ( !repeatedStart && !isBusIdleWIRE());
483+
// Wait idle or owner bus mode
484+
while ( !isBusIdleWIRE() && !isBusOwnerWIRE() );
490485

491486
// Send start and address
492487
sercom->I2CM.ADDR.bit.ADDR = address;
@@ -580,6 +575,11 @@ bool SERCOM::isBusIdleWIRE( void )
580575
return sercom->I2CM.STATUS.bit.BUSSTATE == WIRE_IDLE_STATE;
581576
}
582577

578+
bool SERCOM::isBusOwnerWIRE( void )
579+
{
580+
return sercom->I2CM.STATUS.bit.BUSSTATE == WIRE_OWNER_STATE;
581+
}
582+
583583
bool SERCOM::isDataReadyWIRE( void )
584584
{
585585
return sercom->I2CS.INTFLAG.bit.DRDY;

cores/arduino/SERCOM.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,12 +194,12 @@ 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) ;
198197
bool sendDataMasterWIRE(uint8_t data) ;
199198
bool sendDataSlaveWIRE(uint8_t data) ;
200199
bool isMasterWIRE( void ) ;
201200
bool isSlaveWIRE( void ) ;
202201
bool isBusIdleWIRE( void ) ;
202+
bool isBusOwnerWIRE( void ) ;
203203
bool isDataReadyWIRE( void ) ;
204204
bool isStopDetectedWIRE( void ) ;
205205
bool isRestartDetectedWIRE( void ) ;

libraries/Wire/Wire.cpp

Lines changed: 2 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, repeatedStart))
71+
if(sercom->startTransmissionWIRE(address, WIRE_READ_FLAG))
7272
{
7373
// Read first data
7474
rxBuffer.store_char(sercom->readDataWIRE());
@@ -83,7 +83,6 @@ uint8_t TwoWire::requestFrom(uint8_t address, size_t quantity, bool stopBit)
8383
sercom->prepareNackBitWIRE(); // Prepare NACK to stop slave transmission
8484
//sercom->readDataWIRE(); // Clear data register to send NACK
8585

86-
repeatedStart = !stopBit;
8786
if (stopBit)
8887
{
8988
sercom->prepareCommandBitsWire(WIRE_MASTER_ACT_STOP); // Send Stop
@@ -117,7 +116,7 @@ uint8_t TwoWire::endTransmission(bool stopBit)
117116
transmissionBegun = false ;
118117

119118
// Start I2C transmission
120-
if ( !sercom->startTransmissionWIRE( txAddress, WIRE_WRITE_FLAG, repeatedStart ) )
119+
if ( !sercom->startTransmissionWIRE( txAddress, WIRE_WRITE_FLAG ) )
121120
{
122121
sercom->prepareCommandBitsWire(WIRE_MASTER_ACT_STOP);
123122
return 2 ; // Address error
@@ -134,7 +133,6 @@ uint8_t TwoWire::endTransmission(bool stopBit)
134133
}
135134
}
136135

137-
repeatedStart = !stopBit;
138136
if (stopBit)
139137
{
140138
sercom->prepareCommandBitsWire(WIRE_MASTER_ACT_STOP);

libraries/Wire/Wire.h

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

6969
bool transmissionBegun;
70-
bool repeatedStart;
7170

7271
// RX Buffer
7372
RingBuffer rxBuffer;

0 commit comments

Comments
 (0)