@@ -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+
98120uint8_t TwoWire::requestFrom (uint8_t address, uint8_t quantity)
99121{
100122 return requestFrom ((uint8_t )address, (uint8_t )quantity, (uint8_t )true );
0 commit comments