Skip to content

Commit

Permalink
feat(api): add implementation for 4-wire SPI
Browse files Browse the repository at this point in the history
  • Loading branch information
malokhvii-eduard committed Oct 26, 2021
1 parent 4ddc221 commit ff10840
Show file tree
Hide file tree
Showing 2 changed files with 118 additions and 2 deletions.
31 changes: 29 additions & 2 deletions include/Bme280.h
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
#ifndef ARDUINO_BME280_INCLUDE_BME280_H_
#define ARDUINO_BME280_INCLUDE_BME280_H_

#include <math.h>
#include <stdint.h>

#ifndef ARDUINO_BME280_UNIT_TEST
/* Arduino */
#include <SPI.h>
#include <Wire.h>

#define __NOT_VIRTUAL_METHOD
#else
/* Mocks */
#include <mocks/SPI.h>
#include <mocks/Wire.h>

#define __NOT_VIRTUAL_METHOD virtual
Expand Down Expand Up @@ -286,7 +287,33 @@ class Bme280TwoWire final : public ::internal::AbstractBme280 {
TwoWire *wire_;
};

// TODO: class Bme280FourWire {};
class Bme280FourWire final : public ::internal::AbstractBme280 {
public:
virtual ~Bme280FourWire();

void begin(const uint8_t csPin);
void begin(const uint8_t csPin, SPIClass *spi);

uint8_t getCsPin() const;

private:
union ControlByte {
struct {
uint8_t registerAddress : 7;
uint8_t rw : 1;
};
uint8_t value;
};

void write8(const uint8_t registerAddress, uint8_t value);
uint8_t read8(const uint8_t registerAddress) const;
uint16_t read16(const uint8_t registerAddress) const;
uint32_t read24(const uint8_t registerAddress) const;

uint8_t csPin_;
SPIClass *spi_;
static const SPISettings spiSettings_;
};

#undef __NOT_VIRTUAL_METHOD

Expand Down
89 changes: 89 additions & 0 deletions src/Bme280.cc
Original file line number Diff line number Diff line change
Expand Up @@ -291,3 +291,92 @@ uint32_t Bme280TwoWire::read24(const uint8_t registerAddress) const {

return value;
}

Bme280FourWire::~Bme280FourWire() {}

const SPISettings Bme280FourWire::spiSettings_ =
SPISettings(SPISettings(500000, MSBFIRST, SPI_MODE0));

void Bme280FourWire::begin(const uint8_t csPin) { begin(csPin, &SPI); }

void Bme280FourWire::begin(const uint8_t csPin, SPIClass *spi) {
spi_ = spi;
csPin_ = csPin;

pinMode(csPin_, OUTPUT);
digitalWrite(csPin_, HIGH);

setup();
}

uint8_t Bme280FourWire::getCsPin() const { return csPin_; }

void Bme280FourWire::write8(const uint8_t registerAddress, uint8_t value) {
ControlByte control;
control.registerAddress = registerAddress;
control.rw = 0;

spi_->beginTransaction(spiSettings_);
digitalWrite(csPin_, LOW);

spi_->transfer(control.value);
spi_->transfer(value);

digitalWrite(csPin_, HIGH);
spi_->endTransaction();
}

uint8_t Bme280FourWire::read8(const uint8_t registerAddress) const {
ControlByte control;
control.registerAddress = registerAddress;
control.rw = 1;

spi_->beginTransaction(spiSettings_);
digitalWrite(csPin_, LOW);

spi_->transfer(control.value);
uint8_t value = spi_->transfer(0);

digitalWrite(csPin_, HIGH);
spi_->endTransaction();

return value;
}

uint16_t Bme280FourWire::read16(const uint8_t registerAddress) const {
ControlByte control;
control.registerAddress = registerAddress;
control.rw = 1;

spi_->beginTransaction(spiSettings_);
digitalWrite(csPin_, LOW);

spi_->transfer(control.value);
uint16_t value = (spi_->transfer(0) << 8) | spi_->transfer(0);

digitalWrite(csPin_, HIGH);
spi_->endTransaction();

return value;
}

uint32_t Bme280FourWire::read24(const uint8_t registerAddress) const {
ControlByte control;
control.registerAddress = registerAddress;
control.rw = 1;

spi_->beginTransaction(spiSettings_);
digitalWrite(csPin_, LOW);

spi_->transfer(control.value);
uint32_t value = spi_->transfer(0);
value <<= 8;
value |= spi_->transfer(0);
value <<= 8;
value |= spi_->transfer(0);

digitalWrite(csPin_, HIGH);
spi_->endTransaction();

return value;
}

0 comments on commit ff10840

Please sign in to comment.