1111 * published by the Free Software Foundation.
1212 */
1313
14+ /* *************************************************************************************
15+ * INCLUDE
16+ **************************************************************************************/
17+
1418#include " SPI.h"
1519
20+ /* *************************************************************************************
21+ * NAMESPACE
22+ **************************************************************************************/
23+
1624using namespace arduino ;
1725
26+ /* *************************************************************************************
27+ * EXTERN GLOBAL CONSTANTS
28+ **************************************************************************************/
29+
1830extern const spi_extended_cfg_t g_spi0_ext_cfg;
1931extern const spi_extended_cfg_t g_spi1_ext_cfg;
2032extern const sci_spi_extended_cfg_t g_spi2_cfg_extend;
2133
34+ /* *************************************************************************************
35+ * STATIC MEMBER INITIALISATION
36+ **************************************************************************************/
37+
2238uint8_t ArduinoSPI::initialized = 0 ;
2339uint8_t ArduinoSPI::interruptMode = 0 ;
2440uint8_t ArduinoSPI::interruptMask = 0 ;
2541uint8_t ArduinoSPI::interruptSave = 0 ;
2642
43+ /* *************************************************************************************
44+ * GLOBAL MEMBER VARIABLES
45+ **************************************************************************************/
46+
2747static spi_event_t _spi_cb_event[13 ] = {SPI_EVENT_TRANSFER_ABORTED};
2848
49+ /* *************************************************************************************
50+ * CTOR/DTOR
51+ **************************************************************************************/
52+
2953ArduinoSPI::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+
6385void 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
133155void 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
345391void ArduinoSPI::enableSciSpiIrqs () {
@@ -423,6 +469,10 @@ void ArduinoSPI::enableSciSpiIrqs() {
423469
424470}
425471
472+ /* *************************************************************************************
473+ * CALLBACKS FOR FSP FRAMEWORK
474+ **************************************************************************************/
475+
426476void 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
448502ArduinoSPI SPI (SPI_CHANNEL, (bool )IS_SPI_SCI);
449503#endif
450504
451505#if SPI_HOWMANY > 1
452506ArduinoSPI SPI1 (SPI1_CHANNEL, (bool )IS_SPI1_SCI);
453- #endif
507+ #endif
0 commit comments