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

+8-6
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

+43-65
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)