Skyward boardcore
Loading...
Searching...
No Matches
SPIBusInterface.h
Go to the documentation of this file.
1/* Copyright (c) 2019-2021 Skyward Experimental Rocketry
2 * Authors: Luca Erbetta, Alberto Nidasio
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
5 * of this software and associated documentation files (the "Software"), to deal
6 * in the Software without restriction, including without limitation the rights
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 * copies of the Software, and to permit persons to whom the Software is
9 * furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 * THE SOFTWARE.
21 */
22
23#pragma once
24
25#include <interfaces-impl/gpio_impl.h>
26#include <stddef.h>
27
28#include "SPIDefs.h"
29
30#ifndef USE_MOCK_PERIPHERALS
31using GpioType = miosix::GpioPin;
32#else
33#include <utils/TestUtils/MockGpioPin.h>
34using GpioType = Boardcore::MockGpioPin;
35#endif
36
37namespace Boardcore
38{
39
46{
49
52
55
78
81
83 unsigned int csSetupTimeUs;
84
86 unsigned int csHoldTimeUs;
87
99
100 bool operator==(const SPIBusConfig& other) const
101 {
102 return clockDivider == other.clockDivider && mode == other.mode &&
103 bitOrder == other.bitOrder &&
104 csSetupTimeUs == other.csSetupTimeUs &&
105 csHoldTimeUs == other.csHoldTimeUs;
106 }
107
108 bool operator!=(const SPIBusConfig& other) const
109 {
110 return !(*this == other);
111 }
112};
113
118{
119public:
121
127
135 virtual void configure(SPIBusConfig config) = 0;
136
142 virtual void select(GpioType cs) = 0;
143
149 virtual void deselect(GpioType cs) = 0;
150
151 // Read, write and transfer operations
152
158 virtual uint8_t read() = 0;
159
165 virtual uint16_t read16() = 0;
166
172 virtual uint32_t read24() = 0;
173
179 virtual uint32_t read32() = 0;
180
187 virtual void read(uint8_t* data, size_t size) = 0;
188
195 virtual void read16(uint16_t* data, size_t size) = 0;
196
202 virtual void write(uint8_t data) = 0;
203
209 virtual void write16(uint16_t data) = 0;
210
216 virtual void write24(uint32_t data) = 0;
217
223 virtual void write32(uint32_t data) = 0;
224
231 virtual void write(const uint8_t* data, size_t size) = 0;
232
239 virtual void write16(const uint16_t* data, size_t size) = 0;
240
247 virtual uint8_t transfer(uint8_t data) = 0;
248
255 virtual uint16_t transfer16(uint16_t data) = 0;
256
263 virtual uint32_t transfer24(uint32_t data) = 0;
264
271 virtual uint32_t transfer32(uint32_t data) = 0;
272
279 virtual void transfer(uint8_t* data, size_t size) = 0;
280
287 virtual void transfer16(uint16_t* data, size_t size) = 0;
288};
289
305
311{
312public:
313 explicit SPIAcquireLock(SPISlave slave)
314 : SPIAcquireLock(slave.bus, slave.config)
315 {
316 }
317
319 {
320 bus.configure(cfg);
321 }
322
323private:
324 SPIBusInterface& bus;
325};
326
331{
332public:
333 explicit SPISelectLock(SPISlave slave) : SPISelectLock(slave.bus, slave.cs)
334 {
335 }
336
337 SPISelectLock(SPIBusInterface& bus, GpioType cs) : bus(bus), cs(cs)
338 {
339 bus.select(cs);
340 }
341
343
344private:
345 SPIBusInterface& bus;
346 GpioType& cs;
347};
348
349} // namespace Boardcore
miosix::GpioPin GpioType
RAII Interface for SPI bus acquisition.
SPIAcquireLock(SPIBusInterface &bus, SPIBusConfig cfg)
Interface for low level access of a SPI bus as a master.
virtual uint16_t transfer16(uint16_t data)=0
Full duplex transmission of 16 bits on the bus.
virtual void write24(uint32_t data)=0
Writes 24 bits to the bus.
virtual void write16(uint16_t data)=0
Writes 16 bits to the bus.
virtual void write32(uint32_t data)=0
Writes 32 bits to the bus.
virtual void read(uint8_t *data, size_t size)=0
Reads multiple bytes from the bus.
virtual uint32_t transfer24(uint32_t data)=0
Full duplex transmission of 24 bits on the bus.
SPIBusInterface()
Delete copy/move constructors/operators.
virtual uint16_t read16()=0
Reads 16 bits from the bus.
virtual void deselect(GpioType cs)=0
Deselects the slave.
virtual uint32_t read24()=0
Reads 24 bits from the bus.
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.
SPIBusInterface & operator=(const SPIBusInterface &)=delete
virtual void read16(uint16_t *data, size_t size)=0
Reads multiple half words from the bus.
SPIBusInterface(SPIBusInterface &&)=delete
virtual void write(uint8_t data)=0
Writes 8 bits to the bus.
virtual void transfer16(uint16_t *data, size_t size)=0
Full duplex transmission of multiple half words on the bus.
SPIBusInterface(const SPIBusInterface &)=delete
virtual void write(const uint8_t *data, size_t size)=0
Writes multiple bytes to the bus.
virtual uint32_t transfer32(uint32_t data)=0
Full duplex transmission of 32 bits on the bus.
virtual uint8_t transfer(uint8_t data)=0
Full duplex transmission of 8 bits on the bus.
virtual void write16(const uint16_t *data, size_t size)=0
Writes multiple half words to the bus.
virtual void transfer(uint8_t *data, size_t size)=0
Full duplex transmission of multiple bytes on the bus.
virtual void configure(SPIBusConfig config)=0
Configures the bus with the provided configuration parameters.
SPIBusInterface & operator=(SPIBusInterface &&)=delete
RAII Interface for SPI chip selection.
SPISelectLock(SPIBusInterface &bus, GpioType cs)
SPISelectLock(SPISlave slave)
@ MODE_0
CPOL = 0, CPHA = 0 -> Clock low when idle, sample on first edge.
ClockDivider
SPI Clock divider.
Definition SPIDefs.h:70
@ NORMAL
Normal write bit settings (0 for write, 1 for reads)
This file includes all the types the logdecoder script will decode.
SPI Bus configuration for a specific slave.
SPI::Order byteOrder
MSByte or LSByte first.
SPIBusConfig(SPI::ClockDivider clockDivider=SPI::ClockDivider::DIV_256, SPI::Mode mode=SPI::Mode::MODE_0, SPI::Order bitOrder=SPI::Order::MSB_FIRST, SPI::Order byteOrder=SPI::Order::MSB_FIRST, SPI::WriteBit writeBit=SPI::WriteBit::NORMAL, unsigned int csSetupTimeUs=0, unsigned int csHoldTimeUs=0)
bool operator!=(const SPIBusConfig &other) const
unsigned int csSetupTimeUs
How long to hold cs after the end of a tranmission (us)
bool operator==(const SPIBusConfig &other) const
SPI::Mode mode
MSBit or LSBit first.
SPI::ClockDivider clockDivider
< Peripheral clock division
SPI::WriteBit writeBit
How long to wait before starting a tranmission after CS is set (us)
Contains information about a single SPI slave device.
SPISlave(SPIBusInterface &bus, GpioType cs, SPIBusConfig config={})
GpioType cs
Chip select pin.
SPIBusInterface & bus
Bus on which the slave is connected.