Skip to content

Commit ec4aaad

Browse files
committed
added methods to send 16bit works on the bus - using BIG endian byte ordering
1 parent 97a2ab1 commit ec4aaad

File tree

5 files changed

+169
-3
lines changed

5 files changed

+169
-3
lines changed

src/sfeTk/sfeTkIBus.h

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ class sfeTkIBus
9696
virtual sfeTkError_t writeByte(uint8_t data) = 0;
9797

9898
/**--------------------------------------------------------------------------
99-
* @brief Send a word to the device.
99+
* @brief Send a word to the device.
100100
* @param data Data to write.
101101
*
102102
* @retval sfeTkError_t - kSTkErrOk on successful execution.
@@ -160,6 +160,17 @@ class sfeTkIBus
160160
*/
161161
virtual sfeTkError_t writeRegister16Region(uint16_t devReg, const uint8_t *data, size_t length) = 0;
162162

163+
/**--------------------------------------------------------------------------
164+
* @brief Writes a number of uint16's starting at the given register's 16-bit address.
165+
*
166+
* @param devReg The device's register's address.
167+
* @param data Data to write.
168+
* @param length - length of data
169+
*
170+
* @retval sfeTkError_t kSTkErrOk on successful execution
171+
*
172+
*/
173+
virtual sfeTkError_t writeRegister16Region16(uint16_t devReg, const uint16_t *data, size_t length) = 0;
163174
/**--------------------------------------------------------------------------
164175
* @brief Read a single byte from the given register
165176
*
@@ -206,6 +217,19 @@ class sfeTkIBus
206217
*
207218
*/
208219
virtual sfeTkError_t readRegister16Region(uint16_t reg, uint8_t *data, size_t numBytes, size_t &readBytes) = 0;
220+
221+
/**--------------------------------------------------------------------------
222+
* @brief Reads a block of data from the given 16-bit register address.
223+
*
224+
* @param reg The device's 16 bit register's address.
225+
* @param data Data to write.
226+
* @param numBytes - length of data
227+
* @param[out] readBytes - number of bytes read
228+
*
229+
* @retval int returns kSTkErrOk on success, or kSTkErrFail code
230+
*
231+
*/
232+
virtual sfeTkError_t readRegister16Region16(uint16_t reg, uint16_t *data, size_t numBytes, size_t &readBytes) = 0;
209233
};
210234

211235
//};

