@@ -136,108 +136,58 @@ sfeTkError_t sfeTkArdI2C::writeRegisterWord(uint8_t devReg, uint16_t dataToWrite
136136 return writeRegisterRegion (devReg, (uint8_t *)&dataToWrite, sizeof (uint16_t ));
137137}
138138
139- // ---------------------------------------------------------------------------------
140- // writeRegisterRegion()
141- //
142- // Writes an array of bytes to a given register on the target address
143- //
144- // Returns the number of bytes written, < 0 is an error
145- //
146- sfeTkError_t sfeTkArdI2C::writeRegisterRegion (uint8_t devReg, const uint8_t *data, size_t length)
139+ sfeTkError_t sfeTkArdI2C::writeRegisterRegionAddress (uint8_t *devReg, size_t regLength, const uint8_t *data, size_t length)
147140{
148141 if (!_i2cPort)
149142 return kSTkErrBusNotInit ;
150143
151144 _i2cPort->beginTransmission (address ());
152- _i2cPort->write (devReg);
145+ _i2cPort->write (devReg, regLength );
153146 _i2cPort->write (data, (int )length);
154147
155148 return _i2cPort->endTransmission () ? kSTkErrFail : kSTkErrOk ;
156149}
157150
158151// ---------------------------------------------------------------------------------
159- // write16BitRegisterRegion ()
152+ // writeRegisterRegion ()
160153//
161- // Writes an array of bytes to a given 16-bit register on the target address
154+ // Writes an array of bytes to a given register on the target address
162155//
163156// Returns the number of bytes written, < 0 is an error
164157//
165- // sfeTkError_t sfeTkArdI2C::write16BitRegisterRegion(uint16_t devReg, uint8_t *data, size_t length)
166- sfeTkError_t sfeTkArdI2C::writeRegister16Region (uint16_t devReg, uint8_t *data, size_t length)
167-
158+ sfeTkError_t sfeTkArdI2C::writeRegisterRegion (uint8_t devReg, const uint8_t *data, size_t length)
168159{
169- if (!_i2cPort)
170- return kSTkErrBusNotInit ;
171- _i2cPort->beginTransmission (address ());
172- _i2cPort->write ((devReg >> 8 ) & 0xff );
173- _i2cPort->write (devReg & 0xff );
174- for (int i = 0 ; i < length; i++)
175- {
176- _i2cPort->write (data[i]);
177- }
178-
179- return _i2cPort->endTransmission () ? kSTkErrFail : kSTkErrOk ;
160+ return writeRegisterRegionAddress (&devReg, 1 , data, length);
180161}
181162
182163// ---------------------------------------------------------------------------------
183- // readRegisterByte ()
164+ // write16BitRegisterRegion ()
184165//
185- // Reads a byte to a given register.
166+ // Writes an array of bytes to a given 16-bit register on the target address
186167//
187- // Returns true on success, false on failure
168+ // Returns the number of bytes written, < 0 is an error
188169//
189- sfeTkError_t sfeTkArdI2C::readRegisterByte (uint8_t devReg, uint8_t &dataToRead)
190- {
191- if (!_i2cPort)
192- return kSTkErrBusNotInit ;
193-
194- // Return value
195- uint8_t result = 0 ;
196-
197- int nData = 0 ;
198-
199- _i2cPort->beginTransmission (address ());
200- _i2cPort->write (devReg);
201- _i2cPort->endTransmission (stop ());
202- _i2cPort->requestFrom (address (), (uint8_t )1 );
203-
204- while (_i2cPort->available ()) // slave may send less than requested
205- {
206- result = _i2cPort->read (); // receive a byte as a proper uint8_t
207- nData++;
208- }
209-
210- if (nData == sizeof (uint8_t )) // Only update outputPointer if a single byte was returned
211- dataToRead = result;
170+ // sfeTkError_t sfeTkArdI2C::writeRegister16Region(uint16_t devReg, uint8_t *data, size_t length)
171+ // {
172+ // if (!_i2cPort)
173+ // return kSTkErrBusNotInit;
174+ // _i2cPort->beginTransmission(address());
175+ // _i2cPort->write((devReg >> 8) & 0xff);
176+ // _i2cPort->write(devReg & 0xff);
177+ // for(int i = 0; i < length; i++)
178+ // {
179+ // _i2cPort->write(data[i]);
180+ // }
181+ // return _i2cPort->endTransmission() ? kSTkErrFail : kSTkErrOk;
182+ // }
212183
213- return (nData == sizeof (uint8_t ) ? kSTkErrOk : kSTkErrFail );
214- }
215- // ---------------------------------------------------------------------------------
216- // readRegisterWord()
217- //
218- // Reads a world to a given register.
219- //
220- // Returns true on success, false on failure
221- //
222- sfeTkError_t sfeTkArdI2C::readRegisterWord (uint8_t devReg, uint16_t &dataToRead)
184+ sfeTkError_t sfeTkArdI2C::writeRegister16Region (uint16_t devReg, uint8_t *data, size_t length)
223185{
224- if (!_i2cPort)
225- return kSTkErrBusNotInit ;
226-
227- size_t nRead;
228- sfeTkError_t retval = readRegisterRegion (devReg, (uint8_t *)&dataToRead, sizeof (uint16_t ), nRead);
229-
230- return (retval == kSTkErrOk && nRead == sizeof (uint16_t ) ? kSTkErrOk : retval);
186+ devReg = ((devReg << 8 ) & 0xff00 ) | ((devReg >> 8 ) & 0x00ff );
187+ return writeRegisterRegionAddress ((uint8_t *)&devReg, 2 , data, length);
231188}
232189
233- // ---------------------------------------------------------------------------------
234- // readRegisterRegion()
235- //
236- // Reads an array of bytes to a given register on the target address
237- //
238- // Returns the number of bytes read, < 0 is an error
239- //
240- sfeTkError_t sfeTkArdI2C::readRegisterRegion (uint8_t devReg, uint8_t *data, size_t numBytes, size_t &readBytes)
190+ sfeTkError_t sfeTkArdI2C::readRegisterRegionAnyAddress (uint8_t *devReg, size_t regLength, uint8_t *data, size_t numBytes, size_t &readBytes)
241191{
242192
243193 // got port
@@ -262,7 +212,10 @@ sfeTkError_t sfeTkArdI2C::readRegisterRegion(uint8_t devReg, uint8_t *data, size
262212 {
263213 _i2cPort->beginTransmission (address ());
264214
265- _i2cPort->write (devReg);
215+ // uint16_t *foo = (uint16_t*)devReg;
216+ // _i2cPort->write((*foo >> 8) & 0xff);
217+ // _i2cPort->write(*foo & 0xff);
218+ _i2cPort->write (devReg, regLength);
266219
267220 if (_i2cPort->endTransmission (stop ()) != 0 )
268221 return kSTkErrFail ; // error with the end transmission
@@ -295,80 +248,81 @@ sfeTkError_t sfeTkArdI2C::readRegisterRegion(uint8_t devReg, uint8_t *data, size
295248}
296249
297250
298-
299-
300251// ---------------------------------------------------------------------------------
301- // read16BitRegisterRegion ()
252+ // readRegisterByte ()
302253//
303- // Reads an array of bytes to a given 16-bit register on the target address
254+ // Reads a byte to a given register.
304255//
305- // Returns the number of bytes read, < 0 is an error
256+ // Returns true on success, false on failure
306257//
307- // sfeTkError_t sfeTkArdI2C::read16BitRegisterRegion(uint16_t devReg, uint8_t *data, size_t numBytes, size_t *readBytes)
308- sfeTkError_t sfeTkArdI2C::readRegister16Region (uint16_t devReg, uint8_t *data, size_t numBytes, size_t *readBytes)
258+ sfeTkError_t sfeTkArdI2C::readRegisterByte (uint8_t devReg, uint8_t &dataToRead)
309259{
310-
311- // got port
312260 if (!_i2cPort)
313261 return kSTkErrBusNotInit ;
314262
315- // Buffer valid?
316- if (!data)
317- return kSTkErrBusNullBuffer ;
318-
319- if (readBytes != nullptr )
320- {
321- readBytes = 0 ;
322- }
323-
324- uint16_t nOrig = numBytes; // original number of bytes.
325- uint8_t nChunk;
326- uint16_t nReturned;
327- uint16_t i; // counter in loop
328- bool bFirstInter = true ; // Flag for first iteration - used to send devRegister
329-
330- while (numBytes > 0 )
331- {
332- if (bFirstInter)
333- {
334- _i2cPort->beginTransmission (address ());
335-
336- _i2cPort->write ((devReg >> 8 ) & 0xff );
337- _i2cPort->write (devReg & 0xff );
338-
339- if (_i2cPort->endTransmission (stop ()) != 0 )
340- return kSTkErrFail ; // error with the end transmission
263+ // Return value
264+ uint8_t result = 0 ;
341265
342- bFirstInter = false ;
343- }
266+ int nData = 0 ;
344267
345- // We're chunking in data - keeping the max chunk to kMaxI2CBufferLength
346- nChunk = numBytes > _bufferChunkSize ? _bufferChunkSize : numBytes;
268+ _i2cPort->beginTransmission (address ());
269+ _i2cPort->write (devReg);
270+ _i2cPort->endTransmission (stop ());
271+ _i2cPort->requestFrom (address (), (uint8_t )1 );
347272
348- // Request the bytes. If this is the last chunk, always send a stop
349- nReturned = _i2cPort->requestFrom ((int )address (), (int )nChunk, (int )(nChunk == numBytes ? true : stop ()));
273+ while (_i2cPort->available ()) // slave may send less than requested
274+ {
275+ result = _i2cPort->read (); // receive a byte as a proper uint8_t
276+ nData++;
277+ }
350278
351- // No data returned, no dice
352- if (nReturned == 0 )
353- return kSTkErrBusUnderRead ; // error
279+ if (nData == sizeof (uint8_t )) // Only update outputPointer if a single byte was returned
280+ dataToRead = result;
354281
355- // Copy the retrieved data chunk to the current index in the data segment
356- for (i = 0 ; i < nReturned; i++)
357- *data++ = _i2cPort->read ();
282+ return (nData == sizeof (uint8_t ) ? kSTkErrOk : kSTkErrFail );
283+ }
284+ // ---------------------------------------------------------------------------------
285+ // readRegisterWord()
286+ //
287+ // Reads a world to a given register.
288+ //
289+ // Returns true on success, false on failure
290+ //
291+ sfeTkError_t sfeTkArdI2C::readRegisterWord (uint8_t devReg, uint16_t &dataToRead)
292+ {
293+ if (!_i2cPort)
294+ return kSTkErrBusNotInit ;
358295
359- // Decrement the amount of data received from the overall data request amount
360- numBytes = numBytes - nReturned ;
296+ size_t nRead;
297+ sfeTkError_t retval = readRegisterRegion (devReg, ( uint8_t *)&dataToRead, sizeof ( uint16_t ), nRead) ;
361298
362- } // end while
299+ return (retval == kSTkErrOk && nRead == sizeof (uint16_t ) ? kSTkErrOk : retval);
300+ }
363301
364- if (readBytes != nullptr )
365- {
366- *readBytes = nOrig - numBytes; // Bytes read.
302+ // ---------------------------------------------------------------------------------
303+ // readRegisterRegion()
304+ //
305+ // Reads an array of bytes to a given register on the target address
306+ //
307+ // Returns the number of bytes read, < 0 is an error
308+ //
309+ sfeTkError_t sfeTkArdI2C::readRegisterRegion (uint8_t devReg, uint8_t *data, size_t numBytes, size_t &readBytes)
310+ {
311+ return readRegisterRegionAnyAddress (&devReg, 1 , data, numBytes, readBytes);
312+ }
367313
368- return (*readBytes == nOrig) ? kSTkErrOk : kSTkErrBusUnderRead ; // Success
369- }
370- else
371- {
372- return (numBytes == 0 ) ? kSTkErrOk : kSTkErrBusUnderRead ; // Success
373- }
374- }
314+ // ---------------------------------------------------------------------------------
315+ // read16BitRegisterRegion()
316+ //
317+ // Reads an array of bytes to a given 16-bit register on the target address
318+ //
319+ // Returns the number of bytes read, < 0 is an error
320+ //
321+ sfeTkError_t sfeTkArdI2C::readRegister16Region (uint16_t devReg, uint8_t *data, size_t numBytes)
322+ {
323+ size_t readBytes = 0 ;
324+ devReg = ((devReg << 8 ) & 0xff00 ) | ((devReg >> 8 ) & 0x00ff );
325+ // _i2cPort->write((devReg >> 8) & 0xff);
326+ // _i2cPort->write(devReg & 0xff);
327+ return readRegisterRegionAnyAddress ((uint8_t *)&devReg, 2 , data, numBytes, readBytes);
328+ }
0 commit comments