Skip to content

Commit 2c6feda

Browse files
committed
Exctract spaghetti code from SPI.beginTransaction into two separate configSpi/configSpiSci functions.
1 parent 100d602 commit 2c6feda

File tree

2 files changed

+76
-70
lines changed

2 files changed

+76
-70
lines changed

libraries/SPI/SPI.cpp

Lines changed: 74 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,76 @@ void ArduinoSPI::setPins(bsp_io_port_pin_t miso, bsp_io_port_pin_t mosi,
156156
pinPeripheral(sck, (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | peripheralCfg);
157157
}
158158

159+
void ArduinoSPI::configSpi(arduino::SPISettings const & settings)
160+
{
161+
auto [clk_phase, clk_polarity, bit_order] = toFspSpiConfig(settings);
162+
163+
if (initialized)
164+
R_SPI_Close(_g_spi_ctrl);
165+
166+
rspck_div_setting_t spck_div = _g_spi_ext_cfg->spck_div;
167+
R_SPI_CalculateBitrate(settings.getClockFreq(), &spck_div);
168+
169+
R_SPI_Open(_g_spi_ctrl, _g_spi_cfg);
170+
171+
spi_instance_ctrl_t * p_ctrl = (spi_instance_ctrl_t *)_g_spi_ctrl;
172+
uint32_t spcmd0 = p_ctrl->p_regs->SPCMD[0];
173+
uint32_t spbr = p_ctrl->p_regs->SPBR;
174+
175+
/* Configure CPHA setting. */
176+
spcmd0 |= (uint32_t) clk_phase;
177+
178+
/* Configure CPOL setting. */
179+
spcmd0 |= (uint32_t) clk_polarity << 1;
180+
181+
/* Configure Bit Order (MSB,LSB) */
182+
spcmd0 |= (uint32_t) bit_order << 12;
183+
184+
/* Configure the Bit Rate Division Setting */
185+
spcmd0 &= !(((uint32_t)0xFF) << 2);
186+
spcmd0 |= (uint32_t) spck_div.brdv << 2;
187+
188+
/* Update settings. */
189+
p_ctrl->p_regs->SPCMD[0] = (uint16_t) spcmd0;
190+
p_ctrl->p_regs->SPBR = (uint8_t) spck_div.spbr;
191+
}
192+
193+
void ArduinoSPI::configSpiSci(arduino::SPISettings const & settings)
194+
{
195+
auto [clk_phase, clk_polarity, bit_order] = toFspSpiConfig(settings);
196+
197+
if (initialized)
198+
R_SCI_SPI_Close(_g_spi_ctrl);
199+
200+
sci_spi_div_setting_t clk_div = _g_sci_spi_ext_cfg->clk_div;
201+
R_SCI_SPI_CalculateBitrate(settings.getClockFreq(), &clk_div, false);
202+
203+
R_SCI_SPI_Open(_g_spi_ctrl, _g_spi_cfg);
204+
205+
sci_spi_instance_ctrl_t * p_ctrl = (sci_spi_instance_ctrl_t *)_g_spi_ctrl;
206+
uint32_t spmr = p_ctrl->p_reg->SPMR;
207+
uint32_t scmr = p_ctrl->p_reg->SCMR;
208+
uint32_t smr = R_SCI0_SMR_CM_Msk;
209+
210+
/* Configure CPHA setting. */
211+
spmr |= (uint32_t) clk_phase << 7;
212+
213+
/* Configure CPOL setting. */
214+
spmr |= (uint32_t) clk_polarity << 6;
215+
216+
/* Configure Bit Order (MSB,LSB) */
217+
scmr |= (uint32_t) bit_order << 3;
218+
219+
/* Select the baud rate generator clock divider. */
220+
smr |= (uint32_t) clk_div.cks;
221+
222+
/* Update settings. */
223+
p_ctrl->p_reg->SMR = (uint8_t) smr;
224+
p_ctrl->p_reg->BRR = (uint8_t) clk_div.brr;
225+
p_ctrl->p_reg->SPMR = spmr;
226+
p_ctrl->p_reg->SCMR = scmr;
227+
}
228+
159229
std::tuple<spi_clk_phase_t, spi_clk_polarity_t, spi_bit_order_t> ArduinoSPI::toFspSpiConfig(arduino::SPISettings const & settings)
160230
{
161231
spi_clk_phase_t clk_phase = SPI_CLK_PHASE_EDGE_ODD;
@@ -263,76 +333,10 @@ void ArduinoSPI::transfer(void *buf, size_t count) {
263333

264334
void ArduinoSPI::beginTransaction(arduino::SPISettings settings)
265335
{
266-
auto [clk_phase, clk_polarity, bit_order] = toFspSpiConfig(settings);
267-
268-
// Clock settings
269-
if (_is_sci) {
270-
271-
if (initialized) {
272-
R_SCI_SPI_Close(_g_spi_ctrl);
273-
}
274-
275-
sci_spi_div_setting_t clk_div = _g_sci_spi_ext_cfg->clk_div;
276-
R_SCI_SPI_CalculateBitrate(settings.getClockFreq(), &clk_div, false);
277-
278-
R_SCI_SPI_Open(_g_spi_ctrl, _g_spi_cfg);
279-
280-
sci_spi_instance_ctrl_t * p_ctrl = (sci_spi_instance_ctrl_t *)_g_spi_ctrl;
281-
uint32_t spmr = p_ctrl->p_reg->SPMR;
282-
uint32_t scmr = p_ctrl->p_reg->SCMR;
283-
uint32_t smr = R_SCI0_SMR_CM_Msk;
284-
285-
/* Configure CPHA setting. */
286-
spmr |= (uint32_t) clk_phase << 7;
287-
288-
/* Configure CPOL setting. */
289-
spmr |= (uint32_t) clk_polarity << 6;
290-
291-
/* Configure Bit Order (MSB,LSB) */
292-
scmr |= (uint32_t) bit_order << 3;
293-
294-
/* Select the baud rate generator clock divider. */
295-
smr |= (uint32_t) clk_div.cks;
296-
297-
// Update settings
298-
p_ctrl->p_reg->SMR = (uint8_t) smr;
299-
p_ctrl->p_reg->BRR = (uint8_t) clk_div.brr;
300-
p_ctrl->p_reg->SPMR = spmr;
301-
p_ctrl->p_reg->SCMR = scmr;
302-
303-
} else {
304-
305-
if (initialized) {
306-
R_SPI_Close(_g_spi_ctrl);
307-
}
308-
309-
rspck_div_setting_t spck_div = _g_spi_ext_cfg->spck_div;
310-
R_SPI_CalculateBitrate(settings.getClockFreq(), &spck_div);
311-
312-
R_SPI_Open(_g_spi_ctrl, _g_spi_cfg);
313-
314-
spi_instance_ctrl_t * p_ctrl = (spi_instance_ctrl_t *)_g_spi_ctrl;
315-
uint32_t spcmd0 = p_ctrl->p_regs->SPCMD[0];
316-
uint32_t spbr = p_ctrl->p_regs->SPBR;
317-
318-
/* Configure CPHA setting. */
319-
spcmd0 |= (uint32_t) clk_phase;
320-
321-
/* Configure CPOL setting. */
322-
spcmd0 |= (uint32_t) clk_polarity << 1;
323-
324-
/* Configure Bit Order (MSB,LSB) */
325-
spcmd0 |= (uint32_t) bit_order << 12;
326-
327-
/* Configure the Bit Rate Division Setting */
328-
spcmd0 &= !(((uint32_t)0xFF) << 2);
329-
spcmd0 |= (uint32_t) spck_div.brdv << 2;
330-
331-
// Update settings
332-
p_ctrl->p_regs->SPCMD[0] = (uint16_t) spcmd0;
333-
p_ctrl->p_regs->SPBR = (uint8_t) spck_div.spbr;
334-
335-
}
336+
if (_is_sci)
337+
configSpiSci(settings);
338+
else
339+
configSpi(settings);
336340
}
337341

338342
void ArduinoSPI::endTransaction(void) {

libraries/SPI/SPI.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ class ArduinoSPI : public SPIClass
7878

7979
bool _is_sci;
8080

81+
void configSpi(arduino::SPISettings const & settings);
82+
void configSpiSci(arduino::SPISettings const & settings);
8183
static std::tuple<spi_clk_phase_t, spi_clk_polarity_t, spi_bit_order_t> toFspSpiConfig(arduino::SPISettings const & settings);
8284
};
8385

0 commit comments

Comments
 (0)