Skip to content

Commit d29cb4e

Browse files
authored
Merge pull request arduino#13 from bcmi-labs/refactor-spi
Refactor SPI module a bit (configuration code especially).
2 parents fe8b469 + 6b386a5 commit d29cb4e

File tree

2 files changed

+170
-95
lines changed

2 files changed

+170
-95
lines changed

libraries/SPI/SPI.cpp

+142-88
Original file line numberDiff line numberDiff line change
@@ -11,30 +11,51 @@
1111
* published by the Free Software Foundation.
1212
*/
1313

14+
/**************************************************************************************
15+
* INCLUDE
16+
**************************************************************************************/
17+
1418
#include "SPI.h"
1519

20+
/**************************************************************************************
21+
* NAMESPACE
22+
**************************************************************************************/
23+
1624
using namespace arduino;
1725

26+
/**************************************************************************************
27+
* EXTERN GLOBAL CONSTANTS
28+
**************************************************************************************/
29+
1830
extern const spi_extended_cfg_t g_spi0_ext_cfg;
1931
extern const spi_extended_cfg_t g_spi1_ext_cfg;
2032
extern const sci_spi_extended_cfg_t g_spi2_cfg_extend;
2133

34+
/**************************************************************************************
35+
* STATIC MEMBER INITIALISATION
36+
**************************************************************************************/
37+
2238
uint8_t ArduinoSPI::initialized = 0;
2339
uint8_t ArduinoSPI::interruptMode = 0;
2440
uint8_t ArduinoSPI::interruptMask = 0;
2541
uint8_t ArduinoSPI::interruptSave = 0;
2642

43+
/**************************************************************************************
44+
* GLOBAL MEMBER VARIABLES
45+
**************************************************************************************/
46+
2747
static spi_event_t _spi_cb_event[13] = {SPI_EVENT_TRANSFER_ABORTED};
2848

49+
/**************************************************************************************
50+
* CTOR/DTOR
51+
**************************************************************************************/
52+
2953
ArduinoSPI::ArduinoSPI(spi_ctrl_t *g_spi_ctrl
3054
,const spi_cfg_t *g_spi_cfg
3155
,const spi_extended_cfg_t *g_spi_ext_cfg, int ch):
3256
_g_spi_ctrl(g_spi_ctrl)
3357
, _g_spi_cfg(g_spi_cfg)
3458
, _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)
3859
, _channel(ch)
3960
, _is_sci(false)
4061
{
@@ -46,9 +67,6 @@ ArduinoSPI::ArduinoSPI(spi_ctrl_t *g_spi_ctrl
4667
_g_spi_ctrl(g_spi_ctrl)
4768
, _g_spi_cfg(g_spi_cfg)
4869
, _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)
5270
, _channel(ch)
5371
, _is_sci(true)
5472
{
@@ -60,6 +78,10 @@ ArduinoSPI::ArduinoSPI(int ch, bool isSci):
6078
{
6179
}
6280

81+
/**************************************************************************************
82+
* PUBLIC MEMBER FUNCTIONS
83+
**************************************************************************************/
84+
6385
void ArduinoSPI::begin()
6486
{
6587
bool isSPIObject = false;
@@ -127,7 +149,7 @@ void ArduinoSPI::begin()
127149
initialized = true;
128150
}
129151

130-
beginTransaction(DEFAULT_SPI_SETTINGS);
152+
config(DEFAULT_SPI_SETTINGS);
131153
}
132154

133155
void ArduinoSPI::end() {
@@ -233,113 +255,137 @@ void ArduinoSPI::transfer(void *buf, size_t count) {
233255
}
234256
}
235257

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-
}
258+
void ArduinoSPI::beginTransaction(arduino::SPISettings settings)
259+
{
260+
config(settings);
261+
}
262262

