26#include <interfaces/endianness.h>
33 SPIBusConfig busConfiguration, uint16_t syncOutSkipFactor)
34 : spiSlave(bus, csPin, busConfiguration),
35 syncOutSkipFactor(syncOutSkipFactor)
43 LOG_ERR(logger,
"init() should be called once");
52 if (!checkModelNumber())
54 LOG_ERR(logger,
"Got bad CHIPID");
63 LOG_ERR(logger,
"Unable to set data ready interrupt");
76bool VN100Spi::checkModelNumber()
84 reinterpret_cast<uint8_t*
>(buf),
89 LOG_ERR(logger,
"Error while reading CHIPID");
90 TRACE(
"Error code: %u\n", err);
98 LOG_ERR(logger,
"Error, invalid CHIPID");
106void VN100Spi::sendDummyPacket()
108 SPITransaction transaction(spiSlave);
109 transaction.write32(0);
117 miosix::Thread::sleep(1);
120bool VN100Spi::setInterrupt()
140 VN100SpiDefs::SynchronizationData sData;
141 sData.syncInMode = 3;
142 sData.syncInEdge = 0;
143 sData.syncInSkipFactor = 0;
146 sData.syncOutMode = 3;
147 sData.syncOutPolarity = 1;
148 sData.syncOutSkipFactor = syncOutSkipFactor;
153 sizeof(VN100SpiDefs::SynchronizationData));
157 TRACE(
"setInterrupt() failed, error: %u\n", err);
168 D(assert(isInit &&
"init() was not called"));
179 if (!getSample(data))
191 VN100SpiDefs::RawImuQuatData rawData;
195 reinterpret_cast<uint8_t*
>(&rawData),
sizeof(rawData));
200 TRACE(
"getSample() failed, error: %u\n", err);
226 VN100SpiDefs::RawTempPressData rawData;
233 reinterpret_cast<uint8_t*
>(&rawData),
sizeof(rawData));
238 TRACE(
"getTemperature() failed, error: %u\n", err);
252 VN100SpiDefs::RawTempPressData rawData;
259 reinterpret_cast<uint8_t*
>(&rawData),
sizeof(rawData));
264 TRACE(
"getPressure() failed, error: %u\n", err);
276 const uint32_t payloadSize)
295 const uint32_t requestPacket =
305 miosix::delayUs(100);
321 spiSlave.
bus.
read(payloadBuf, payloadSize);
329 const uint8_t* payloadBuf,
330 const uint32_t payloadSize)
349 const uint32_t requestPacket =
356 spiSlave.
bus.
write(payloadBuf, payloadSize);
360 miosix::delayUs(100);
366 uint8_t err = spiSlave.
bus.
read32() & 255;
#define LOG_ERR(logger,...)
Driver for STM32 low level SPI peripheral.
virtual void write32(uint32_t data)=0
Writes 32 bits to the bus.
virtual void deselect(GpioType cs)=0
Deselects the slave.
virtual uint8_t read()=0
Reads 8 bits from the bus.
virtual void select(GpioType cs)=0
Selects the slave.
virtual uint32_t read32()=0
Reads 32 bits from the bus.
virtual void write(uint8_t data)=0
Writes 8 bits to the bus.
bool selfTest() override
Performs self test for the sensor.
VN100Spi(SPIBus &bus, miosix::GpioPin csPin, SPIBusConfig busConfiguration, uint16_t syncOutSkipFactor)
VN100 constructor.
PressureData getPressure()
Retrieve pressure data from the sensor [kPa].
VN100SpiData sampleImpl() override
Gather data from the sensor.
bool init() override
Initialize the sensor.
TemperatureData getTemperature()
Retrieve temperature data from the sensor [°C].
uint64_t getTimestamp()
Returns the current timer value in microseconds.
const char *const MODEL_NUMBER
The expected model number to be red from the sensor.
@ REG_MODEL_NUMBER
WhoAmI register.
@ REG_SYNC
Used to set data ready interrupt.
@ REG_TEMP_PRESS_DATA
Temperature and pressure data register.
const int MODEL_NUMBER_SIZE
Size of the buffer used to retrieve the model number from the sensor. It corresponds to the size of t...
VNErrors
Error codes of the sensor.
const uint32_t SYNC_OUT_PULSE_WIDTH
Width of the SyncOut pulse in nanoseconds. Now is set to 1 millisecond.
This file includes all the types the logdecoder script will decode.
uint64_t accelerationTimestamp
uint64_t angularSpeedTimestamp
uint64_t magneticFieldTimestamp
uint64_t pressureTimestamp
uint64_t quaternionTimestamp
SPI Bus configuration for a specific slave.
GpioType cs
Chip select pin.
SPIBusInterface & bus
Bus on which the slave is connected.
uint64_t temperatureTimestamp
Data type class for VN100 Spi.