Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Duet3D/RepRapFirmware.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/Heating/Sensors/SpiTemperatureSensor.cpp')
-rw-r--r--src/Heating/Sensors/SpiTemperatureSensor.cpp63
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