Skip to content

Commit 861c89a

Browse files
Operational code for 16bit registers
Need to clean up a bit, but the code is now functional and able to read/write to the proper registers with the proper data.
1 parent a76ebbb commit 861c89a

File tree

3 files changed

+98
-140
lines changed

3 files changed

+98
-140
lines changed

src/sfeTk/sfeTkIBus.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ class sfeTkIBus
150150
@retval int returns kSTkErrOk on success, or kSTkErrFail code
151151
152152
*/
153-
virtual sfeTkError_t readRegister16Region(uint16_t reg, uint8_t *data, size_t numBytes, size_t *readBytes = nullptr) = 0;
153+
virtual sfeTkError_t readRegister16Region(uint16_t reg, uint8_t *data, size_t numBytes) = 0;
154154

155155
};
156156

src/sfeTkArdI2C.cpp

Lines changed: 91 additions & 137 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
}

src/sfeTkArdI2C.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,8 +200,8 @@ class sfeTkArdI2C : public sfeTkII2C
200200
201201
@retval int returns kSTkErrOk on success, or kSTkErrFail code
202202
203-
*/
204-
sfeTkError_t readRegister16Region(uint16_t reg, uint8_t *data, size_t numBytes, size_t *readBytes = nullptr);
203+
*/
204+
sfeTkError_t readRegister16Region(uint16_t reg, uint8_t *data, size_t numBytes);
205205

206206
// Buffer size chunk getter/setter
207207
/*--------------------------------------------------------------------------
@@ -237,6 +237,10 @@ class sfeTkArdI2C : public sfeTkII2C
237237
TwoWire *_i2cPort;
238238

239239
private:
240+
sfeTkError_t writeRegisterRegionAddress(uint8_t *devReg, size_t regLength, const uint8_t *data, size_t length);
241+
242+
sfeTkError_t readRegisterRegionAnyAddress(uint8_t *devReg, size_t regLength, uint8_t *data, size_t numBytes, size_t &readBytes);
243+
240244
static constexpr size_t kDefaultBufferChunk = 32;
241245

242246
// the I2C buffer chunker size

0 commit comments

Comments
 (0)