aboutsummaryrefslogtreecommitdiff
path: root/libraries/Wire
diff options
context:
space:
mode:
authorMatthew Lowe <mattwlowe@gmail.com>2015-06-30 22:47:55 -0600
committerMartino Facchin <m.facchin@arduino.cc>2015-07-03 16:59:30 +0200
commitc13cf02651e178ea7941a82bee364d82c6b19b9c (patch)
tree2425fe1c0ba7ec26d0c1857b64525d459404ff4b /libraries/Wire
parent37c29845f6a446354e492ea25c76705f6e177c7b (diff)
Support for repeated starts added to SAM Wire library
Additional interface method ported to avr for compatibility Fix issue #2428.
Diffstat (limited to 'libraries/Wire')
-rw-r--r--libraries/Wire/Wire.cpp24
-rw-r--r--libraries/Wire/Wire.h1
2 files changed, 24 insertions, 1 deletions
diff --git a/libraries/Wire/Wire.cpp b/libraries/Wire/Wire.cpp
index 553add7..835b794 100644
--- a/libraries/Wire/Wire.cpp
+++ b/libraries/Wire/Wire.cpp
@@ -80,8 +80,26 @@ void TwoWire::setClock(uint32_t frequency)
TWBR = ((F_CPU / frequency) - 16) / 2;
}
-uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity, uint8_t sendStop)
+uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity, uint32_t iaddress, uint8_t isize, uint8_t sendStop)
{
+ if (isize > 0) {
+ // send internal address; this mode allows sending a repeated start to access
+ // some devices' internal registers. This function is executed by the hardware
+ // TWI module on other processors (for example Due's TWI_IADR and TWI_MMR registers)
+
+ beginTransmission(address);
+
+ // the maximum size of internal address is 3 bytes
+ if (isize > 3){
+ isize = 3;
+ }
+
+ // write internal register address - most significant byte first
+ while (isize-- > 0)
+ write((uint8_t)(iaddress >> (isize*8)));
+ endTransmission(false);
+ }
+
// clamp to buffer length
if(quantity > BUFFER_LENGTH){
quantity = BUFFER_LENGTH;
@@ -95,6 +113,10 @@ uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity, uint8_t sendStop
return read;
}
+uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity, uint8_t sendStop) {
+ return requestFrom((uint8_t)address, (uint8_t)quantity, (uint32_t)0, (uint8_t)0, (uint8_t)sendStop);
+}
+
uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity)
{
return requestFrom((uint8_t)address, (uint8_t)quantity, (uint8_t)true);
diff --git a/libraries/Wire/Wire.h b/libraries/Wire/Wire.h
index 732bdc3..7d00959 100644
--- a/libraries/Wire/Wire.h
+++ b/libraries/Wire/Wire.h
@@ -56,6 +56,7 @@ class TwoWire : public Stream
uint8_t endTransmission(uint8_t);
uint8_t requestFrom(uint8_t, uint8_t);
uint8_t requestFrom(uint8_t, uint8_t, uint8_t);
+ uint8_t requestFrom(uint8_t, uint8_t, uint32_t, uint8_t, uint8_t);
uint8_t requestFrom(int, int);
uint8_t requestFrom(int, int, int);
virtual size_t write(uint8_t);