Skip to content

Commit fe5f2f1

Browse files
committed
chore(spi): partially align with ArduinoCoreAPI
Keep constexpr constructor to ensures that constructing an SPISettings object can be done at compiletime. Fixes stm32duino#2201. Signed-off-by: Frederic Pillon <[email protected]>
1 parent c9a89f1 commit fe5f2f1

File tree

4 files changed

+96
-89
lines changed

4 files changed

+96
-89
lines changed

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

+49-46
Original file line numberDiff line numberDiff line change
@@ -57,9 +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-
spi_init(&_spi, _spiSettings.clk,
61-
_spiSettings.dMode,
62-
_spiSettings.bOrder);
60+
_spiSettings = SPISettings();
61+
spi_init(&_spi, _spiSettings.clockFreq,
62+
_spiSettings.dataMode,
63+
_spiSettings.bitOrder);
6364
}
6465

6566
/**
@@ -69,14 +70,12 @@ void SPIClass::begin(void)
6970
*/
7071
void SPIClass::beginTransaction(SPISettings settings)
7172
{
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);
73+
if (_spiSettings != settings) {
74+
_spiSettings = settings;
75+
spi_init(&_spi, _spiSettings.clockFreq,
76+
_spiSettings.dataMode,
77+
_spiSettings.bitOrder);
78+
}
8079
}
8180

8281
/**
@@ -90,71 +89,67 @@ void SPIClass::endTransaction(void)
9089
/**
9190
* @brief Deinitialize the SPI instance and stop it.
9291
*/
93-
void SPIClass::end()
92+
void SPIClass::end(void)
9493
{
9594
spi_deinit(&_spi);
9695
}
9796

9897
/**
9998
* @brief Deprecated function.
10099
* Configure the bit order: MSB first or LSB first.
101-
* @param _bitOrder: MSBFIRST or LSBFIRST
100+
* @param bitOrder: MSBFIRST or LSBFIRST
102101
*/
103102
void SPIClass::setBitOrder(BitOrder bitOrder)
104103
{
105-
_spiSettings.bOrder = bitOrder;
104+
_spiSettings.bitOrder = bitOrder;
106105

107-
spi_init(&_spi, _spiSettings.clk,
108-
_spiSettings.dMode,
109-
_spiSettings.bOrder);
106+
spi_init(&_spi, _spiSettings.clockFreq,
107+
_spiSettings.dataMode,
108+
_spiSettings.bitOrder);
110109
}
111110

112111
/**
113112
* @brief Deprecated function.
114113
* Configure the data mode (clock polarity and clock phase)
115-
* @param _mode: SPI_MODE0, SPI_MODE1, SPI_MODE2 or SPI_MODE3
114+
* @param mode: SPI_MODE0, SPI_MODE1, SPI_MODE2 or SPI_MODE3
116115
* @note
117116
* Mode Clock Polarity (CPOL) Clock Phase (CPHA)
118117
* SPI_MODE0 0 0
119118
* SPI_MODE1 0 1
120119
* SPI_MODE2 1 0
121120
* SPI_MODE3 1 1
122121
*/
123-
void SPIClass::setDataMode(uint8_t _mode)
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.dataMode = mode;
130+
spi_init(&_spi, _spiSettings.clockFreq,
131+
_spiSettings.dataMode,
132+
_spiSettings.bitOrder);
138133
}
139134

