Skip to content

Commit 1ae6110

Browse files
committed
chore(SPI): align with ArduinoCoreAPI
Signed-off-by: Frederic Pillon <[email protected]>
1 parent 0637f1f commit 1ae6110

File tree

4 files changed

+161
-92
lines changed

4 files changed

+161
-92
lines changed

Diff for: libraries/SPI/src/SPI.cpp

+49-45
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,9 @@ SPIClass::SPIClass(uint32_t mosi, uint32_t miso, uint32_t sclk, uint32_t ssel)
5757
void SPIClass::begin(void)
5858
{
5959
_spi.handle.State = HAL_SPI_STATE_RESET;
60-
spi_init(&_spi, _spiSettings.clk,
61-
_spiSettings.dMode,
62-
_spiSettings.bOrder);
60+
spi_init(&_spi, _spiSettings.getClockFreq(),
61+
_spiSettings.getDataMode(),
62+
_spiSettings.getBitOrder());
6363
}
6464

6565
/**
@@ -69,14 +69,12 @@ void SPIClass::begin(void)
6969
*/
7070
void SPIClass::beginTransaction(SPISettings settings)
7171
{
72-
_spiSettings.clk = settings.clk;
73-
_spiSettings.dMode = settings.dMode;
74-
_spiSettings.bOrder = settings.bOrder;
75-
_spiSettings.noReceive = settings.noReceive;
76-
77-
spi_init(&_spi, _spiSettings.clk,
78-
_spiSettings.dMode,
79-
_spiSettings.bOrder);
72+
if (_spiSettings != settings) {
73+
_spiSettings = settings;
74+
spi_init(&_spi, _spiSettings.getClockFreq(),
75+
_spiSettings.getDataMode(),
76+
_spiSettings.getBitOrder());
77+
}
8078
}
8179

8280
/**
@@ -102,39 +100,37 @@ void SPIClass::end()
102100
*/
103101
void SPIClass::setBitOrder(BitOrder bitOrder)
104102
{
105-
_spiSettings.bOrder = bitOrder;
103+
_spiSettings.setBitOrder(bitOrder);
106104

107-
spi_init(&_spi, _spiSettings.clk,
108-
_spiSettings.dMode,
109-
_spiSettings.bOrder);
105+
spi_init(&_spi, _spiSettings.getClockFreq(),
106+
_spiSettings.getDataMode(),
107+
_spiSettings.getBitOrder());
110108
}
111109

112110
/**
113111
* @brief Deprecated function.
114112
* Configure the data mode (clock polarity and clock phase)
115-
* @param _mode: SPI_MODE0, SPI_MODE1, SPI_MODE2 or SPI_MODE3
113+
* @param mode: SPI_MODE0, SPI_MODE1, SPI_MODE2 or SPI_MODE3
116114
* @note
117115
* Mode Clock Polarity (CPOL) Clock Phase (CPHA)
118116
* SPI_MODE0 0 0
119117
* SPI_MODE1 0 1
120118
* SPI_MODE2 1 0
121119
* SPI_MODE3 1 1
122120
*/
123-
void SPIClass::setDataMode(uint8_t _mode)
121+
122+
void SPIClass::setDataMode(uint8_t mode)
124123
{
125-
if (SPI_MODE0 == _mode) {
126-
_spiSettings.dMode = SPI_MODE_0;
127-
} else if (SPI_MODE1 == _mode) {
128-
_spiSettings.dMode = SPI_MODE_1;
129-
} else if (SPI_MODE2 == _mode) {
130-
_spiSettings.dMode = SPI_MODE_2;
131-
} else if (SPI_MODE3 == _mode) {
132-
_spiSettings.dMode = SPI_MODE_3;
133-
}
124+
setDataMode((SPIMode)mode);
125+
}
134126

135-
spi_init(&_spi, _spiSettings.clk,
136-
_spiSettings.dMode,
137-
_spiSettings.bOrder);
127+
void SPIClass::setDataMode(SPIMode mode)
128+
{
129+
_spiSettings.setDataMode(mode);
130+
131+
spi_init(&_spi, _spiSettings.getClockFreq(),
132+
_spiSettings.getDataMode(),
133+
_spiSettings.getBitOrder());
138134
}
139135

