Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of X_NUCLEO_COMMON by
Revision 14:655c1d3a5d59, committed 2016-02-16
- Comitter:
- apalmieri
- Date:
- Tue Feb 16 09:50:42 2016 +0000
- Parent:
- 13:9ea386e57527
- Child:
- 15:923ab55e8d5d
- Commit message:
- Add utilities to convert from uint8 to uint16 (and viceversa), and fix issue on casting to uint16*
Changed in this revision
| DevSPI/DevSPI.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/DevSPI/DevSPI.h Tue Feb 16 09:44:32 2016 +0000
+++ b/DevSPI/DevSPI.h Tue Feb 16 09:50:42 2016 +0000
@@ -42,7 +42,7 @@
/* Includes ------------------------------------------------------------------*/
#include "mbed.h"
-
+extern DigitalOut led;
/* Classes -------------------------------------------------------------------*/
/** Helper class DevSPI providing functions for SPI communication common for a
* series of SPI devices.
@@ -105,12 +105,19 @@
ssel = 0;
/* Write data. */
- if (_bits == 16)
- for (int i = 0; i < NumBytesToWrite; i += 2)
- write(((uint16_t *) pBuffer)[i]);
- else if(_bits == 8)
- for (int i = 0; i < NumBytesToWrite; i++)
+ if (_bits == 16) {
+ uint16_t dataToWrite;
+ for (int i = 0; i < NumBytesToWrite; i += 2) {
+ dataToWrite = convertFrom8To16(pBuffer);
+ write(dataToWrite);
+ pBuffer += sizeof(uint16_t);
+ }
+
+ } else if(_bits == 8) {
+ for (int i = 0; i < NumBytesToWrite; i++) {
write(pBuffer[i]);
+ }
+ }
/* Unselect the chip. */
ssel = 1;
@@ -133,12 +140,19 @@
ssel = 0;
/* Read data. */
- if (_bits == 16)
- for (int i = 0; i < NumBytesToRead; i += 2)
- ((uint16_t *) pBuffer)[i] = write(0x00);
- else if(_bits == 8)
- for (int i = 0; i < NumBytesToRead; i++)
+ if (_bits == 16) {
+ uint16_t dataToRead;
+ for (int i = 0; i < NumBytesToRead; i += 2) {
+ dataToRead = write(0x00);
+ convertFrom16To8(dataToRead, pBuffer);
+ pBuffer += sizeof(uint16_t);
+ }
+
+ } else if(_bits == 8) {
+ for (int i = 0; i < NumBytesToRead; i++) {
pBuffer[i] = write(0x00);
+ }
+ }
/* Unselect the chip. */
ssel = 1;
@@ -162,18 +176,62 @@
ssel = 0;
/* Read and write data at the same time. */
- if (_bits == 16)
- for (int i = 0; i < NumBytes; i += 2)
- ((uint16_t *) pBufferToRead)[i] = write(((uint16_t *) pBufferToWrite)[i]);
- else if(_bits == 8)
- for (int i = 0; i < NumBytes; i++)
+ if (_bits == 16) {
+ uint16_t dataToRead;
+ uint16_t dataToWrite;
+
+ for (int i = 0; i < NumBytes; i += 2) {
+ dataToWrite = convertFrom8To16(pBufferToWrite);
+
+ dataToRead = write(dataToWrite);
+
+ convertFrom16To8(dataToRead, pBufferToRead);
+
+ pBufferToWrite += sizeof(uint16_t);
+ pBufferToRead += sizeof(uint16_t);
+ }
+
+ } else if(_bits == 8) {
+ for (int i = 0; i < NumBytes; i++) {
pBufferToRead[i] = write(pBufferToWrite[i]);
+ }
+ }
/* Unselect the chip. */
ssel = 1;
return 0;
}
+
+private:
+
+ /**
+ * @brief Converts two uint8_t words into one of uint16_t
+ * @param[in] ptr pointer to the buffer of data to be converted.
+ * @retval 16-bit data.
+ */
+ uint16_t convertFrom8To16(uint8_t *ptr)
+ {
+ uint16_t data16 = 0x0000;
+
+ data16 = *ptr;
+ data16 |= *(++ptr) << 8;
+
+ return data16;
+ }
+
+ /**
+ * @brief Converts one uint16_t word into two uint8_t
+ * @param[in] ptr pointer to the buffer of uint8_t words.
+ * @param[in] 16-bit data.
+ * @retval none.
+ */
+ void convertFrom16To8(uint16_t data16, uint8_t *ptr)
+ {
+ *(ptr) = data16 & 0x00FF;
+ *(++ptr) = (data16 >> 8) & 0x00FF;
+ }
+
};
#endif /* __DEV_SPI_H */
