@@ -124,7 +124,7 @@ sfeTkError_t sfeTkArdI2C::writeRegisterByte(uint8_t devReg, uint8_t dataToWrite)
124
124
// ---------------------------------------------------------------------------------
125
125
// writeRegisterWord()
126
126
//
127
- // Writes a world to a given register.
127
+ // Writes a word to a given register.
128
128
//
129
129
// Returns true on success, false on failure
130
130
//
@@ -137,83 +137,58 @@ sfeTkError_t sfeTkArdI2C::writeRegisterWord(uint8_t devReg, uint16_t dataToWrite
137
137
}
138
138
139
139
// ---------------------------------------------------------------------------------
140
- // writeRegisterRegion ()
140
+ // writeRegisterRegionAddress ()
141
141
//
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
143
144
//
144
145
// Returns the number of bytes written, < 0 is an error
145
146
//
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)
147
148
{
148
149
if (!_i2cPort)
149
150
return kSTkErrBusNotInit ;
150
151
151
152
_i2cPort->beginTransmission (address ());
152
- _i2cPort->write (devReg);
153
+ _i2cPort->write (devReg, regLength );
153
154
_i2cPort->write (data, (int )length);
154
155
155
156
return _i2cPort->endTransmission () ? kSTkErrFail : kSTkErrOk ;
156
157
}
157
158
158
159
// ---------------------------------------------------------------------------------
159
- // readRegisterByte ()
160
+ // writeRegisterRegion ()
160
161
//
161
- // Reads a byte to a given register.
162
+ // Writes an array of bytes to a given register on the target address
162
163
//
163
- // Returns true on success, false on failure
164
+ // Returns the number of bytes written, < 0 is an error
164
165
//
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 )
166
167
{
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);
190
169
}
170
+
191
171
// ---------------------------------------------------------------------------------
192
- // readRegisterWord ()
172
+ // write16BitRegisterRegion ()
193
173
//
194
- // Reads a world to a given register.
174
+ // Writes an array of bytes to a given 16-bit register on the target address
195
175
//
196
- // Returns true on success, false on failure
176
+ // Returns the number of bytes written, < 0 is an error
197
177
//
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 )
199
179
{
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);
207
182
}
208
183
209
184
// ---------------------------------------------------------------------------------
210
- // readRegisterRegion ()
185
+ // readRegisterRegionAnyAddress ()
211
186
//
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
213
188
//
214
- // Returns the number of bytes read , < 0 is an error
189
+ // Returns the number of bytes written , < 0 is an error
215
190
//
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)
217
192
{
218
193
219
194
// got port
@@ -238,7 +213,7 @@ sfeTkError_t sfeTkArdI2C::readRegisterRegion(uint8_t devReg, uint8_t *data, size
238
213
{
239
214
_i2cPort->beginTransmission (address ());
240
215
241
- _i2cPort->write (devReg);
216
+ _i2cPort->write (devReg, regLength );
242
217
243
218
if (_i2cPort->endTransmission (stop ()) != 0 )
244
219
return kSTkErrFail ; // error with the end transmission
@@ -269,3 +244,82 @@ sfeTkError_t sfeTkArdI2C::readRegisterRegion(uint8_t devReg, uint8_t *data, size
269
244
270
245
return (readBytes == nOrig) ? kSTkErrOk : kSTkErrBusUnderRead ; // Success
271
246
}
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