263-
// Clock settings
264-
if (_is_sci) {
263+
void ArduinoSPI::endTransaction(void) {
265264

266-
if (initialized) {
267-
R_SCI_SPI_Close(_g_spi_ctrl);
268-
}
265+
}
269266

270-
sci_spi_div_setting_t clk_div = _g_sci_spi_ext_cfg->clk_div;
271-
R_SCI_SPI_CalculateBitrate(settings.getClockFreq(), &clk_div, false);
267+
void ArduinoSPI::attachInterrupt() {
272268

273-
R_SCI_SPI_Open(_g_spi_ctrl, _g_spi_cfg);
269+
}
274270

275-
sci_spi_instance_ctrl_t * p_ctrl = (sci_spi_instance_ctrl_t *)_g_spi_ctrl;
276-
uint32_t spmr = p_ctrl->p_reg->SPMR;
277-
uint32_t scmr = p_ctrl->p_reg->SCMR;
278-
uint32_t smr = R_SCI0_SMR_CM_Msk;
271+
void ArduinoSPI::detachInterrupt() {
279272

280-
/* Configure CPHA setting. */
281-
spmr |= (uint32_t) _clk_phase << 7;
273+
}
282274

283-
/* Configure CPOL setting. */
284-
spmr |= (uint32_t) _clk_polarity << 6;
275+
/**************************************************************************************
276+
* PRIVATE MEMBER FUNCTIONS
277+
**************************************************************************************/
285278

286-
/* Configure Bit Order (MSB,LSB) */
287-
scmr |= (uint32_t) _bit_order << 3;
288-
289-
/* Select the baud rate generator clock divider. */
290-
smr |= (uint32_t) clk_div.cks;
279+
void ArduinoSPI::config(arduino::SPISettings const & settings)
280+
{
281+
if (_is_sci)
282+
configSpiSci(settings);
283+
else
284+
configSpi(settings);
285+
}
291286

292-
// Update settings
293-
p_ctrl->p_reg->SMR = (uint8_t) smr;
294-
p_ctrl->p_reg->BRR = (uint8_t) clk_div.brr;
295-
p_ctrl->p_reg->SPMR = spmr;
296-
p_ctrl->p_reg->SCMR = scmr;
287+
void ArduinoSPI::configSpi(arduino::SPISettings const & settings)
288+
{
289+
auto [clk_phase, clk_polarity, bit_order] = toFspSpiConfig(settings);
297290

298-
} else {
291+
if (initialized)
292+
R_SPI_Close(_g_spi_ctrl);
299293

300-
if (initialized) {
301-
R_SPI_Close(_g_spi_ctrl);
302-
}
294+
rspck_div_setting_t spck_div = _g_spi_ext_cfg->spck_div;
295+
R_SPI_CalculateBitrate(settings.getClockFreq(), &spck_div);
303296

304-
rspck_div_setting_t spck_div = _g_spi_ext_cfg->spck_div;
305-
R_SPI_CalculateBitrate(settings.getClockFreq(), &spck_div);
297+
R_SPI_Open(_g_spi_ctrl, _g_spi_cfg);
306298

307-
R_SPI_Open(_g_spi_ctrl, _g_spi_cfg);
299+
spi_instance_ctrl_t * p_ctrl = (spi_instance_ctrl_t *)_g_spi_ctrl;
300+
uint32_t spcmd0 = p_ctrl->p_regs->SPCMD[0];
301+
uint32_t spbr = p_ctrl->p_regs->SPBR;
308302

309-
spi_instance_ctrl_t * p_ctrl = (spi_instance_ctrl_t *)_g_spi_ctrl;
310-
uint32_t spcmd0 = p_ctrl->p_regs->SPCMD[0];
311-
uint32_t spbr = p_ctrl->p_regs->SPBR;
303+
/* Configure CPHA setting. */
304+
spcmd0 |= (uint32_t) clk_phase;
312305

313-
/* Configure CPHA setting. */
314-
spcmd0 |= (uint32_t) _clk_phase;
306+
/* Configure CPOL setting. */
307+
spcmd0 |= (uint32_t) clk_polarity << 1;
315308

316-
/* Configure CPOL setting. */
317-
spcmd0 |= (uint32_t) _clk_polarity << 1;
309+
/* Configure Bit Order (MSB,LSB) */
310+
spcmd0 |= (uint32_t) bit_order << 12;
318311

319-
/* Configure Bit Order (MSB,LSB) */
320-
spcmd0 |= (uint32_t) _bit_order << 12;
312+
/* Configure the Bit Rate Division Setting */
313+
spcmd0 &= !(((uint32_t)0xFF) << 2);
314+
spcmd0 |= (uint32_t) spck_div.brdv << 2;
321315

322-
/* Configure the Bit Rate Division Setting */
323-
spcmd0 &= !(((uint32_t)0xFF) << 2);
324-
spcmd0 |= (uint32_t) spck_div.brdv << 2;
316+
/* Update settings. */
317+
p_ctrl->p_regs->SPCMD[0] = (uint16_t) spcmd0;
318+
p_ctrl->p_regs->SPBR = (uint8_t) spck_div.spbr;
319+
}
325320

326-
// Update settings
327-
p_ctrl->p_regs->SPCMD[0] = (uint16_t) spcmd0;
328-
p_ctrl->p_regs->SPBR = (uint8_t) spck_div.spbr;
321+
void ArduinoSPI::configSpiSci(arduino::SPISettings const & settings)
322+
{
323+
auto [clk_phase, clk_polarity, bit_order] = toFspSpiConfig(settings);
329324

330-
}
331-
}
325+
if (initialized)
326+
R_SCI_SPI_Close(_g_spi_ctrl);
332327

