@@ -80,8 +80,26 @@ void TwoWire::setClock(uint32_t frequency)
80
80
TWBR = ((F_CPU / frequency) - 16 ) / 2 ;
81
81
}
82
82
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)
84
84
{
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
+
85
103
// clamp to buffer length
86
104
if (quantity > BUFFER_LENGTH){
87
105
quantity = BUFFER_LENGTH;
@@ -95,6 +113,10 @@ uint8_t TwoWire::requestFrom(uint8_t address, uint8_t quantity, uint8_t sendStop
95
113
return read ;
96
114
}
97
115
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
+
98
120
uint8_t TwoWire::requestFrom (uint8_t address, uint8_t quantity)
99
121
{
100
122
return requestFrom ((uint8_t )address, (uint8_t )quantity, (uint8_t )true );
0 commit comments