11
11
* published by the Free Software Foundation.
12
12
*/
13
13
14
+ /* *************************************************************************************
15
+ * INCLUDE
16
+ **************************************************************************************/
17
+
14
18
#include " SPI.h"
15
19
20
+ /* *************************************************************************************
21
+ * NAMESPACE
22
+ **************************************************************************************/
23
+
16
24
using namespace arduino ;
17
25
26
+ /* *************************************************************************************
27
+ * EXTERN GLOBAL CONSTANTS
28
+ **************************************************************************************/
29
+
18
30
extern const spi_extended_cfg_t g_spi0_ext_cfg;
19
31
extern const spi_extended_cfg_t g_spi1_ext_cfg;
20
32
extern const sci_spi_extended_cfg_t g_spi2_cfg_extend;
21
33
34
+ /* *************************************************************************************
35
+ * STATIC MEMBER INITIALISATION
36
+ **************************************************************************************/
37
+
22
38
uint8_t ArduinoSPI::initialized = 0 ;
23
39
uint8_t ArduinoSPI::interruptMode = 0 ;
24
40
uint8_t ArduinoSPI::interruptMask = 0 ;
25
41
uint8_t ArduinoSPI::interruptSave = 0 ;
26
42
43
+ /* *************************************************************************************
44
+ * GLOBAL MEMBER VARIABLES
45
+ **************************************************************************************/
46
+
27
47
static spi_event_t _spi_cb_event[13 ] = {SPI_EVENT_TRANSFER_ABORTED};
28
48
49
+ /* *************************************************************************************
50
+ * CTOR/DTOR
51
+ **************************************************************************************/
52
+
29
53
ArduinoSPI::ArduinoSPI (spi_ctrl_t *g_spi_ctrl
30
54
,const spi_cfg_t *g_spi_cfg
31
55
,const spi_extended_cfg_t *g_spi_ext_cfg, int ch):
32
56
_g_spi_ctrl(g_spi_ctrl)
33
57
, _g_spi_cfg(g_spi_cfg)
34
58
, _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)
38
59
, _channel(ch)
39
60
, _is_sci(false )
40
61
{
@@ -46,9 +67,6 @@ ArduinoSPI::ArduinoSPI(spi_ctrl_t *g_spi_ctrl
46
67
_g_spi_ctrl(g_spi_ctrl)
47
68
, _g_spi_cfg(g_spi_cfg)
48
69
, _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)
52
70
, _channel(ch)
53
71
, _is_sci(true )
54
72
{
@@ -60,6 +78,10 @@ ArduinoSPI::ArduinoSPI(int ch, bool isSci):
60
78
{
61
79
}
62
80
81
+ /* *************************************************************************************
82
+ * PUBLIC MEMBER FUNCTIONS
83
+ **************************************************************************************/
84
+
63
85
void ArduinoSPI::begin ()
64
86
{
65
87
bool isSPIObject = false ;
@@ -127,7 +149,7 @@ void ArduinoSPI::begin()
127
149
initialized = true ;
128
150
}
129
151
130
- beginTransaction (DEFAULT_SPI_SETTINGS);
152
+ config (DEFAULT_SPI_SETTINGS);
131
153
}
132
154
133
155
void ArduinoSPI::end () {
@@ -233,113 +255,137 @@ void ArduinoSPI::transfer(void *buf, size_t count) {
233
255
}
234
256
}
235
257
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
+ }
262
262
263
- // Clock settings
264
- if (_is_sci) {
263
+ void ArduinoSPI::endTransaction (void ) {
265
264
266
- if (initialized) {
267
- R_SCI_SPI_Close (_g_spi_ctrl);
268
- }
265
+ }
269
266
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 () {
272
268
273
- R_SCI_SPI_Open (_g_spi_ctrl, _g_spi_cfg);
269
+ }
274
270
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 () {
279
272
280
- /* Configure CPHA setting. */
281
- spmr |= (uint32_t ) _clk_phase << 7 ;
273
+ }
282
274
283
- /* Configure CPOL setting. */
284
- spmr |= (uint32_t ) _clk_polarity << 6 ;
275
+ /* *************************************************************************************
276
+ * PRIVATE MEMBER FUNCTIONS
277
+ **************************************************************************************/
285
278
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
+ }
291
286
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);
297
290
298
- } else {
291
+ if (initialized)
292
+ R_SPI_Close (_g_spi_ctrl);
299
293
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);
303
296
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);
306
298
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 ;
308
302
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;
312
305
313
- /* Configure CPHA setting. */
314
- spcmd0 |= (uint32_t ) _clk_phase ;
306
+ /* Configure CPOL setting. */
307
+ spcmd0 |= (uint32_t ) clk_polarity << 1 ;
315
308
316
- /* Configure CPOL setting. */
317
- spcmd0 |= (uint32_t ) _clk_polarity << 1 ;
309
+ /* Configure Bit Order (MSB,LSB) */
310
+ spcmd0 |= (uint32_t ) bit_order << 12 ;
318
311
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 ;
321
315
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
+ }
325
320
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) ;
329
324
330
- }
331
- }
325
+ if (initialized)
326
+ R_SCI_SPI_Close (_g_spi_ctrl);
332
327
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 );
334
330
335
- }
331
+ R_SCI_SPI_Open (_g_spi_ctrl, _g_spi_cfg);
336
332
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 ;
338
349
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;
339
355
}
340
356
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;
342
362
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);
343
389
}
344
390
345
391
void ArduinoSPI::enableSciSpiIrqs () {
@@ -423,6 +469,10 @@ void ArduinoSPI::enableSciSpiIrqs() {
423
469
424
470
}
425
471
472
+ /* *************************************************************************************
473
+ * CALLBACKS FOR FSP FRAMEWORK
474
+ **************************************************************************************/
475
+
426
476
void spi_callback (spi_callback_args_t *p_args) {
427
477
if (SPI_EVENT_TRANSFER_COMPLETE == p_args->event ) {
428
478
_spi_cb_event[p_args->channel ] = SPI_EVENT_TRANSFER_COMPLETE;
@@ -444,10 +494,14 @@ void sci_spi_callback(spi_callback_args_t *p_args) {
444
494
}
445
495
}
446
496
497
+ /* *************************************************************************************
498
+ * OBJECT INSTANTIATION
499
+ **************************************************************************************/
500
+
447
501
#if SPI_HOWMANY > 0
448
502
ArduinoSPI SPI (SPI_CHANNEL, (bool )IS_SPI_SCI);
449
503
#endif
450
504
451
505
#if SPI_HOWMANY > 1
452
506
ArduinoSPI SPI1 (SPI1_CHANNEL, (bool )IS_SPI1_SCI);
453
- #endif
507
+ #endif
0 commit comments