Skip to content

Commit 100d602

Browse files
committed
Fix: There's no need to store FSP SPI parameters as class members.
Since they are freshly recalculated at each time beginTransaction is called.
1 parent fe8b469 commit 100d602

File tree

2 files changed

+47
-42
lines changed

2 files changed

+47
-42
lines changed

libraries/SPI/SPI.cpp

Lines changed: 43 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,6 @@ ArduinoSPI::ArduinoSPI(spi_ctrl_t *g_spi_ctrl
3232
_g_spi_ctrl(g_spi_ctrl)
3333
, _g_spi_cfg(g_spi_cfg)
3434
, _g_spi_ext_cfg(g_spi_ext_cfg)
35-
, _clk_phase(SPI_CLK_PHASE_EDGE_ODD)
36-
, _clk_polarity(SPI_CLK_POLARITY_LOW)
37-
, _bit_order(SPI_BIT_ORDER_MSB_FIRST)
3835
, _channel(ch)
3936
, _is_sci(false)
4037
{
@@ -46,9 +43,6 @@ ArduinoSPI::ArduinoSPI(spi_ctrl_t *g_spi_ctrl
4643
_g_spi_ctrl(g_spi_ctrl)
4744
, _g_spi_cfg(g_spi_cfg)
4845
, _g_sci_spi_ext_cfg(g_spi_ext_cfg)
49-
, _clk_phase(SPI_CLK_PHASE_EDGE_ODD)
50-
, _clk_polarity(SPI_CLK_POLARITY_LOW)
51-
, _bit_order(SPI_BIT_ORDER_MSB_FIRST)
5246
, _channel(ch)
5347
, _is_sci(true)
5448
{
@@ -162,6 +156,40 @@ void ArduinoSPI::setPins(bsp_io_port_pin_t miso, bsp_io_port_pin_t mosi,
162156
pinPeripheral(sck, (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | peripheralCfg);
163157
}
164158

159+
std::tuple<spi_clk_phase_t, spi_clk_polarity_t, spi_bit_order_t> ArduinoSPI::toFspSpiConfig(arduino::SPISettings const & settings)
160+
{
161+
spi_clk_phase_t clk_phase = SPI_CLK_PHASE_EDGE_ODD;
162+
spi_clk_polarity_t clk_polarity = SPI_CLK_POLARITY_LOW;
163+
spi_bit_order_t bit_order = SPI_BIT_ORDER_MSB_FIRST;
164+
165+
switch(settings.getDataMode())
166+
{
167+
case arduino::SPI_MODE0:
168+
clk_polarity = SPI_CLK_POLARITY_LOW;
169+
clk_phase = SPI_CLK_PHASE_EDGE_ODD;
170+
break;
171+
case arduino::SPI_MODE1:
172+
clk_polarity = SPI_CLK_POLARITY_LOW;
173+
clk_phase = SPI_CLK_PHASE_EDGE_EVEN;
174+
break;
175+
case arduino::SPI_MODE2:
176+
clk_polarity = SPI_CLK_POLARITY_HIGH;
177+
clk_phase = SPI_CLK_PHASE_EDGE_ODD;
178+
break;
179+
case arduino::SPI_MODE3:
180+
clk_polarity = SPI_CLK_POLARITY_HIGH;
181+
clk_phase = SPI_CLK_PHASE_EDGE_EVEN;
182+
break;
183+
}
184+
185+
if(settings.getBitOrder() == LSBFIRST)
186+
bit_order = SPI_BIT_ORDER_LSB_FIRST;
187+
else
188+
bit_order = SPI_BIT_ORDER_MSB_FIRST;
189+
190+
return std::make_tuple(clk_phase, clk_polarity, bit_order);
191+
}
192+
165193
void ArduinoSPI::usingInterrupt(int interruptNumber)
166194
{
167195
}
@@ -233,32 +261,9 @@ void ArduinoSPI::transfer(void *buf, size_t count) {
233261
}
234262
}
235263

236-
void ArduinoSPI::beginTransaction(arduino::SPISettings settings) {
237-
// data mode
238-
switch(settings.getDataMode()){
239-
case arduino::SPI_MODE0:
240-
_clk_polarity = SPI_CLK_POLARITY_LOW;
241-
_clk_phase = SPI_CLK_PHASE_EDGE_ODD;
242-
break;
243-
case arduino::SPI_MODE1:
244-
_clk_polarity = SPI_CLK_POLARITY_LOW;
245-
_clk_phase = SPI_CLK_PHASE_EDGE_EVEN;
246-
break;
247-
case arduino::SPI_MODE2:
248-
_clk_polarity = SPI_CLK_POLARITY_HIGH;
249-
_clk_phase = SPI_CLK_PHASE_EDGE_ODD;
250-
break;
251-
case arduino::SPI_MODE3:
252-
_clk_polarity = SPI_CLK_POLARITY_HIGH;
253-
_clk_phase = SPI_CLK_PHASE_EDGE_EVEN;
254-
break;
255-
}
256-
// bit order
257-
if(settings.getBitOrder() == LSBFIRST){
258-
_bit_order = SPI_BIT_ORDER_LSB_FIRST;
259-
} else {
260-
_bit_order = SPI_BIT_ORDER_MSB_FIRST;
261-
}
264+
void ArduinoSPI::beginTransaction(arduino::SPISettings settings)
265+
{
266+
auto [clk_phase, clk_polarity, bit_order] = toFspSpiConfig(settings);
262267

263268
// Clock settings
264269
if (_is_sci) {
@@ -278,13 +283,13 @@ void ArduinoSPI::beginTransaction(arduino::SPISettings settings) {
278283
uint32_t smr = R_SCI0_SMR_CM_Msk;
279284

280285
/* Configure CPHA setting. */
281-
spmr |= (uint32_t) _clk_phase << 7;
286+
spmr |= (uint32_t) clk_phase << 7;
282287

283288
/* Configure CPOL setting. */
284-
spmr |= (uint32_t) _clk_polarity << 6;
289+
spmr |= (uint32_t) clk_polarity << 6;
285290

286291
/* Configure Bit Order (MSB,LSB) */
287-
scmr |= (uint32_t) _bit_order << 3;
292+
scmr |= (uint32_t) bit_order << 3;
288293

289294
/* Select the baud rate generator clock divider. */
290295
smr |= (uint32_t) clk_div.cks;
@@ -311,13 +316,13 @@ void ArduinoSPI::beginTransaction(arduino::SPISettings settings) {
311316
uint32_t spbr = p_ctrl->p_regs->SPBR;
312317

313318
/* Configure CPHA setting. */
314-
spcmd0 |= (uint32_t) _clk_phase;
319+
spcmd0 |= (uint32_t) clk_phase;
315320

316321
/* Configure CPOL setting. */
317-
spcmd0 |= (uint32_t) _clk_polarity << 1;
322+
spcmd0 |= (uint32_t) clk_polarity << 1;
318323

319324
/* Configure Bit Order (MSB,LSB) */
320-
spcmd0 |= (uint32_t) _bit_order << 12;
325+
spcmd0 |= (uint32_t) bit_order << 12;
321326

322327
/* Configure the Bit Rate Division Setting */
323328
spcmd0 &= !(((uint32_t)0xFF) << 2);

libraries/SPI/SPI.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
#include "bsp_api.h"
2121
#include "hal_data.h"
2222

23+
#include <tuple>
24+
2325
//extern const spi_extended_cfg_t g_spi0_ext_cfg;
2426
//extern const sci_spi_extended_cfg_t g_spi1_cfg_extend;
2527

@@ -70,15 +72,13 @@ class ArduinoSPI : public SPIClass
7072
const spi_extended_cfg_t *_g_spi_ext_cfg;
7173
const sci_spi_extended_cfg_t *_g_sci_spi_ext_cfg;
7274

73-
spi_clk_phase_t _clk_phase;
74-
spi_clk_polarity_t _clk_polarity;
75-
spi_bit_order_t _bit_order;
76-
7775
bsp_io_port_pin_t _miso, _mosi, _sck, _cs;
7876
int _channel;
7977
int _cb_event_idx;
8078

8179
bool _is_sci;
80+
81+
static std::tuple<spi_clk_phase_t, spi_clk_polarity_t, spi_bit_order_t> toFspSpiConfig(arduino::SPISettings const & settings);
8282
};
8383

8484
}

0 commit comments

Comments
 (0)