140136
/**
@@ -146,15 +142,15 @@ void SPIClass::setDataMode(uint8_t _mode)
146142
void SPIClass::setClockDivider(uint8_t _divider)
147143
{
148144
if (_divider == 0) {
149-
_spiSettings.clk = SPI_SPEED_CLOCK_DEFAULT;
145+
_spiSettings.setClockFreq(SPI_SPEED_CLOCK_DEFAULT);
150146
} else {
151-
/* Get clk freq of the SPI instance and compute it */
152-
_spiSettings.clk = spi_getClkFreq(&_spi) / _divider;
147+
/* Get clock freq of the SPI instance and compute it */
148+
_spiSettings.setClockFreq(spi_getClkFreq(&_spi) / _divider);
153149
}
154150

155-
spi_init(&_spi, _spiSettings.clk,
156-
_spiSettings.dMode,
157-
_spiSettings.bOrder);
151+
spi_init(&_spi, _spiSettings.getClockFreq(),
152+
_spiSettings.getDataMode(),
153+
_spiSettings.getBitOrder());
158154
}
159155

160156
/**
@@ -163,9 +159,9 @@ void SPIClass::setClockDivider(uint8_t _divider)
163159
* @param data: byte to send.
164160
* @return byte received from the slave.
165161
*/
166-
byte SPIClass::transfer(uint8_t data)
162+
uint8_t SPIClass::transfer(uint8_t data)
167163
{
168-
spi_transfer(&_spi, &data, sizeof(uint8_t), SPI_TRANSFER_TIMEOUT, _spiSettings.noReceive);
164+
spi_transfer(&_spi, &data, sizeof(uint8_t), SPI_TRANSFER_TIMEOUT, _spiSettings.getSkipRecv());
169165
return data;
170166
}
171167