140135
/**
141136
* @brief Deprecated function.
142137
* Configure the clock speed
143-
* @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.
144139
* If 0, default SPI speed is used.
145140
*/
146-
void SPIClass::setClockDivider(uint8_t _divider)
141+
void SPIClass::setClockDivider(uint8_t divider)
147142
{
148-
if (_divider == 0) {
149-
_spiSettings.clk = SPI_SPEED_CLOCK_DEFAULT;
143+
if (divider == 0) {
144+
_spiSettings.clockFreq = SPI_SPEED_CLOCK_DEFAULT;
150145
} else {
151146
/* Get clk freq of the SPI instance and compute it */
152-
_spiSettings.clk = spi_getClkFreq(&_spi) / _divider;
147+
_spiSettings.clockFreq = spi_getClkFreq(&_spi) / divider;
153148
}
154149

155-
spi_init(&_spi, _spiSettings.clk,
156-
_spiSettings.dMode,
157-
_spiSettings.bOrder);
150+
spi_init(&_spi, _spiSettings.clockFreq,
151+
_spiSettings.dataMode,
152+
_spiSettings.bitOrder);
158153
}
159154

160155
/**
@@ -163,7 +158,7 @@ void SPIClass::setClockDivider(uint8_t _divider)
163158
* @param data: byte to send.
164159
* @return byte received from the slave.
165160
*/
166-
byte SPIClass::transfer(uint8_t data)
161+
uint8_t SPIClass::transfer(uint8_t data)
167162
{
168163
spi_transfer(&_spi, &data, sizeof(uint8_t), SPI_TRANSFER_TIMEOUT, _spiSettings.noReceive);
169164
return data;
@@ -179,14 +174,14 @@ uint16_t SPIClass::transfer16(uint16_t data)
179174
{
180175
uint16_t tmp;
181176

182-
if (_spiSettings.bOrder) {
177+
if (_spiSettings.bitOrder) {
183178
tmp = ((data & 0xff00) >> 8) | ((data & 0xff) << 8);
184179
data = tmp;
185180
}
186181
spi_transfer(&_spi, (uint8_t *)&data, sizeof(uint16_t),
187182
SPI_TRANSFER_TIMEOUT, _spiSettings.noReceive);
188183

189-
if (_spiSettings.bOrder) {
184+
if (_spiSettings.bitOrder) {
190185
tmp = ((data & 0xff00) >> 8) | ((data & 0xff) << 8);
191186
data = tmp;
192187
}
@@ -197,11 +192,11 @@ uint16_t SPIClass::transfer16(uint16_t data)
197192
/**
198193
* @brief Transfer several bytes. Only one buffer used to send and receive data.
199194
* 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
195+
* @param buf: pointer to the bytes to send. The bytes received are copy in
201196
* this buffer.
202-
* @param _count: number of bytes to send/receive.
197+
* @param count: number of bytes to send/receive.
203198
*/
204-
void SPIClass::transfer(void *_buf, size_t _count)
199+
void SPIClass::transfer(void *buf, size_t count)
205200
{
206201
if ((count != 0) && (buf != NULL)) {
207202
spi_transfer(&_spi, ((uint8_t *)buf), count,
@@ -212,7 +207,15 @@ void SPIClass::transfer(void *_buf, size_t _count)
212207
/**
213208
* @brief Not implemented.
214209
*/
215-
void SPIClass::usingInterrupt(uint8_t interruptNumber)
210+
void SPIClass::usingInterrupt(int interruptNumber)
211+
{
212+
UNUSED(interruptNumber);
213+
}
214+
215+
/**
216+
* @brief Not implemented.
217+
*/
218+
void SPIClass::notUsingInterrupt(int interruptNumber)
216219
{
217220
UNUSED(interruptNumber);
218221
}

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

+37-34
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,35 +48,42 @@ 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-
)),
51+
constexpr SPISettings(uint32_t clock, BitOrder bitOrder, SPIMode dataMode, bool noRecv = SPI_TRANSMITRECEIVE)
52+
: clockFreq(clock),
53+
bitOrder(bitOrder),
54+
dataMode(dataMode),
6755
noReceive(noRecv)
6856
{ }
6957
constexpr SPISettings()
70-
: clk(SPI_SPEED_CLOCK_DEFAULT),
71-
bOrder(MSBFIRST),
72-
dMode(SPI_MODE_0),
58+
: clockFreq(SPI_SPEED_CLOCK_DEFAULT),
59+
bitOrder(MSBFIRST),
60+
dataMode(SPI_MODE0),
7361
noReceive(SPI_TRANSMITRECEIVE)
7462
{ }
63+
64+
bool operator==(const SPISettings &rhs) const
65+
{
66+
if ((this->clockFreq == rhs.clockFreq) &&
67+
(this->bitOrder == rhs.bitOrder) &&
68+
(this->dataMode == rhs.dataMode) &&
69+
(this->noReceive == rhs.noReceive)) {
70+
return true;
71+
}
72+
return false;
73+
}
74+
75+
bool operator!=(const SPISettings &rhs) const
76+
{
77+
return !(*this == rhs);
78+
}
79+
7580
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;
81+
uint32_t clockFreq; //specifies the spi bus maximum clock speed
82+
BitOrder bitOrder; //bit order (MSBFirst or LSBFirst)
83+
SPIMode dataMode; //one of the data mode
8584
bool noReceive;
85+
86+
friend class SPIClass;
8687
};
8788

8889
class SPIClass {
@@ -125,7 +126,7 @@ class SPIClass {
125126
_spi.pin_ssel = (ssel);
126127
};
127128

128-
virtual void begin();
129+
virtual void begin(void);
129130
void end(void);
130131

131132
/* This function should be used to configure the SPI instance in case you
@@ -137,19 +138,21 @@ class SPIClass {
137138
/* Transfer functions: must be called after initialization of the SPI
138139
* instance with begin() or beginTransaction().
139140
*/
140-
virtual byte transfer(uint8_t _data);
141-
virtual uint16_t transfer16(uint16_t _data);
142-
virtual void transfer(void *_buf, size_t _count);
141+
virtual uint8_t transfer(uint8_t data);
142+
virtual uint16_t transfer16(uint16_t data);
143+
virtual void transfer(void *buf, size_t count);
143144

144145
/* These methods are deprecated and kept for compatibility.
145146
* Use SPISettings with SPI.beginTransaction() to configure SPI parameters.
146147
*/
147148
void setBitOrder(BitOrder);
148149
void setDataMode(uint8_t);
150+
void setDataMode(SPIMode);
149151
void setClockDivider(uint8_t);
150152

151-
// Not implemented functions. Kept for backward compatibility.
152-
void usingInterrupt(uint8_t interruptNumber);
153+
// Not implemented functions. Kept for compatibility.
154+
void usingInterrupt(int interruptNumber);
155+
void notUsingInterrupt(int interruptNumber);
153156
void attachInterrupt(void);
154157
void detachInterrupt(void);
155158

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;

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

+7-6
Original file line numberDiff line numberDiff line change
@@ -85,12 +85,13 @@ typedef struct spi_s spi_t;
8585
//SPI_MODE2 1 0
8686
//SPI_MODE3 1 1
8787
//enum definitions coming from SPI.h of SAM
88+
// SPI mode parameters for SPISettings
8889
typedef enum {
89-
SPI_MODE_0 = 0x00,
90-
SPI_MODE_1 = 0x01,
91-
SPI_MODE_2 = 0x02,
92-
SPI_MODE_3 = 0x03
93-
} spi_mode_e;
90+
SPI_MODE0 = 0,
91+
SPI_MODE1 = 1,
92+
SPI_MODE2 = 2,
93+
SPI_MODE3 = 3,
94+
} SPIMode;
9495

9596
///@brief SPI errors
9697
typedef enum {
@@ -100,7 +101,7 @@ typedef enum {
100101
} spi_status_e;
101102

102103
/* Exported functions ------------------------------------------------------- */
103-
void spi_init(spi_t *obj, uint32_t speed, spi_mode_e mode, uint8_t msb);
104+
void spi_init(spi_t *obj, uint32_t speed, SPIMode mode, uint8_t msb);
104105
void spi_deinit(spi_t *obj);
105106
spi_status_e spi_transfer(spi_t *obj, uint8_t *buffer, uint16_t len,
106107
uint32_t Timeout, bool skipReceive);

0 commit comments

Comments
 (0)