@@ -180,7 +180,7 @@ sfeTkError_t sfeTkArdI2C::writeRegisterRegionAddress(uint8_t *devReg, size_t reg
180180
181181 _i2cPort->beginTransmission (address ());
182182
183- if (devReg != nullptr && regLength > 0 )
183+ if (devReg != nullptr && regLength > 0 )
184184 _i2cPort->write (devReg, regLength);
185185
186186 _i2cPort->write (data, (int )length);
@@ -213,7 +213,23 @@ sfeTkError_t sfeTkArdI2C::writeRegister16Region(uint16_t devReg, const uint8_t *
213213 return writeRegisterRegionAddress ((uint8_t *)&devReg, 2 , data, length);
214214}
215215
216+ // ---------------------------------------------------------------------------------
217+ // write16BitRegisterRegion16()
218+ //
219+ // Writes an array of bytes to a given 16-bit register on the target address
220+ //
221+ // Returns the number of bytes written, < 0 is an error
222+ //
223+ sfeTkError_t sfeTkArdI2C::writeRegister16Region16 (uint16_t devReg, const uint16_t *data, size_t length)
224+ {
225+ devReg = ((devReg << 8 ) & 0xff00 ) | ((devReg >> 8 ) & 0x00ff );
216226
227+ uint16_t data16[length];
228+ // TODO determine local endianess and convert if needed
229+ for (size_t i = 0 ; i < length; i++)
230+ data16[i] = ((data[i] << 8 ) & 0xff00 ) | ((data[i] >> 8 ) & 0x00ff );
231+ return writeRegisterRegionAddress ((uint8_t *)&devReg, 2 , (uint8_t *)data16, length * 2 );
232+ }
217233
218234/* *
219235 * @brief Reads an array of bytes to a register on the target address. Supports any address size
@@ -359,3 +375,23 @@ sfeTkError_t sfeTkArdI2C::readRegister16Region(uint16_t devReg, uint8_t *data, s
359375 devReg = ((devReg << 8 ) & 0xff00 ) | ((devReg >> 8 ) & 0x00ff );
360376 return readRegisterRegionAnyAddress ((uint8_t *)&devReg, 2 , data, numBytes, readBytes);
361377}
378+ // ---------------------------------------------------------------------------------
379+ // read16BitRegisterRegion16()
380+ //
381+ // Reads an array of bytes to a given 16-bit register on the target address
382+ //
383+ // Returns the number of bytes read, < 0 is an error
384+ //
385+ sfeTkError_t sfeTkArdI2C::readRegister16Region16 (uint16_t devReg, uint16_t *data, size_t numBytes, size_t &readBytes)
386+ {
387+ devReg = ((devReg << 8 ) & 0xff00 ) | ((devReg >> 8 ) & 0x00ff );
388+ sfeTkError_t status = readRegisterRegionAnyAddress ((uint8_t *)&devReg, 2 , (uint8_t *)data, numBytes * 2 , readBytes);
389+
390+ // TODO determine local endianess and convert if needed
391+ if (status == kSTkErrOk )
392+ {
393+ for (size_t i = 0 ; i < numBytes; i++)
394+ data[i] = ((data[i] << 8 ) & 0xff00 ) | ((data[i] >> 8 ) & 0x00ff );
395+ }
396+ return status;
397+ }
0 commit comments