Open FFBoard
Open source force feedback firmware
Loading...
Searching...
No Matches
SPI.h
Go to the documentation of this file.
1/*
2 * SPI.h
3 *
4 * Created on: 27.12.2020
5 * Author: willson556
6 */
7
8#ifndef SPI_H_
9#define SPI_H_
10
11#include <GPIOPin.h>
12#include <vector>
13#include "cppmain.h"
14
15#include "SpiHandler.h"
16#include "semaphore.hpp"
17#include <math.h>
18
19struct SPIConfig {
21 :cs{cs}, cspol{cspol}{
22 peripheral.Mode = SPI_MODE_MASTER;
23 peripheral.Direction = SPI_DIRECTION_2LINES;
24 peripheral.DataSize = SPI_DATASIZE_8BIT;
25 peripheral.CLKPolarity = SPI_POLARITY_LOW;
26 peripheral.CLKPhase = SPI_PHASE_1EDGE;
27 peripheral.NSS = SPI_NSS_SOFT;
28 peripheral.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
29 peripheral.FirstBit = SPI_FIRSTBIT_MSB;
30 peripheral.TIMode = SPI_TIMODE_DISABLE;
31 peripheral.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
32 peripheral.CRCPolynomial = 10;
33 }
34
36
38 bool cspol;
39 SPI_InitTypeDef peripheral;
40};
41
42class SPIDevice;
43
44class SPIPort: public SpiHandler {
45public:
46 SPIPort(SPI_HandleTypeDef &hspi,const std::vector<OutputPin>& csPins,uint32_t baseclk,bool allowReconfigure = true);
47
48 void takeSemaphore(); // Call before accessing this port
49 void giveSemaphore(); // Call when finished using this port
50
51 void configurePort(SPI_InitTypeDef* config); // Reconfigures the spi port
52
53 std::vector<OutputPin>& getCsPins();
54 OutputPin* getCsPin(uint16_t idx);
55 std::vector<OutputPin>& getFreeCsPins(); // Returns a vector of cs pins assigned to this port that are not reserved
56 bool reserveCsPin(OutputPin pin); // Signals that this pin is now in use
57 bool freeCsPin(OutputPin pin); // Signals that this cs pin is not used anymore. Call this in the destructor
58 bool isPinFree(OutputPin pin); // Returns if a pin is assigned to this port and not in use
59
60 void transmit_DMA(const uint8_t* buf,uint16_t size,SPIDevice* device);
61 void transmitReceive_DMA(const uint8_t* txbuf,uint8_t* rxbuf,uint16_t size,SPIDevice* device);
62 void receive_DMA(uint8_t* buf,uint16_t size,SPIDevice* device);
63 void transmit_IT(const uint8_t* buf,uint16_t size,SPIDevice* device);
64 void transmitReceive_IT(const uint8_t* txbuf,uint8_t* rxbuf,uint16_t size,SPIDevice* device);
65 void receive_IT(uint8_t* buf,uint16_t size,SPIDevice* device);
66 void transmit(const uint8_t* buf,uint16_t size,SPIDevice* device,uint16_t timeout);
67 void receive(uint8_t* buf,uint16_t size,SPIDevice* device,int16_t timeout);
68 void transmitReceive(const uint8_t* txbuf,uint8_t* rxbuf,uint16_t size,SPIDevice* device,uint16_t timeout);
69
70 void SpiTxCplt(SPI_HandleTypeDef *hspi) override;
71 void SpiRxCplt(SPI_HandleTypeDef *hspi) override;
72 void SpiTxRxCplt(SPI_HandleTypeDef *hspi) override;
73 void SpiError(SPI_HandleTypeDef *hspi) override;
74
75 bool isTaken(); // Returns true if semaphore was taken by another task
76
77 void takeExclusive(bool exclusive);
78 bool hasFreePins();
79
80 uint32_t getBaseClk();
81 std::pair<uint32_t,float> getClosestPrescaler(float clock,float min = 0, float max = INFINITY);
82
83 SPI_HandleTypeDef* getPortHandle();
84
85private:
86 void beginTransfer(SPIConfig* config);
87 void endTransfer(SPIConfig* config);
88
89 SPI_HandleTypeDef &hspi;
91 std::vector<OutputPin> csPins; // cs pins and bool true if pin is reserved
92 std::vector<OutputPin> freePins;
93
95 bool allowReconfigure = false; // Allow reconfiguration at runtime. Can reduce performance a lot
96 volatile bool isTakenFlag = false;
97 bool takenExclusive = false;
98 uint32_t baseclk;
99};
100
102public:
103 SPIDevice(SPIPort& port,OutputPin csPin);
105 virtual ~SPIDevice();
106
107// virtual const SPIConfig& getConfig(SPIPort& port);
108 void assertChipSelect();
109 void clearChipSelect();
110
111 virtual bool updateCSPin(OutputPin& csPin);
112
113 virtual void spiTxCompleted(SPIPort* port) { }
114 virtual void spiRxCompleted(SPIPort* port) { }
115 virtual void spiTxRxCompleted(SPIPort* port) { }
116 virtual void spiRequestError(SPIPort* port) { }
117
118 virtual void beginSpiTransfer(SPIPort* port);
119 virtual void endSpiTransfer(SPIPort* port);
120
121 virtual SPIConfig* getSpiConfig(){return &this->spiConfig;}
122
123protected:
124 virtual void setSpiConfig(SPIConfig config){spiConfig = config;}
127};
128
129#endif
virtual bool updateCSPin(OutputPin &csPin)
Definition SPI.cpp:342
SPIPort & spiPort
Definition SPI.h:125
virtual void beginSpiTransfer(SPIPort *port)
Definition SPI.cpp:361
SPIDevice(SPIPort &port, OutputPin csPin)
Definition SPI.cpp:333
virtual ~SPIDevice()
Definition SPI.cpp:338
void assertChipSelect()
Definition SPI.cpp:375
virtual void spiTxCompleted(SPIPort *port)
Definition SPI.h:113
virtual SPIConfig * getSpiConfig()
Definition SPI.h:121
void clearChipSelect()
Definition SPI.cpp:379
virtual void endSpiTransfer(SPIPort *port)
Definition SPI.cpp:370
SPIConfig spiConfig
Definition SPI.h:126
virtual void setSpiConfig(SPIConfig config)
Definition SPI.h:124
virtual void spiRequestError(SPIPort *port)
Definition SPI.h:116
virtual void spiRxCompleted(SPIPort *port)
Definition SPI.h:114
virtual void spiTxRxCompleted(SPIPort *port)
Definition SPI.h:115
Definition SPI.h:44
void beginTransfer(SPIConfig *config)
void transmitReceive(const uint8_t *txbuf, uint8_t *rxbuf, uint16_t size, SPIDevice *device, uint16_t timeout)
Definition SPI.cpp:176
void transmit_IT(const uint8_t *buf, uint16_t size, SPIDevice *device)
Definition SPI.cpp:128
std::vector< OutputPin > & getCsPins()
Definition SPI.cpp:61
bool hasFreePins()
Definition SPI.cpp:220
SPIDevice * current_device
Definition SPI.h:90
SPI_HandleTypeDef & hspi
Definition SPI.h:89
bool isPinFree(OutputPin pin)
Definition SPI.cpp:51
void takeExclusive(bool exclusive)
Definition SPI.cpp:216
void takeSemaphore()
Definition SPI.cpp:186
bool reserveCsPin(OutputPin pin)
Definition SPI.cpp:25
uint32_t getBaseClk()
Definition SPI.cpp:227
std::vector< OutputPin > & getFreeCsPins()
Definition SPI.cpp:55
std::vector< OutputPin > freePins
Definition SPI.h:92
SPI_HandleTypeDef * getPortHandle()
Definition SPI.cpp:80
void receive(uint8_t *buf, uint16_t size, SPIDevice *device, int16_t timeout)
Definition SPI.cpp:167
void transmitReceive_DMA(const uint8_t *txbuf, uint8_t *rxbuf, uint16_t size, SPIDevice *device)
Definition SPI.cpp:103
void SpiError(SPI_HandleTypeDef *hspi) override
Definition SPI.cpp:273
void SpiTxCplt(SPI_HandleTypeDef *hspi) override
Definition SPI.cpp:232
void transmit(const uint8_t *buf, uint16_t size, SPIDevice *device, uint16_t timeout)
Definition SPI.cpp:158
void receive_DMA(uint8_t *buf, uint16_t size, SPIDevice *device)
Definition SPI.cpp:117
bool isTaken()
Definition SPI.cpp:212
void transmitReceive_IT(const uint8_t *txbuf, uint8_t *rxbuf, uint16_t size, SPIDevice *device)
Definition SPI.cpp:138
bool takenExclusive
Definition SPI.h:97
void transmit_DMA(const uint8_t *buf, uint16_t size, SPIDevice *device)
Definition SPI.cpp:89
void endTransfer(SPIConfig *config)
OutputPin * getCsPin(uint16_t idx)
Definition SPI.cpp:65
std::vector< OutputPin > csPins
Definition SPI.h:91
void SpiTxRxCplt(SPI_HandleTypeDef *hspi) override
Definition SPI.cpp:259
void configurePort(SPI_InitTypeDef *config)
Definition SPI.cpp:72
void giveSemaphore()
Definition SPI.cpp:199
void receive_IT(uint8_t *buf, uint16_t size, SPIDevice *device)
Definition SPI.cpp:148
bool freeCsPin(OutputPin pin)
Definition SPI.cpp:37
volatile bool isTakenFlag
Definition SPI.h:96
bool allowReconfigure
Definition SPI.h:95
void SpiRxCplt(SPI_HandleTypeDef *hspi) override
Definition SPI.cpp:246
cpp_freertos::BinarySemaphore semaphore
Definition SPI.h:94
std::pair< uint32_t, float > getClosestPrescaler(float clock, float min=0, float max=INFINITY)
Definition SPI.cpp:291
SPIPort(SPI_HandleTypeDef &hspi, const std::vector< OutputPin > &csPins, uint32_t baseclk, bool allowReconfigure=true)
Definition SPI.cpp:14
uint32_t baseclk
Definition SPI.h:98
SPI_InitTypeDef peripheral
Definition SPI.h:39
OutputPin cs
Definition SPI.h:35
bool cspol
CSPOL=true === active low.
Definition SPI.h:38
SPIConfig(OutputPin cs, bool cspol=true)
Definition SPI.h:20