333-
void ArduinoSPI::endTransaction(void) {
328+
sci_spi_div_setting_t clk_div = _g_sci_spi_ext_cfg->clk_div;
329+
R_SCI_SPI_CalculateBitrate(settings.getClockFreq(), &clk_div, false);
334330

335-
}
331+
R_SCI_SPI_Open(_g_spi_ctrl, _g_spi_cfg);
336332

337-
void ArduinoSPI::attachInterrupt() {
333+
sci_spi_instance_ctrl_t * p_ctrl = (sci_spi_instance_ctrl_t *)_g_spi_ctrl;
334+
uint32_t spmr = p_ctrl->p_reg->SPMR;
335+
uint32_t scmr = p_ctrl->p_reg->SCMR;
336+
uint32_t smr = R_SCI0_SMR_CM_Msk;
337+
338+
/* Configure CPHA setting. */
339+
spmr |= (uint32_t) clk_phase << 7;
340+
341+
/* Configure CPOL setting. */
342+
spmr |= (uint32_t) clk_polarity << 6;
343+
344+
/* Configure Bit Order (MSB,LSB) */
345+
scmr |= (uint32_t) bit_order << 3;
346+
347+
/* Select the baud rate generator clock divider. */
348+
smr |= (uint32_t) clk_div.cks;
338349

350+
/* Update settings. */
351+
p_ctrl->p_reg->SMR = (uint8_t) smr;
352+
p_ctrl->p_reg->BRR = (uint8_t) clk_div.brr;
353+
p_ctrl->p_reg->SPMR = spmr;
354+
p_ctrl->p_reg->SCMR = scmr;
339355
}
340356

341-
void ArduinoSPI::detachInterrupt() {
357+
std::tuple<spi_clk_phase_t, spi_clk_polarity_t, spi_bit_order_t> ArduinoSPI::toFspSpiConfig(arduino::SPISettings const & settings)
358+
{
359+
spi_clk_phase_t clk_phase = SPI_CLK_PHASE_EDGE_ODD;
360+
spi_clk_polarity_t clk_polarity = SPI_CLK_POLARITY_LOW;
361+
spi_bit_order_t bit_order = SPI_BIT_ORDER_MSB_FIRST;
342362

363+
switch(settings.getDataMode())
364+
{
365+
case arduino::SPI_MODE0:
366+
clk_polarity = SPI_CLK_POLARITY_LOW;
367+
clk_phase = SPI_CLK_PHASE_EDGE_ODD;
368+
break;
369+
case arduino::SPI_MODE1:
370+
clk_polarity = SPI_CLK_POLARITY_LOW;
371+
clk_phase = SPI_CLK_PHASE_EDGE_EVEN;
372+
break;
373+
case arduino::SPI_MODE2:
374+
clk_polarity = SPI_CLK_POLARITY_HIGH;
375+
clk_phase = SPI_CLK_PHASE_EDGE_ODD;
376+
break;
377+
case arduino::SPI_MODE3:
378+
clk_polarity = SPI_CLK_POLARITY_HIGH;
379+
clk_phase = SPI_CLK_PHASE_EDGE_EVEN;
380+
break;
381+
}
382+
383+
if(settings.getBitOrder() == LSBFIRST)
384+
bit_order = SPI_BIT_ORDER_LSB_FIRST;
385+
else
386+
bit_order = SPI_BIT_ORDER_MSB_FIRST;
387+
388+
return std::make_tuple(clk_phase, clk_polarity, bit_order);
343389
}
344390

345391
void ArduinoSPI::enableSciSpiIrqs() {
@@ -423,6 +469,10 @@ void ArduinoSPI::enableSciSpiIrqs() {
423469

424470
}
425471

472+
/**************************************************************************************
473+
* CALLBACKS FOR FSP FRAMEWORK
474+
**************************************************************************************/
475+
426476
void spi_callback(spi_callback_args_t *p_args) {
427477
if (SPI_EVENT_TRANSFER_COMPLETE == p_args->event) {
428478
_spi_cb_event[p_args->channel] = SPI_EVENT_TRANSFER_COMPLETE;
@@ -444,10 +494,14 @@ void sci_spi_callback(spi_callback_args_t *p_args) {
444494
}
445495
}
446496

497+
/**************************************************************************************
498+
* OBJECT INSTANTIATION
499+
**************************************************************************************/
500+
447501
#if SPI_HOWMANY > 0
448502
ArduinoSPI SPI(SPI_CHANNEL, (bool)IS_SPI_SCI);
449503
#endif
450504

451505
#if SPI_HOWMANY > 1
452506
ArduinoSPI SPI1(SPI1_CHANNEL, (bool)IS_SPI1_SCI);
453-
#endif
507+
#endif

0 commit comments

Comments
 (0)