Skip to content

Commit cd3043f

Browse files
authored
Merge pull request #2204 from fpistm/spi_fixup
[spi]: Keep constexpr constructor
2 parents a46472a + e781dc7 commit cd3043f

File tree

5 files changed

+80
-167
lines changed

5 files changed

+80
-167
lines changed

libraries/SPI/README.md

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,6 @@ User have 2 possibilities about the management of the CS pin:
77
* the CS pin is managed directly by the user code before to transfer the data (like the Arduino SPI library)
88
* the user uses a hardware CS pin linked to the SPI peripheral
99

10-
### New SPISetting parameter
11-
12-
* `noReceive`: value can be `SPI_TRANSMITRECEIVE` or `SPI_TRANSMITONLY`. It allows to skip receive data after transmitting. Default `SPI_TRANSMITRECEIVE`.
13-
1410
### New API functions
1511

1612
* `SPIClass::SPIClass(uint8_t mosi, uint8_t miso, uint8_t sclk, uint8_t ssel)`: alternative class constructor
@@ -39,10 +35,15 @@ void setup() {
3935
}
4036
```
4137
38+
### Extended API
39+
40+
* All `transfer()` API's have a new bool argument `skipReceive`. It allows to skip receive data after transmitting. Value can be `SPI_TRANSMITRECEIVE` or `SPI_TRANSMITONLY`. Default `SPI_TRANSMITRECEIVE`.
41+
4242
#### Change default `SPI` instance pins
4343
It is also possible to change the default pins used by the `SPI` instance using above API:
4444
45-
[[/img/Warning-icon.png|alt="Warning"]] **Have to be called before `begin()`.**
45+
> [!WARNING]
46+
> **Have to be called before `begin()`.**
4647
4748
* `void setMISO(uint32_t miso)`
4849
* `void setMOSI(uint32_t mosi)`
@@ -53,7 +54,8 @@ It is also possible to change the default pins used by the `SPI` instance using
5354
* `void setSCLK(PinName sclk)`
5455
* `void setSSEL(PinName ssel)`
5556
56-
**_Note 1_** Using `setSSEL()` allows to enable hardware CS pin management linked to the SPI peripheral.
57+
> [!NOTE]
58+
> Using `setSSEL()` allows to enable hardware CS pin management linked to the SPI peripheral.
5759
5860
##### Example:
5961
```C++

libraries/SPI/src/SPI.cpp

Lines changed: 43 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,10 @@ 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-
_spiSettings = DEFAULT_SPI_SETTINGS;
61-
spi_init(&_spi, _spiSettings.getClockFreq(),
62-
_spiSettings.getDataMode(),
63-
_spiSettings.getBitOrder());
60+
_spiSettings = SPISettings();
61+
spi_init(&_spi, _spiSettings.clockFreq,
62+
_spiSettings.dataMode,
63+
_spiSettings.bitOrder);
6464
}
6565

6666
/**
@@ -72,9 +72,9 @@ void SPIClass::beginTransaction(SPISettings settings)
7272
{
7373
if (_spiSettings != settings) {
7474
_spiSettings = settings;
75-
spi_init(&_spi, _spiSettings.getClockFreq(),
76-
_spiSettings.getDataMode(),
77-
_spiSettings.getBitOrder());
75+
spi_init(&_spi, _spiSettings.clockFreq,
76+
_spiSettings.dataMode,
77+
_spiSettings.bitOrder);
7878
}
7979
}
8080

@@ -89,23 +89,23 @@ void SPIClass::endTransaction(void)
8989
/**
9090
* @brief Deinitialize the SPI instance and stop it.
9191
*/
92-
void SPIClass::end()
92+
void SPIClass::end(void)
9393
{
9494
spi_deinit(&_spi);
9595
}
9696

9797
/**
9898
* @brief Deprecated function.
9999
* Configure the bit order: MSB first or LSB first.
100-
* @param _bitOrder: MSBFIRST or LSBFIRST
100+
* @param bitOrder: MSBFIRST or LSBFIRST
101101
*/
102102
void SPIClass::setBitOrder(BitOrder bitOrder)
103103
{
104-
_spiSettings.setBitOrder(bitOrder);
104+
_spiSettings.bitOrder = bitOrder;
105105

106-
spi_init(&_spi, _spiSettings.getClockFreq(),
107-
_spiSettings.getDataMode(),
108-
_spiSettings.getBitOrder());
106+
spi_init(&_spi, _spiSettings.clockFreq,
107+
_spiSettings.dataMode,
108+
_spiSettings.bitOrder);
109109
}
110110

111111
/**
@@ -119,71 +119,75 @@ void SPIClass::setBitOrder(BitOrder bitOrder)
119119
* SPI_MODE2 1 0
120120
* SPI_MODE3 1 1
121121
*/
122-
123122
void SPIClass::setDataMode(uint8_t mode)
124123
{
125124
setDataMode((SPIMode)mode);
126125
}
127126

128127
void SPIClass::setDataMode(SPIMode mode)
129128
{
130-
_spiSettings.setDataMode(mode);
131-
132-
spi_init(&_spi, _spiSettings.getClockFreq(),
133-
_spiSettings.getDataMode(),
134-
_spiSettings.getBitOrder());
129+
_spiSettings.dataMode = mode;
130+
spi_init(&_spi, _spiSettings.clockFreq,
131+
_spiSettings.dataMode,
132+
_spiSettings.bitOrder);
135133
}
136134

