blob: dbf6c5b74750e56ae5d683ffd0f87a769ccdfae0 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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
|