@@ -136,108 +136,58 @@ sfeTkError_t sfeTkArdI2C::writeRegisterWord(uint8_t devReg, uint16_t dataToWrite
136
136
return writeRegisterRegion (devReg, (uint8_t *)&dataToWrite, sizeof (uint16_t ));
137
137
}
138
138
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)
147
140
{
148
141
if (!_i2cPort)
149
142
return kSTkErrBusNotInit ;
150
143
151
144
_i2cPort->beginTransmission (address ());
152
- _i2cPort->write (devReg);
145
+ _i2cPort->write (devReg, regLength );
153
146
_i2cPort->write (data, (int )length);
154
147
155
148
return _i2cPort->endTransmission () ? kSTkErrFail : kSTkErrOk ;
156
149
}
157
150
158
151
// ---------------------------------------------------------------------------------
159
- // write16BitRegisterRegion ()
152
+ // writeRegisterRegion ()
160
153
//
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
162
155
//
163
156
// Returns the number of bytes written, < 0 is an error
164
157
//
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)
168
159
{
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);
180
161
}
181
162
182
163
// ---------------------------------------------------------------------------------
183
- // readRegisterByte ()
164
+ // write16BitRegisterRegion ()
184
165
//
185
- // Reads a byte to a given register.
166
+ // Writes an array of bytes to a given 16-bit register on the target address
186
167
//
187
- // Returns true on success, false on failure
168
+ // Returns the number of bytes written, < 0 is an error
188
169
//
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
+ // }
212
183
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)
223
185
{
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);
231
188
}
232
189
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)
241
191
{
242
192
243
193
// got port
@@ -262,7 +212,10 @@ sfeTkError_t sfeTkArdI2C::readRegisterRegion(uint8_t devReg, uint8_t *data, size
262
212
{
263
213
_i2cPort->beginTransmission (address ());
264
214
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);
266
219
267
220
if (_i2cPort->endTransmission (stop ()) != 0 )
268
221
return kSTkErrFail ; // error with the end transmission
@@ -295,80 +248,81 @@ sfeTkError_t sfeTkArdI2C::readRegisterRegion(uint8_t devReg, uint8_t *data, size
295
248
}
296
249
297
250
298
-
299
-
300
251
// ---------------------------------------------------------------------------------
301
- // read16BitRegisterRegion ()
252
+ // readRegisterByte ()
302
253
//
303
- // Reads an array of bytes to a given 16-bit register on the target address
254
+ // Reads a byte to a given register.
304
255
//
305
- // Returns the number of bytes read, < 0 is an error
256
+ // Returns true on success, false on failure
306
257
//
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)
309
259
{
310
-
311
- // got port
312
260
if (!_i2cPort)
313
261
return kSTkErrBusNotInit ;
314
262
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 ;
341
265
342
- bFirstInter = false ;
343
- }
266
+ int nData = 0 ;
344
267
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 );
347
272
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
+ }
350
278
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;
354
281
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 ;
358
295
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) ;
361
298
362
- } // end while
299
+ return (retval == kSTkErrOk && nRead == sizeof (uint16_t ) ? kSTkErrOk : retval);
300
+ }
363
301
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
+ }
367
313
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