Skip to content

Commit c13cf02

Browse files
mattwlowefacchinm
authored andcommitted
Support for repeated starts added to SAM Wire library
Additional interface method ported to avr for compatibility Fix issue #2428.
1 parent 37c2984 commit c13cf02

File tree

2 files changed

+24
-1
lines changed

2 files changed

+24
-1
lines changed

libraries/Wire/Wire.cpp

+23-1
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,26 @@ void TwoWire::setClock(uint32_t frequency)
8080
TWBR = ((F_CPU / frequency) - 16) / 2;
8181
}
8282

83-
uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity, uint8_t sendStop)
83+
uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity, uint32_t iaddress, uint8_t isize, uint8_t sendStop)
8484
{
85+
if (isize > 0) {
86+
// send internal address; this mode allows sending a repeated start to access
87+
// some devices' internal registers. This function is executed by the hardware
88+
// TWI module on other processors (for example Due's TWI_IADR and TWI_MMR registers)
89+
90+
beginTransmission(address);
91+
92+
// the maximum size of internal address is 3 bytes
93+
if (isize > 3){
94+
isize = 3;
95+
}
96+
97+
// write internal register address - most significant byte first
98+
while (isize-- > 0)
99+
write((uint8_t)(iaddress >> (isize*8)));
100+
endTransmission(false);
101+
}
102+
85103
// clamp to buffer length
86104
if(quantity > BUFFER_LENGTH){
87105
quantity = BUFFER_LENGTH;
@@ -95,6 +113,10 @@ uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity, uint8_t sendStop
95113
return read;
96114
}
97115

116+
uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity, uint8_t sendStop) {
117+
return requestFrom((uint8_t)address, (uint8_t)quantity, (uint32_t)0, (uint8_t)0, (uint8_t)sendStop);
118+
}
119+
98120
uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity)
99121
{
100122
return requestFrom((uint8_t)address, (uint8_t)quantity, (uint8_t)true);

libraries/Wire/Wire.h

+1
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ class TwoWire : public Stream
5656
uint8_t endTransmission(uint8_t);
5757
uint8_t requestFrom(uint8_t, uint8_t);
5858
uint8_t requestFrom(uint8_t, uint8_t, uint8_t);
59+
uint8_t requestFrom(uint8_t, uint8_t, uint32_t, uint8_t, uint8_t);
5960
uint8_t requestFrom(int, int);
6061
uint8_t requestFrom(int, int, int);
6162
virtual size_t write(uint8_t);

0 commit comments

Comments
 (0)