@@ -179,14 +175,14 @@ uint16_t SPIClass::transfer16(uint16_t data)
179175
{
180176
uint16_t tmp;
181177

182-
if (_spiSettings.bOrder) {
178+
if (_spiSettings.getBitOrder()) {
183179
tmp = ((data & 0xff00) >> 8) | ((data & 0xff) << 8);
184180
data = tmp;
185181
}
186182
spi_transfer(&_spi, (uint8_t *)&data, sizeof(uint16_t),
187-
SPI_TRANSFER_TIMEOUT, _spiSettings.noReceive);
183+
SPI_TRANSFER_TIMEOUT, _spiSettings.getSkipRecv());
188184

189-
if (_spiSettings.bOrder) {
185+
if (_spiSettings.getBitOrder()) {
190186
tmp = ((data & 0xff00) >> 8) | ((data & 0xff) << 8);
191187
data = tmp;
192188
}
@@ -197,22 +193,30 @@ uint16_t SPIClass::transfer16(uint16_t data)
197193
/**
198194
* @brief Transfer several bytes. Only one buffer used to send and receive data.
199195
* begin() or beginTransaction() must be called at least once before.
200-
* @param _buf: pointer to the bytes to send. The bytes received are copy in
196+
* @param buf: pointer to the bytes to send. The bytes received are copy in
201197
* this buffer.
202-
* @param _count: number of bytes to send/receive.
198+
* @param count: number of bytes to send/receive.
203199
*/
204-
void SPIClass::transfer(void *_buf, size_t _count)
200+
void SPIClass::transfer(void *buf, size_t count)
205201
{
206202
if ((count != 0) && (buf != NULL)) {
207203
spi_transfer(&_spi, ((uint8_t *)buf), count,
208-
SPI_TRANSFER_TIMEOUT, _spiSettings.noReceive);
204+
SPI_TRANSFER_TIMEOUT, _spiSettings.getSkipRecv());
209205
}
210206
}
211207

212208
/**
213209
* @brief Not implemented.
214210
*/
215-
void SPIClass::usingInterrupt(uint8_t interruptNumber)
211+
void SPIClass::usingInterrupt(int interruptNumber)
212+
{
213+
UNUSED(interruptNumber);
214+
}
215+
216+
/**
217+
* @brief Not implemented.
218+
*/
219+
void SPIClass::notUsingInterrupt(int interruptNumber)
216220
{
217221
UNUSED(interruptNumber);
218222
}

Diff for: libraries/SPI/src/SPI.h

+102-38
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,6 @@ extern "C" {
3838
#define SPI_CLOCK_DIV64 64
3939
#define SPI_CLOCK_DIV128 128
4040

41-
// SPI mode parameters for SPISettings
42-
#define SPI_MODE0 0x00
43-
#define SPI_MODE1 0x01
44-
#define SPI_MODE2 0x02
45-
#define SPI_MODE3 0x03
46-
4741
#define SPI_TRANSMITRECEIVE 0x0
4842
#define SPI_TRANSMITONLY 0x1
4943

@@ -54,37 +48,105 @@ extern "C" {
5448

5549
class SPISettings {
5650
public:
57-
constexpr SPISettings(uint32_t clock, BitOrder bitOrder, uint8_t dataMode, bool noRecv = SPI_TRANSMITRECEIVE)
58-
: clk(clock),
59-
bOrder(bitOrder),
60-
dMode((spi_mode_e)(
61-
(SPI_MODE0 == dataMode) ? SPI_MODE_0 :
62-
(SPI_MODE1 == dataMode) ? SPI_MODE_1 :
63-
(SPI_MODE2 == dataMode) ? SPI_MODE_2 :
64-
(SPI_MODE3 == dataMode) ? SPI_MODE_3 :
65-
SPI_MODE0
66-
)),
67-
noReceive(noRecv)
68-
{ }
69-
constexpr SPISettings()
70-
: clk(SPI_SPEED_CLOCK_DEFAULT),
71-
bOrder(MSBFIRST),
72-
dMode(SPI_MODE_0),
73-
noReceive(SPI_TRANSMITRECEIVE)
74-
{ }
51+
SPISettings(uint32_t clock, BitOrder bitOrder, SPIMode dataMode, bool skipRecv = SPI_TRANSMITRECEIVE)
52+
{
53+
if (__builtin_constant_p(clock)) {
54+
init_AlwaysInline(clock, bitOrder, dataMode, skipRecv);
55+
} else {
56+
init_MightInline(clock, bitOrder, dataMode, skipRecv);
57+
}
58+
}
59+
60+
SPISettings(uint32_t clock, BitOrder bitOrder, int dataMode, bool skipRecv = SPI_TRANSMITRECEIVE)
61+
{
62+
if (__builtin_constant_p(clock)) {
63+
init_AlwaysInline(clock, bitOrder, (SPIMode)dataMode, skipRecv);
64+
} else {
65+
init_MightInline(clock, bitOrder, (SPIMode)dataMode, skipRecv);
66+
}
67+
}
68+
69+
// Default speed set to 4MHz, SPI mode set to MODE 0 and Bit order set to MSB first.
70+
SPISettings()
71+
{
72+
init_AlwaysInline(SPI_SPEED_CLOCK_DEFAULT, MSBFIRST, SPI_MODE0, SPI_TRANSMITRECEIVE);
73+
}
74+
75+
bool operator==(const SPISettings &rhs) const
76+
{
77+
if ((this->clockFreq == rhs.clockFreq) &&
78+
(this->bitOrder == rhs.bitOrder) &&
79+
(this->dataMode == rhs.dataMode) &&
80+
(this->skipRecv == rhs.skipRecv)) {
81+
return true;
82+
}
83+
return false;
84+
}
85+
86+
bool operator!=(const SPISettings &rhs) const
87+
{
88+
return !(*this == rhs);
89+
}
90+
91+
uint32_t getClockFreq() const
92+
{
93+
return clockFreq;
94+
}
95+
SPIMode getDataMode() const
96+
{
97+
return dataMode;
98+
}
99+
BitOrder getBitOrder() const
100+
{
101+
return (bitOrder);
102+
}
103+
bool getSkipRecv() const
104+
{
105+
return skipRecv;
106+
}
107+
108+
void setClockFreq(uint32_t clkFreq)
109+
{
110+
clockFreq = clkFreq;
111+
}
112+
void setDataMode(SPIMode mode)
113+
{
114+
dataMode = mode;
115+
}
116+
void setBitOrder(BitOrder order)
117+
{
118+
bitOrder = order;
119+
}
120+
void setSkipRecv(bool skip)
121+
{
122+
skipRecv = skip;
123+
}
124+
75125
private:
76-
uint32_t clk; //specifies the spi bus maximum clock speed
77-
BitOrder bOrder; //bit order (MSBFirst or LSBFirst)
78-
spi_mode_e dMode; //one of the data mode
79-
//Mode Clock Polarity (CPOL) Clock Phase (CPHA)
80-
//SPI_MODE0 0 0
81-
//SPI_MODE1 0 1
82-
//SPI_MODE2 1 0
83-
//SPI_MODE3 1 1
84-
friend class SPIClass;
85-
bool noReceive;
126+
void init_MightInline(uint32_t clock, BitOrder bitOrder, SPIMode dataMode, bool skipRecv)
127+
{
128+
init_AlwaysInline(clock, bitOrder, dataMode, skipRecv);
129+
}
130+
131+
// Core developer MUST use an helper function in beginTransaction() to use this data
132+
void init_AlwaysInline(uint32_t clock, BitOrder bitOrder, SPIMode dataMode, bool skipRecv) __attribute__((__always_inline__))
133+
{
134+
this->clockFreq = clock;
135+
this->dataMode = dataMode;
136+
this->bitOrder = bitOrder;
137+
this->skipRecv = skipRecv;
138+
}
139+
140+
uint32_t clockFreq;
141+
SPIMode dataMode;
142+
BitOrder bitOrder;
143+
bool skipRecv;
144+
145+
friend class HardwareSPI;
86146
};
87147

148+
const SPISettings DEFAULT_SPI_SETTINGS = SPISettings();
149+
88150
class SPIClass {
89151
public:
90152
SPIClass();
@@ -137,19 +199,21 @@ class SPIClass {
137199
/* Transfer functions: must be called after initialization of the SPI
138200
* instance with begin() or beginTransaction().
139201
*/
140-
virtual byte transfer(uint8_t _data);
202+
virtual uint8_t transfer(uint8_t _data);
141203
virtual uint16_t transfer16(uint16_t _data);
142-
virtual void transfer(void *_buf, size_t _count);
204+
virtual void transfer(void *buf, size_t count);
143205

144206
/* These methods are deprecated and kept for compatibility.
145207
* Use SPISettings with SPI.beginTransaction() to configure SPI parameters.
146208
*/
147209
void setBitOrder(BitOrder);
148210
void setDataMode(uint8_t);
211+
void setDataMode(SPIMode);
149212
void setClockDivider(uint8_t);
150213

151-
// Not implemented functions. Kept for backward compatibility.
152-
void usingInterrupt(uint8_t interruptNumber);
214+
// Not implemented functions. Kept for compatibility.
215+
void usingInterrupt(int interruptNumber);
216+
void notUsingInterrupt(int interruptNumber);
153217
void attachInterrupt(void);
154218
void detachInterrupt(void);
155219

Diff for: libraries/SPI/src/utility/spi_com.c

+3-3
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ static uint32_t compute_disable_delay(spi_t *obj)
227227
* @param msb : set to 1 in msb first
228228
* @retval None
229229
*/
230-
void spi_init(spi_t *obj, uint32_t speed, spi_mode_e mode, uint8_t msb)
230+
void spi_init(spi_t *obj, uint32_t speed, SPIMode mode, uint8_t msb)
231231
{
232232
if (obj == NULL) {
233233
return;
@@ -313,13 +313,13 @@ void spi_init(spi_t *obj, uint32_t speed, spi_mode_e mode, uint8_t msb)
313313

314314
handle->Init.Direction = SPI_DIRECTION_2LINES;
315315

316-
if ((mode == SPI_MODE_0) || (mode == SPI_MODE_2)) {
316+
if ((mode == SPI_MODE0) || (mode == SPI_MODE2)) {
317317
handle->Init.CLKPhase = SPI_PHASE_1EDGE;
318318
} else {
319319
handle->Init.CLKPhase = SPI_PHASE_2EDGE;
320320
}
321321

322-
if ((mode == SPI_MODE_0) || (mode == SPI_MODE_1)) {
322+
if ((mode == SPI_MODE0) || (mode == SPI_MODE1)) {
323323
handle->Init.CLKPolarity = SPI_POLARITY_LOW;
324324
} else {
325325
handle->Init.CLKPolarity = SPI_POLARITY_HIGH;

0 commit comments

Comments
 (0)