diff options
Diffstat (limited to 'src/Heating/Sensors/SpiTemperatureSensor.cpp')
-rw-r--r-- | src/Heating/Sensors/SpiTemperatureSensor.cpp | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/src/Heating/Sensors/SpiTemperatureSensor.cpp b/src/Heating/Sensors/SpiTemperatureSensor.cpp new file mode 100644 index 00000000..dbf6c5b7 --- /dev/null +++ b/src/Heating/Sensors/SpiTemperatureSensor.cpp @@ -0,0 +1,63 @@ +/* + * SpiTemperatureSensor.cpp + * + * Created on: 8 Jun 2017 + * Author: David + */ + +#include "SpiTemperatureSensor.h" + +SpiTemperatureSensor::SpiTemperatureSensor(unsigned int channel, const char *name, unsigned int relativeChannel, uint8_t spiMode, uint32_t clockFrequency) + : TemperatureSensor(channel, name) +{ + device.csPin = SpiTempSensorCsPins[relativeChannel]; + device.spiMode = spiMode; + device.clockFrequency = clockFrequency; + lastTemperature = 0.0; + lastResult = TemperatureError::notInitialised; +} + +void SpiTemperatureSensor::InitSpi() +{ + sspi_master_init(&device, 8); + lastReadingTime = millis(); +} + +// Send and receive 1 to 4 bytes of data and return the result as a single 32-bit word +TemperatureError SpiTemperatureSensor::DoSpiTransaction(const uint8_t dataOut[], size_t nbytes, uint32_t& rslt) const +{ + if (!sspi_acquire()) + { + return TemperatureError::busBusy; + } + + sspi_master_setup_device(&device); + delayMicroseconds(1); + sspi_select_device(&device); + delayMicroseconds(1); + + uint8_t rawBytes[4]; + spi_status_t sts = sspi_transceive_packet(dataOut, rawBytes, nbytes); + + delayMicroseconds(1); + sspi_deselect_device(&device); + delayMicroseconds(1); + + sspi_release(); + + if (sts != SPI_OK) + { + return TemperatureError::timeout; + } + + rslt = rawBytes[0]; + for (size_t i = 1; i < nbytes; ++i) + { + rslt <<= 8; + rslt |= rawBytes[i]; + } + + return TemperatureError::success; +} + +// End |