src/sfeTkArdI2C.cpp

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ sfeTkError_t sfeTkArdI2C::writeRegisterRegionAddress(uint8_t *devReg, size_t reg
180180

181181
_i2cPort->beginTransmission(address());
182182

183-
if(devReg != nullptr && regLength > 0)
183+
if (devReg != nullptr && regLength > 0)
184184
_i2cPort->write(devReg, regLength);
185185

186186
_i2cPort->write(data, (int)length);
@@ -213,7 +213,23 @@ sfeTkError_t sfeTkArdI2C::writeRegister16Region(uint16_t devReg, const uint8_t *
213213
return writeRegisterRegionAddress((uint8_t *)&devReg, 2, data, length);
214214
}
215215

216+
//---------------------------------------------------------------------------------
217+
// write16BitRegisterRegion16()
218+
//
219+
// Writes an array of bytes to a given 16-bit register on the target address
220+
//
221+
// Returns the number of bytes written, < 0 is an error
222+
//
223+
sfeTkError_t sfeTkArdI2C::writeRegister16Region16(uint16_t devReg, const uint16_t *data, size_t length)
224+
{
225+
devReg = ((devReg << 8) & 0xff00) | ((devReg >> 8) & 0x00ff);
216226

227+
uint16_t data16[length];
228+
// TODO determine local endianess and convert if needed
229+
for (size_t i = 0; i < length; i++)
230+
data16[i] = ((data[i] << 8) & 0xff00) | ((data[i] >> 8) & 0x00ff);
231+
return writeRegisterRegionAddress((uint8_t *)&devReg, 2, (uint8_t *)data16, length * 2);
232+
}
217233

218234
/**
219235
* @brief Reads an array of bytes to a register on the target address. Supports any address size
@@ -359,3 +375,23 @@ sfeTkError_t sfeTkArdI2C::readRegister16Region(uint16_t devReg, uint8_t *data, s
359375
devReg = ((devReg << 8) & 0xff00) | ((devReg >> 8) & 0x00ff);
360376
return readRegisterRegionAnyAddress((uint8_t *)&devReg, 2, data, numBytes, readBytes);
361377
}
378+
//---------------------------------------------------------------------------------
379+
// read16BitRegisterRegion16()
380+
//
381+
// Reads an array of bytes to a given 16-bit register on the target address
382+
//
383+
// Returns the number of bytes read, < 0 is an error
384+
//
385+
sfeTkError_t sfeTkArdI2C::readRegister16Region16(uint16_t devReg, uint16_t *data, size_t numBytes, size_t &readBytes)
386+
{
387+
devReg = ((devReg << 8) & 0xff00) | ((devReg >> 8) & 0x00ff);
388+
sfeTkError_t status = readRegisterRegionAnyAddress((uint8_t *)&devReg, 2, (uint8_t *)data, numBytes * 2, readBytes);
389+
390+
// TODO determine local endianess and convert if needed
391+
if (status == kSTkErrOk)
392+
{
393+
for (size_t i = 0; i < numBytes; i++)
394+
data[i] = ((data[i] << 8) & 0xff00) | ((data[i] >> 8) & 0x00ff);
395+
}
396+
return status;
397+
}

src/sfeTkArdI2C.h

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,18 @@ class sfeTkArdI2C : public sfeTkII2C
187187
*/
188188
sfeTkError_t writeRegister16Region(uint16_t devReg, const uint8_t *data, size_t length);
189189

190+
/**
191+
@brief Writes a number of bytes starting at the given register's 16-bit address.
192+
193+
@param devReg The device's register's address - 16 bit.
194+
@param data Data to write.
195+
@param length - length of data
196+
197+
@retval sfeTkError_t kSTkErrOk on successful execution
198+
199+
*/
200+
sfeTkError_t writeRegister16Region16(uint16_t devReg, const uint16_t *data, size_t length);
201+
190202
/**
191203
@brief Reads a byte of data from the given register.
192204
@@ -240,6 +252,19 @@ class sfeTkArdI2C : public sfeTkII2C
240252
*/
241253
sfeTkError_t readRegister16Region(uint16_t reg, uint8_t *data, size_t numBytes, size_t &readBytes);
242254

255+
/**
256+
@brief Reads a block of data from the given 16-bit register address.
257+
258+
@param reg The device's 16 bit register's address.
259+
@param data Data buffer to read into
260+
@param numBytes - Number of bytes to read/length of data buffer
261+
@param[out] readBytes - number of bytes read
262+
263+
@retval int returns kSTkErrOk on success, or kSTkErrFail code
264+
265+
*/
266+
sfeTkError_t readRegister16Region16(uint16_t reg, uint16_t *data, size_t numBytes, size_t &readBytes);
267+
243268
// Buffer size chunk getter/setter
244269
/**
245270
@brief set the buffer chunk size

src/sfeTkArdSPI.cpp

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,6 @@ sfeTkError_t sfeTkArdSPI::writeWord(uint16_t dataToWrite)
120120
return writeRegion((uint8_t *)&dataToWrite, sizeof(uint8_t)) > 0;
121121
}
122122

123-
124123
//---------------------------------------------------------------------------------
125124
// writeRegion()
126125
//
@@ -240,6 +239,30 @@ sfeTkError_t sfeTkArdSPI::writeRegister16Region(uint16_t devReg, const uint8_t *
240239
return kSTkErrOk;
241240
}
242241

242+
//---------------------------------------------------------------------------------
243+
// 16 bit address and data version ...
244+
sfeTkError_t sfeTkArdSPI::writeRegister16Region16(uint16_t devReg, const uint16_t *data, size_t length)
245+
{
246+
if (!_spiPort)
247+
return kSTkErrBusNotInit;
248+
249+
// Apply settings before work
250+
_spiPort->beginTransaction(_sfeSPISettings);
251+
252+
// Signal communication start
253+
digitalWrite(cs(), LOW);
254+
_spiPort->transfer16(devReg);
255+
256+
for (size_t i = 0; i < length; i++)
257+
_spiPort->transfer16(*data++);
258+
259+
// End communication
260+
digitalWrite(cs(), HIGH);
261+
_spiPort->endTransaction();
262+
263+
return kSTkErrOk;
264+
}
265+
//---------------------------------------------------------------------------------
243266
sfeTkError_t sfeTkArdSPI::readRegisterByte(uint8_t devReg, uint8_t &data)
244267
{
245268
size_t nRead;
@@ -320,3 +343,36 @@ sfeTkError_t sfeTkArdSPI::readRegister16Region(uint16_t devReg, uint8_t *data, s
320343

321344
return kSTkErrOk;
322345
}
346+
347+
//---------------------------------------------------------------------------------
348+
// readRegister16Region16()
349+
//
350+
// Reads an array of uint16 to a given a 16 bit register on the target address
351+
//
352+
// Returns kSTkErrOk on success
353+
//
354+
sfeTkError_t sfeTkArdSPI::readRegister16Region16(uint16_t devReg, uint16_t *data, size_t numBytes, size_t &readBytes)
355+
{
356+
if (!_spiPort)
357+
return kSTkErrBusNotInit;
358+
359+
// Apply settings
360+
_spiPort->beginTransaction(_sfeSPISettings);
361+
362+
// Signal communication start
363+
digitalWrite(cs(), LOW);
364+
365+
// A leading "1" must be added to transfer with devRegister to indicate a "read"
366+
_spiPort->transfer16(devReg | kSPIReadBit);
367+
368+
for (size_t i = 0; i < numBytes; i++)
369+
*data++ = _spiPort->transfer16(0x00);
370+
371+
// End transaction
372+
digitalWrite(cs(), HIGH);
373+
_spiPort->endTransaction();
374+
375+
readBytes = numBytes;
376+
377+
return kSTkErrOk;
378+
}

src/sfeTkArdSPI.h

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,18 @@ class sfeTkArdSPI : public sfeTkISPI
178178
*/
179179
sfeTkError_t writeRegister16Region(uint16_t devReg, const uint8_t *data, size_t length);
180180

181+
/**
182+
@brief Writes a number of uint16s starting at the given register's address.
183+
@note This method is virtual to allow it to be overridden to support a device that requires a unique impl
184+
185+
@param devReg The device's register's address.
186+
@param data Data to write.
187+
@param length - length of data
188+
189+
@retval sfeTkError_t - kSTkErrOk on success
190+
*/
191+
sfeTkError_t writeRegister16Region16(uint16_t devReg, const uint16_t *data, size_t length);
192+
181193
/**
182194
@brief Read a single byte from the given register
183195
@@ -224,6 +236,19 @@ class sfeTkArdSPI : public sfeTkISPI
224236
*/
225237
virtual sfeTkError_t readRegister16Region(uint16_t reg, uint8_t *data, size_t numBytes, size_t &readBytes);
226238

239+
/**
240+
@brief Reads a block of data from the given register.
241+
@note This method is virtual to allow it to be overridden to support a device that requires a unique impl
242+
243+
@param reg The device's register's 16 bit address.
244+
@param[out] data Data buffer to read into
245+
@param numBytes - Length of data to read/size of data buffer
246+
@param[out] readBytes - Number of bytes read
247+
248+
@retval sfeTkError_t - true on success
249+
*/
250+
virtual sfeTkError_t readRegister16Region16(uint16_t reg, uint16_t *data, size_t numBytes, size_t &readBytes);
251+
227252
protected:
228253
// note: The instance data is protected, allowing access if a sub-class is
229254
// created to implement a special read/write routine

0 commit comments

Comments
 (0)