Skip to content

Commit adeed2e

Browse files
Merge pull request #35 from fabyte/spi-improvements
Improve SPI communication using SPISettings
2 parents 7a7fb98 + a7469f0 commit adeed2e

File tree

2 files changed

+19
-27
lines changed

2 files changed

+19
-27
lines changed

src/SparkFunBME280.cpp

+5-26
Original file line numberDiff line numberDiff line change
@@ -86,24 +86,6 @@ uint8_t BME280::begin()
8686
case SPI_MODE:
8787
// start the SPI library:
8888
SPI.begin();
89-
#ifdef ARDUINO_ARCH_ESP32
90-
SPI.setFrequency(1000000);
91-
// Data is read and written MSb first.
92-
SPI.setBitOrder(SPI_MSBFIRST);
93-
// Like the standard arduino/teensy comment below, mode0 seems wrong according to standards
94-
// but conforms to the timing diagrams when used for the ESP32
95-
SPI.setDataMode(SPI_MODE0);
96-
#else
97-
// Maximum SPI frequency is 10MHz, could divide by 2 here:
98-
SPI.setClockDivider(SPI_CLOCK_DIV32);
99-
// Data is read and written MSb first.
100-
SPI.setBitOrder(MSBFIRST);
101-
// Data is captured on rising edge of clock (CPHA = 0)
102-
// Base value of the clock is HIGH (CPOL = 1)
103-
// This was SPI_MODE3 for RedBoard, but I had to change to
104-
// MODE0 for Teensy 3.1 operation
105-
SPI.setDataMode(SPI_MODE3);
106-
#endif
10789
// initialize the data ready and chip select pins:
10890
pinMode(settings.chipSelectPin, OUTPUT);
10991
digitalWrite(settings.chipSelectPin, HIGH);
@@ -586,6 +568,7 @@ void BME280::readRegisterRegion(uint8_t *outputPointer , uint8_t offset, uint8_t
586568
break;
587569

588570
case SPI_MODE:
571+
SPI.beginTransaction(settings.spiSettings);
589572
// take the chip select low to select the device:
590573
digitalWrite(settings.chipSelectPin, LOW);
591574
// send the device the register you want to read:
@@ -599,6 +582,7 @@ void BME280::readRegisterRegion(uint8_t *outputPointer , uint8_t offset, uint8_t
599582
}
600583
// take the chip select high to de-select:
601584
digitalWrite(settings.chipSelectPin, HIGH);
585+
SPI.endTransaction();
602586
break;
603587

604588
default:
@@ -647,14 +631,7 @@ uint8_t BME280::readRegister(uint8_t offset)
647631
break;
648632

649633
case SPI_MODE:
650-
// take the chip select low to select the device:
651-
digitalWrite(settings.chipSelectPin, LOW);
652-
// send the device the register you want to read:
653-
SPI.transfer(offset | 0x80); //Ored with "read request" bit
654-
// send a value of 0 to read the first byte returned:
655-
result = SPI.transfer(0x00);
656-
// take the chip select high to de-select:
657-
digitalWrite(settings.chipSelectPin, HIGH);
634+
readRegisterRegion(&result, offset, 1);
658635
break;
659636

660637
default:
@@ -699,6 +676,7 @@ void BME280::writeRegister(uint8_t offset, uint8_t dataToWrite)
699676
break;
700677

701678
case SPI_MODE:
679+
SPI.beginTransaction(settings.spiSettings);
702680
// take the chip select low to select the device:
703681
digitalWrite(settings.chipSelectPin, LOW);
704682
// send the device the register you want to read:
@@ -708,6 +686,7 @@ void BME280::writeRegister(uint8_t offset, uint8_t dataToWrite)
708686
// decrement the number of bytes left to read:
709687
// take the chip select high to de-select:
710688
digitalWrite(settings.chipSelectPin, HIGH);
689+
SPI.endTransaction();
711690
break;
712691

713692
default:

src/SparkFunBME280.h

+14-1
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,18 @@ Distributed as-is; no warranty is given.
4646
#define I2C_MODE 0
4747
#define SPI_MODE 1
4848

49+
#ifndef BME280_SPI_CLOCK
50+
#ifdef ARDUINO_ARCH_ESP32
51+
#define BME280_SPI_CLOCK 1000000
52+
#else
53+
#define BME280_SPI_CLOCK 500000
54+
#endif
55+
#endif
56+
57+
#ifndef BME280_SPI_MODE
58+
#define BME280_SPI_MODE SPI_MODE0
59+
#endif
60+
4961
#define NO_WIRE 0
5062
#define HARD_WIRE 1
5163
#define SOFT_WIRE 2
@@ -120,7 +132,8 @@ struct BME280_SensorSettings
120132
uint8_t commInterface;
121133
uint8_t I2CAddress;
122134
uint8_t chipSelectPin;
123-
135+
SPISettings spiSettings{BME280_SPI_CLOCK, MSBFIRST, BME280_SPI_MODE};
136+
124137
//Deprecated settings
125138
uint8_t runMode;
126139
uint8_t tStandby;

0 commit comments

Comments
 (0)