137135
/**
138136
* @brief Deprecated function.
139137
* Configure the clock speed
140-
* @param _divider: the SPI clock can be divided by values from 1 to 255.
138+
* @param divider: the SPI clock can be divided by values from 1 to 255.
141139
* If 0, default SPI speed is used.
142140
*/
143-
void SPIClass::setClockDivider(uint8_t _divider)
141+
void SPIClass::setClockDivider(uint8_t divider)
144142
{
145-
if (_divider == 0) {
146-
_spiSettings.setClockFreq(SPI_SPEED_CLOCK_DEFAULT);
143+
if (divider == 0) {
144+
_spiSettings.clockFreq = SPI_SPEED_CLOCK_DEFAULT;
147145
} else {
148-
/* Get clock freq of the SPI instance and compute it */
149-
_spiSettings.setClockFreq(spi_getClkFreq(&_spi) / _divider);
146+
/* Get clk freq of the SPI instance and compute it */
147+
_spiSettings.clockFreq = spi_getClkFreq(&_spi) / divider;
150148
}
151149

152-
spi_init(&_spi, _spiSettings.getClockFreq(),
153-
_spiSettings.getDataMode(),
154-
_spiSettings.getBitOrder());
150+
spi_init(&_spi, _spiSettings.clockFreq,
151+
_spiSettings.dataMode,
152+
_spiSettings.bitOrder);
155153
}
156154

157155
/**
158156
* @brief Transfer one byte on the SPI bus.
159157
* begin() or beginTransaction() must be called at least once before.
160158
* @param data: byte to send.
159+
* @param skipReceive: skip receiving data after transmit or not.
160+
* SPI_TRANSMITRECEIVE or SPI_TRANSMITONLY.
161+
* Optional, default: SPI_TRANSMITRECEIVE.
161162
* @return byte received from the slave.
162163
*/
163-
uint8_t SPIClass::transfer(uint8_t data)
164+
uint8_t SPIClass::transfer(uint8_t data, bool skipReceive)
164165
{
165-
spi_transfer(&_spi, &data, sizeof(uint8_t), SPI_TRANSFER_TIMEOUT, _spiSettings.getSkipRecv());
166+
spi_transfer(&_spi, &data, sizeof(uint8_t), SPI_TRANSFER_TIMEOUT, skipReceive);
166167
return data;
167168
}
168169

169170
/**
170171
* @brief Transfer two bytes on the SPI bus in 16 bits format.
171172
* begin() or beginTransaction() must be called at least once before.
172173
* @param data: bytes to send.
174+
* @param skipReceive: skip receiving data after transmit or not.
175+
* SPI_TRANSMITRECEIVE or SPI_TRANSMITONLY.
176+
* Optional, default: SPI_TRANSMITRECEIVE.
173177
* @return bytes received from the slave in 16 bits format.
174178
*/
175-
uint16_t SPIClass::transfer16(uint16_t data)
179+
uint16_t SPIClass::transfer16(uint16_t data, bool skipReceive)
176180
{
177181
uint16_t tmp;
178182

179-
if (_spiSettings.getBitOrder()) {
183+
if (_spiSettings.bitOrder) {
180184
tmp = ((data & 0xff00) >> 8) | ((data & 0xff) << 8);
181185
data = tmp;
182186
}
183187
spi_transfer(&_spi, (uint8_t *)&data, sizeof(uint16_t),
184-
SPI_TRANSFER_TIMEOUT, _spiSettings.getSkipRecv());
188+
SPI_TRANSFER_TIMEOUT, skipReceive);
185189

186-
if (_spiSettings.getBitOrder()) {
190+
if (_spiSettings.bitOrder) {
187191
tmp = ((data & 0xff00) >> 8) | ((data & 0xff) << 8);
188192
data = tmp;
189193
}
@@ -197,12 +201,15 @@ uint16_t SPIClass::transfer16(uint16_t data)
197201
* @param buf: pointer to the bytes to send. The bytes received are copy in
198202
* this buffer.
199203
* @param count: number of bytes to send/receive.
204+
* @param skipReceive: skip receiving data after transmit or not.
205+
* SPI_TRANSMITRECEIVE or SPI_TRANSMITONLY.
206+
* Optional, default: SPI_TRANSMITRECEIVE.
200207
*/
201-
void SPIClass::transfer(void *buf, size_t count)
208+
void SPIClass::transfer(void *buf, size_t count, bool skipReceive)
202209
{
203210
if ((count != 0) && (buf != NULL)) {
204211
spi_transfer(&_spi, ((uint8_t *)buf), count,
205-
SPI_TRANSFER_TIMEOUT, _spiSettings.getSkipRecv());
212+
SPI_TRANSFER_TIMEOUT, skipReceive);
206213
}
207214
}
208215

@@ -239,35 +246,6 @@ void SPIClass::detachInterrupt(void)
239246
}
240247

241248
#if defined(SUBGHZSPI_BASE)
242-
void SUBGHZSPIClass::begin()
243-
{
244-
SPIClass::begin();
245-
}
246-
247-
void SUBGHZSPIClass::beginTransaction(SPISettings settings)
248-
{
249-
SPIClass::beginTransaction(settings);
250-
}
251-
252-
byte SUBGHZSPIClass::transfer(uint8_t _data)
253-
{
254-
byte res;
255-
res = SPIClass::transfer(_data);
256-
return res;
257-
}
258-
259-
uint16_t SUBGHZSPIClass::transfer16(uint16_t _data)
260-
{
261-
uint16_t rx_buffer = 0;
262-
rx_buffer = SPIClass::transfer16(_data);
263-
return rx_buffer;
264-
}
265-
266-
void SUBGHZSPIClass::transfer(void *_buf, size_t _count)
267-
{
268-
SPIClass::transfer(_buf, _count);
269-
}
270-
271249
void SUBGHZSPIClass::enableDebugPins(uint32_t mosi, uint32_t miso, uint32_t sclk, uint32_t ssel)
272250
{
273251
/* Configure SPI GPIO pins */

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy