@@ -124,7 +124,7 @@ sfeTkError_t sfeTkArdI2C::writeRegisterByte(uint8_t devReg, uint8_t dataToWrite)
124124// ---------------------------------------------------------------------------------
125125// writeRegisterWord()
126126//
127- // Writes a world to a given register.
127+ // Writes a word to a given register.
128128//
129129// Returns true on success, false on failure
130130//
@@ -137,83 +137,58 @@ sfeTkError_t sfeTkArdI2C::writeRegisterWord(uint8_t devReg, uint16_t dataToWrite
137137}
138138
139139// ---------------------------------------------------------------------------------
140- // writeRegisterRegion ()
140+ // writeRegisterRegionAddress ()
141141//
142- // Writes an array of bytes to a given register on the target address
142+ // Writes an array of bytes of specified length to a given register on the
143+ // target address
143144//
144145// Returns the number of bytes written, < 0 is an error
145146//
146- sfeTkError_t sfeTkArdI2C::writeRegisterRegion (uint8_t devReg, const uint8_t *data, size_t length)
147+ sfeTkError_t sfeTkArdI2C::writeRegisterRegionAddress (uint8_t * devReg, size_t regLength , const uint8_t *data, size_t length)
147148{
148149 if (!_i2cPort)
149150 return kSTkErrBusNotInit ;
150151
151152 _i2cPort->beginTransmission (address ());
152- _i2cPort->write (devReg);
153+ _i2cPort->write (devReg, regLength );
153154 _i2cPort->write (data, (int )length);
154155
155156 return _i2cPort->endTransmission () ? kSTkErrFail : kSTkErrOk ;
156157}
157158
158159// ---------------------------------------------------------------------------------
159- // readRegisterByte ()
160+ // writeRegisterRegion ()
160161//
161- // Reads a byte to a given register.
162+ // Writes an array of bytes to a given register on the target address
162163//
163- // Returns true on success, false on failure
164+ // Returns the number of bytes written, < 0 is an error
164165//
165- sfeTkError_t sfeTkArdI2C::readRegisterByte (uint8_t devReg, uint8_t &dataToRead )
166+ sfeTkError_t sfeTkArdI2C::writeRegisterRegion (uint8_t devReg, const uint8_t *data, size_t length )
166167{
167- if (!_i2cPort)
168- return kSTkErrBusNotInit ;
169-
170- // Return value
171- uint8_t result = 0 ;
172-
173- int nData = 0 ;
174-
175- _i2cPort->beginTransmission (address ());
176- _i2cPort->write (devReg);
177- _i2cPort->endTransmission (stop ());
178- _i2cPort->requestFrom (address (), (uint8_t )1 );
179-
180- while (_i2cPort->available ()) // slave may send less than requested
181- {
182- result = _i2cPort->read (); // receive a byte as a proper uint8_t
183- nData++;
184- }
185-
186- if (nData == sizeof (uint8_t )) // Only update outputPointer if a single byte was returned
187- dataToRead = result;
188-
189- return (nData == sizeof (uint8_t ) ? kSTkErrOk : kSTkErrFail );
168+ return writeRegisterRegionAddress (&devReg, 1 , data, length);
190169}
170+
191171// ---------------------------------------------------------------------------------
192- // readRegisterWord ()
172+ // write16BitRegisterRegion ()
193173//
194- // Reads a world to a given register.
174+ // Writes an array of bytes to a given 16-bit register on the target address
195175//
196- // Returns true on success, false on failure
176+ // Returns the number of bytes written, < 0 is an error
197177//
198- sfeTkError_t sfeTkArdI2C::readRegisterWord ( uint8_t devReg, uint16_t &dataToRead )
178+ sfeTkError_t sfeTkArdI2C::writeRegister16Region ( uint16_t devReg, uint8_t *data, size_t length )
199179{
200- if (!_i2cPort)
201- return kSTkErrBusNotInit ;
202-
203- size_t nRead;
204- sfeTkError_t retval = readRegisterRegion (devReg, (uint8_t *)&dataToRead, sizeof (uint16_t ), nRead);
205-
206- return (retval == kSTkErrOk && nRead == sizeof (uint16_t ) ? kSTkErrOk : retval);
180+ devReg = ((devReg << 8 ) & 0xff00 ) | ((devReg >> 8 ) & 0x00ff );
181+ return writeRegisterRegionAddress ((uint8_t *)&devReg, 2 , data, length);
207182}
208183
209184// ---------------------------------------------------------------------------------
210- // readRegisterRegion ()
185+ // readRegisterRegionAnyAddress ()
211186//
212- // Reads an array of bytes to a given register on the target address
187+ // Reads an array of bytes to a register on the target address
213188//
214- // Returns the number of bytes read , < 0 is an error
189+ // Returns the number of bytes written , < 0 is an error
215190//
216- sfeTkError_t sfeTkArdI2C::readRegisterRegion (uint8_t devReg, uint8_t *data, size_t numBytes, size_t &readBytes)
191+ sfeTkError_t sfeTkArdI2C::readRegisterRegionAnyAddress (uint8_t * devReg, size_t regLength , uint8_t *data, size_t numBytes, size_t &readBytes)
217192{
218193
219194 // got port
@@ -238,7 +213,7 @@ sfeTkError_t sfeTkArdI2C::readRegisterRegion(uint8_t devReg, uint8_t *data, size
238213 {
239214 _i2cPort->beginTransmission (address ());
240215
241- _i2cPort->write (devReg);
216+ _i2cPort->write (devReg, regLength );
242217
243218 if (_i2cPort->endTransmission (stop ()) != 0 )
244219 return kSTkErrFail ; // error with the end transmission
@@ -269,3 +244,82 @@ sfeTkError_t sfeTkArdI2C::readRegisterRegion(uint8_t devReg, uint8_t *data, size
269244
270245 return (readBytes == nOrig) ? kSTkErrOk : kSTkErrBusUnderRead ; // Success
271246}
247+
248+
249+ // ---------------------------------------------------------------------------------
250+ // readRegisterByte()
251+ //
252+ // Reads a byte to a given register.
253+ //
254+ // Returns true on success, false on failure
255+ //
256+ sfeTkError_t sfeTkArdI2C::readRegisterByte (uint8_t devReg, uint8_t &dataToRead)
257+ {
258+ if (!_i2cPort)
259+ return kSTkErrBusNotInit ;
260+
261+ // Return value
262+ uint8_t result = 0 ;
263+
264+ int nData = 0 ;
265+
266+ _i2cPort->beginTransmission (address ());
267+ _i2cPort->write (devReg);
268+ _i2cPort->endTransmission (stop ());
269+ _i2cPort->requestFrom (address (), (uint8_t )1 );
270+
271+ while (_i2cPort->available ()) // slave may send less than requested
272+ {
273+ result = _i2cPort->read (); // receive a byte as a proper uint8_t
274+ nData++;
275+ }
276+
277+ if (nData == sizeof (uint8_t )) // Only update outputPointer if a single byte was returned
278+ dataToRead = result;
279+
280+ return (nData == sizeof (uint8_t ) ? kSTkErrOk : kSTkErrFail );
281+ }
282+
283+ // ---------------------------------------------------------------------------------
284+ // readRegisterWord()
285+ //
286+ // Reads a word to a given register.
287+ //
288+ // Returns true on success, false on failure
289+ //
290+ sfeTkError_t sfeTkArdI2C::readRegisterWord (uint8_t devReg, uint16_t &dataToRead)
291+ {
292+ if (!_i2cPort)
293+ return kSTkErrBusNotInit ;
294+
295+ size_t nRead;
296+ sfeTkError_t retval = readRegisterRegion (devReg, (uint8_t *)&dataToRead, sizeof (uint16_t ), nRead);
297+
298+ return (retval == kSTkErrOk && nRead == sizeof (uint16_t ) ? kSTkErrOk : retval);
299+ }
300+
301+ // ---------------------------------------------------------------------------------
302+ // readRegisterRegion()
303+ //
304+ // Reads an array of bytes to a given register on the target address
305+ //
306+ // Returns the number of bytes read, < 0 is an error
307+ //
308+ sfeTkError_t sfeTkArdI2C::readRegisterRegion (uint8_t devReg, uint8_t *data, size_t numBytes, size_t &readBytes)
309+ {
310+ return readRegisterRegionAnyAddress (&devReg, 1 , data, numBytes, readBytes);
311+ }
312+
313+ // ---------------------------------------------------------------------------------
314+ // read16BitRegisterRegion()
315+ //
316+ // Reads an array of bytes to a given 16-bit register on the target address
317+ //
318+ // Returns the number of bytes read, < 0 is an error
319+ //
320+ sfeTkError_t sfeTkArdI2C::readRegister16Region (uint16_t devReg, uint8_t *data, size_t numBytes)
321+ {
322+ size_t readBytes = 0 ;
323+ devReg = ((devReg << 8 ) & 0xff00 ) | ((devReg >> 8 ) & 0x00ff );
324+ return readRegisterRegionAnyAddress ((uint8_t *)&devReg, 2 , data, numBytes, readBytes);
325+ }
0 commit comments