From edefa1bc3272f0bbe3765d0777b66831270973b2 Mon Sep 17 00:00:00 2001 From: Elias Santistevan Date: Fri, 15 Jul 2022 13:59:26 -0600 Subject: [PATCH 1/5] Adds function for building default SPI settings so that SPI can be used * Overloads SPI begin function to include a SPI settings argument for the user --- src/SparkFun_MMC5983MA_IO.cpp | 25 ++++++++++++++++++++++++- src/SparkFun_MMC5983MA_IO.h | 11 ++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/SparkFun_MMC5983MA_IO.cpp b/src/SparkFun_MMC5983MA_IO.cpp index 2cdc179..0f476b3 100644 --- a/src/SparkFun_MMC5983MA_IO.cpp +++ b/src/SparkFun_MMC5983MA_IO.cpp @@ -25,6 +25,13 @@ bool SFE_MMC5983MA_IO::begin(TwoWire &i2cPort) return isConnected(); } +void SFE_MMC5983MA_IO::initSPISettings() +{ + //CPOL = 1, CPHA = 1 : SPI Mode 3 + _mmcSpiSettings = SPISettings(2000000, MSBFIRST, SPI_MODE3); +} + + bool SFE_MMC5983MA_IO::begin(const uint8_t csPin, SPIClass &spiPort) { useSPI = true; @@ -32,6 +39,22 @@ bool SFE_MMC5983MA_IO::begin(const uint8_t csPin, SPIClass &spiPort) digitalWrite(_csPin, HIGH); pinMode(_csPin, OUTPUT); _spiPort = &spiPort; + + initSPISettings(); + + return isConnected(); +} + +bool SFE_MMC5983MA_IO::begin(const uint8_t csPin, SPISettings userSettings, SPIClass &spiPort) +{ + useSPI = true; + _csPin = csPin; + digitalWrite(_csPin, HIGH); + pinMode(_csPin, OUTPUT); + _spiPort = &spiPort; + + _mmcSpiSettings = userSettings; + return isConnected(); } @@ -158,4 +181,4 @@ bool SFE_MMC5983MA_IO::isBitSet(const uint8_t registerAddress, const uint8_t bit bool SFE_MMC5983MA_IO::spiInUse() { return useSPI; -} \ No newline at end of file +} diff --git a/src/SparkFun_MMC5983MA_IO.h b/src/SparkFun_MMC5983MA_IO.h index 0f51bdf..be3eb59 100644 --- a/src/SparkFun_MMC5983MA_IO.h +++ b/src/SparkFun_MMC5983MA_IO.h @@ -22,8 +22,11 @@ class SFE_MMC5983MA_IO { private: + SPIClass* _spiPort = nullptr; uint8_t _csPin = 0; + SPISettings _mmcSpiSettings; + TwoWire *_i2cPort = nullptr; uint8_t _address = 0; bool useSPI = false; @@ -35,12 +38,18 @@ class SFE_MMC5983MA_IO // Default empty destructor ~SFE_MMC5983MA_IO() = default; + // Builds default SPI settings if none are provided. + void initSPISettings(); + // Configures and starts the I2C I/O layer. bool begin(TwoWire &wirePort); // Configures and starts the SPI I/O layer. bool begin(const uint8_t csPin, SPIClass& spiPort = SPI); + // Configures the SPI I/O layer with the given chip select and SPI settings provided by the user. + bool begin(const uint8_t csPin, SPISettings userSettings, SPIClass &spiPort = SPI); + // Returns true if we get the correct product ID from the device. bool isConnected(); @@ -69,4 +78,4 @@ class SFE_MMC5983MA_IO bool spiInUse(); }; -#endif \ No newline at end of file +#endif From 1d8098fe30cfe43ee3033daa3e0d387f23b02670 Mon Sep 17 00:00:00 2001 From: Elias Santistevan Date: Sat, 16 Jul 2022 06:26:20 -0600 Subject: [PATCH 2/5] Adds lines to apply SPI settings before beginning a transfer * According to the datasheet, SPI uses SPI mode 3 but it did not work with mode 3 in testing. Instead spi mode zero is used. --- src/SparkFun_MMC5983MA_IO.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/SparkFun_MMC5983MA_IO.cpp b/src/SparkFun_MMC5983MA_IO.cpp index 0f476b3..3445f4d 100644 --- a/src/SparkFun_MMC5983MA_IO.cpp +++ b/src/SparkFun_MMC5983MA_IO.cpp @@ -27,8 +27,9 @@ bool SFE_MMC5983MA_IO::begin(TwoWire &i2cPort) void SFE_MMC5983MA_IO::initSPISettings() { - //CPOL = 1, CPHA = 1 : SPI Mode 3 - _mmcSpiSettings = SPISettings(2000000, MSBFIRST, SPI_MODE3); + //CPOL = 1, CPHA = 1 : SPI Mode 3 according to datasheet + // In practice SPI_MODE0 is what worked. + _mmcSpiSettings = SPISettings(2000000, MSBFIRST, SPI_MODE0); } @@ -63,6 +64,7 @@ bool SFE_MMC5983MA_IO::isConnected() bool result = false; if (useSPI) { + _spiPort->beginTransaction(_mmcSpiSettings); digitalWrite(_csPin, LOW); _spiPort->transfer(READ_REG(PROD_ID_REG)); uint8_t readback = _spiPort->transfer(DUMMY); @@ -82,6 +84,7 @@ void SFE_MMC5983MA_IO::writeMultipleBytes(const uint8_t registerAddress, uint8_t { if (useSPI) { + _spiPort->beginTransaction(_mmcSpiSettings); digitalWrite(_csPin, LOW); _spiPort->transfer(registerAddress); _spiPort->transfer(buffer, packetLength); @@ -102,6 +105,7 @@ void SFE_MMC5983MA_IO::readMultipleBytes(const uint8_t registerAddress, uint8_t { if (useSPI) { + _spiPort->beginTransaction(_mmcSpiSettings); digitalWrite(_csPin, LOW); _spiPort->transfer(READ_REG(registerAddress)); _spiPort->transfer(buffer, packetLength); @@ -124,6 +128,7 @@ uint8_t SFE_MMC5983MA_IO::readSingleByte(const uint8_t registerAddress) uint8_t result = 0; if (useSPI) { + _spiPort->beginTransaction(_mmcSpiSettings); digitalWrite(_csPin, LOW); _spiPort->transfer(READ_REG(registerAddress)); result = _spiPort->transfer(DUMMY); @@ -144,6 +149,7 @@ void SFE_MMC5983MA_IO::writeSingleByte(const uint8_t registerAddress, const uint { if (useSPI) { + _spiPort->beginTransaction(_mmcSpiSettings); digitalWrite(_csPin, LOW); _spiPort->transfer(registerAddress); _spiPort->transfer(value); From 8e20d28a39a16ae3ea0d46dff68948a7ffc2766d Mon Sep 17 00:00:00 2001 From: PaulZC Date: Tue, 6 Sep 2022 15:33:11 +0100 Subject: [PATCH 3/5] Whitespace changes --- src/SparkFun_MMC5983MA_IO.cpp | 21 +++++----- src/SparkFun_MMC5983MA_IO.h | 73 +++++++++++++++++------------------ 2 files changed, 46 insertions(+), 48 deletions(-) diff --git a/src/SparkFun_MMC5983MA_IO.cpp b/src/SparkFun_MMC5983MA_IO.cpp index 3445f4d..1c025a8 100644 --- a/src/SparkFun_MMC5983MA_IO.cpp +++ b/src/SparkFun_MMC5983MA_IO.cpp @@ -27,12 +27,11 @@ bool SFE_MMC5983MA_IO::begin(TwoWire &i2cPort) void SFE_MMC5983MA_IO::initSPISettings() { - //CPOL = 1, CPHA = 1 : SPI Mode 3 according to datasheet - // In practice SPI_MODE0 is what worked. - _mmcSpiSettings = SPISettings(2000000, MSBFIRST, SPI_MODE0); + // CPOL = 1, CPHA = 1 : SPI Mode 3 according to datasheet + // In practice SPI_MODE0 is what worked. + _mmcSpiSettings = SPISettings(2000000, MSBFIRST, SPI_MODE0); } - bool SFE_MMC5983MA_IO::begin(const uint8_t csPin, SPIClass &spiPort) { useSPI = true; @@ -41,7 +40,7 @@ bool SFE_MMC5983MA_IO::begin(const uint8_t csPin, SPIClass &spiPort) pinMode(_csPin, OUTPUT); _spiPort = &spiPort; - initSPISettings(); + initSPISettings(); return isConnected(); } @@ -54,7 +53,7 @@ bool SFE_MMC5983MA_IO::begin(const uint8_t csPin, SPISettings userSettings, SPIC pinMode(_csPin, OUTPUT); _spiPort = &spiPort; - _mmcSpiSettings = userSettings; + _mmcSpiSettings = userSettings; return isConnected(); } @@ -64,7 +63,7 @@ bool SFE_MMC5983MA_IO::isConnected() bool result = false; if (useSPI) { - _spiPort->beginTransaction(_mmcSpiSettings); + _spiPort->beginTransaction(_mmcSpiSettings); digitalWrite(_csPin, LOW); _spiPort->transfer(READ_REG(PROD_ID_REG)); uint8_t readback = _spiPort->transfer(DUMMY); @@ -84,7 +83,7 @@ void SFE_MMC5983MA_IO::writeMultipleBytes(const uint8_t registerAddress, uint8_t { if (useSPI) { - _spiPort->beginTransaction(_mmcSpiSettings); + _spiPort->beginTransaction(_mmcSpiSettings); digitalWrite(_csPin, LOW); _spiPort->transfer(registerAddress); _spiPort->transfer(buffer, packetLength); @@ -105,7 +104,7 @@ void SFE_MMC5983MA_IO::readMultipleBytes(const uint8_t registerAddress, uint8_t { if (useSPI) { - _spiPort->beginTransaction(_mmcSpiSettings); + _spiPort->beginTransaction(_mmcSpiSettings); digitalWrite(_csPin, LOW); _spiPort->transfer(READ_REG(registerAddress)); _spiPort->transfer(buffer, packetLength); @@ -128,7 +127,7 @@ uint8_t SFE_MMC5983MA_IO::readSingleByte(const uint8_t registerAddress) uint8_t result = 0; if (useSPI) { - _spiPort->beginTransaction(_mmcSpiSettings); + _spiPort->beginTransaction(_mmcSpiSettings); digitalWrite(_csPin, LOW); _spiPort->transfer(READ_REG(registerAddress)); result = _spiPort->transfer(DUMMY); @@ -149,7 +148,7 @@ void SFE_MMC5983MA_IO::writeSingleByte(const uint8_t registerAddress, const uint { if (useSPI) { - _spiPort->beginTransaction(_mmcSpiSettings); + _spiPort->beginTransaction(_mmcSpiSettings); digitalWrite(_csPin, LOW); _spiPort->transfer(registerAddress); _spiPort->transfer(value); diff --git a/src/SparkFun_MMC5983MA_IO.h b/src/SparkFun_MMC5983MA_IO.h index be3eb59..c32bacd 100644 --- a/src/SparkFun_MMC5983MA_IO.h +++ b/src/SparkFun_MMC5983MA_IO.h @@ -22,60 +22,59 @@ class SFE_MMC5983MA_IO { private: + SPIClass *_spiPort = nullptr; + uint8_t _csPin = 0; + SPISettings _mmcSpiSettings; - SPIClass* _spiPort = nullptr; - uint8_t _csPin = 0; - SPISettings _mmcSpiSettings; - - TwoWire *_i2cPort = nullptr; - uint8_t _address = 0; - bool useSPI = false; + TwoWire *_i2cPort = nullptr; + uint8_t _address = 0; + bool useSPI = false; public: - // Default empty constructor. - SFE_MMC5983MA_IO() = default; + // Default empty constructor. + SFE_MMC5983MA_IO() = default; - // Default empty destructor - ~SFE_MMC5983MA_IO() = default; + // Default empty destructor + ~SFE_MMC5983MA_IO() = default; - // Builds default SPI settings if none are provided. - void initSPISettings(); + // Builds default SPI settings if none are provided. + void initSPISettings(); - // Configures and starts the I2C I/O layer. - bool begin(TwoWire &wirePort); + // Configures and starts the I2C I/O layer. + bool begin(TwoWire &wirePort); - // Configures and starts the SPI I/O layer. - bool begin(const uint8_t csPin, SPIClass& spiPort = SPI); + // Configures and starts the SPI I/O layer. + bool begin(const uint8_t csPin, SPIClass &spiPort = SPI); - // Configures the SPI I/O layer with the given chip select and SPI settings provided by the user. - bool begin(const uint8_t csPin, SPISettings userSettings, SPIClass &spiPort = SPI); + // Configures the SPI I/O layer with the given chip select and SPI settings provided by the user. + bool begin(const uint8_t csPin, SPISettings userSettings, SPIClass &spiPort = SPI); - // Returns true if we get the correct product ID from the device. - bool isConnected(); + // Returns true if we get the correct product ID from the device. + bool isConnected(); - // Read a single uint8_t from a register. - uint8_t readSingleByte(const uint8_t registerAddress); + // Read a single uint8_t from a register. + uint8_t readSingleByte(const uint8_t registerAddress); - // Writes a single uint8_t into a register. - void writeSingleByte(const uint8_t registerAddress, const uint8_t value); + // Writes a single uint8_t into a register. + void writeSingleByte(const uint8_t registerAddress, const uint8_t value); - // Reads multiple bytes from a register into buffer uint8_t array. - void readMultipleBytes(const uint8_t registerAddress, uint8_t* const buffer , const uint8_t packetLength); + // Reads multiple bytes from a register into buffer uint8_t array. + void readMultipleBytes(const uint8_t registerAddress, uint8_t *const buffer, const uint8_t packetLength); - // Writes multiple bytes to register from buffer uint8_t array. - void writeMultipleBytes(const uint8_t registerAddress, uint8_t* const buffer, const uint8_t packetLength); + // Writes multiple bytes to register from buffer uint8_t array. + void writeMultipleBytes(const uint8_t registerAddress, uint8_t *const buffer, const uint8_t packetLength); - // Sets a single bit in a specific register. Bit position ranges from 0 (lsb) to 7 (msb). - void setRegisterBit(const uint8_t registerAddress, const uint8_t bitMask); + // Sets a single bit in a specific register. Bit position ranges from 0 (lsb) to 7 (msb). + void setRegisterBit(const uint8_t registerAddress, const uint8_t bitMask); - // Clears a single bit in a specific register. Bit position ranges from 0 (lsb) to 7 (msb). - void clearRegisterBit(const uint8_t registerAddress, const uint8_t bitMask); + // Clears a single bit in a specific register. Bit position ranges from 0 (lsb) to 7 (msb). + void clearRegisterBit(const uint8_t registerAddress, const uint8_t bitMask); - // Returns true if a specific bit is set in a register. Bit position ranges from 0 (lsb) to 7 (msb). - bool isBitSet(const uint8_t registerAddress, const uint8_t bitMask); + // Returns true if a specific bit is set in a register. Bit position ranges from 0 (lsb) to 7 (msb). + bool isBitSet(const uint8_t registerAddress, const uint8_t bitMask); - // Returns true if the interface in use is SPI - bool spiInUse(); + // Returns true if the interface in use is SPI + bool spiInUse(); }; #endif From 93b1b37253daa9bd48474f44a3e348065cf2b6d5 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Tue, 6 Sep 2022 18:38:54 +0100 Subject: [PATCH 4/5] Add SPI endTransaction's --- src/SparkFun_MMC5983MA_IO.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/SparkFun_MMC5983MA_IO.cpp b/src/SparkFun_MMC5983MA_IO.cpp index 1c025a8..7638ae0 100644 --- a/src/SparkFun_MMC5983MA_IO.cpp +++ b/src/SparkFun_MMC5983MA_IO.cpp @@ -68,6 +68,7 @@ bool SFE_MMC5983MA_IO::isConnected() _spiPort->transfer(READ_REG(PROD_ID_REG)); uint8_t readback = _spiPort->transfer(DUMMY); digitalWrite(_csPin, HIGH); + _spiPort->endTransaction(); result = (readback == PROD_ID); } else @@ -88,6 +89,7 @@ void SFE_MMC5983MA_IO::writeMultipleBytes(const uint8_t registerAddress, uint8_t _spiPort->transfer(registerAddress); _spiPort->transfer(buffer, packetLength); digitalWrite(_csPin, HIGH); + _spiPort->endTransaction(); } else { @@ -109,6 +111,7 @@ void SFE_MMC5983MA_IO::readMultipleBytes(const uint8_t registerAddress, uint8_t _spiPort->transfer(READ_REG(registerAddress)); _spiPort->transfer(buffer, packetLength); digitalWrite(_csPin, HIGH); + _spiPort->endTransaction(); } else { @@ -132,6 +135,7 @@ uint8_t SFE_MMC5983MA_IO::readSingleByte(const uint8_t registerAddress) _spiPort->transfer(READ_REG(registerAddress)); result = _spiPort->transfer(DUMMY); digitalWrite(_csPin, HIGH); + _spiPort->endTransaction(); } else { @@ -153,6 +157,7 @@ void SFE_MMC5983MA_IO::writeSingleByte(const uint8_t registerAddress, const uint _spiPort->transfer(registerAddress); _spiPort->transfer(value); digitalWrite(_csPin, HIGH); + _spiPort->endTransaction(); } else { From b67201566f07ca3e8630b9d8230e6f0b779c3c05 Mon Sep 17 00:00:00 2001 From: PaulZC Date: Tue, 6 Sep 2022 19:11:15 +0100 Subject: [PATCH 5/5] v1.0.2 --- library.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library.properties b/library.properties index af95908..4571e9c 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=SparkFun MMC5983MA Magnetometer Arduino Library -version=1.0.1 +version=1.0.2 author=SparkFun Electronics maintainer=SparkFun Electronics sentence=A I2C/SPI library for the MMC5983MA magnetic compass sensor.