@@ -90,22 +90,22 @@ void SPI0_TWI0_IRQHandler(void);
90
90
void SPI1_TWI1_IRQHandler (void );
91
91
void SPIM2_SPIS2_SPI2_IRQHandler (void );
92
92
93
- static const peripheral_handler_desc_t spi_hanlder_desc [SPI_COUNT ] = {
93
+ static const peripheral_handler_desc_t spi_handler_desc [SPI_COUNT ] = {
94
94
#if SPI0_ENABLED
95
95
{
96
- SPIS0_IRQ ,
96
+ SPI0_IRQ ,
97
97
(uint32_t ) SPI0_TWI0_IRQHandler
98
98
},
99
99
#endif
100
100
#if SPI1_ENABLED
101
101
{
102
- SPIS1_IRQ ,
102
+ SPI1_IRQ ,
103
103
(uint32_t ) SPI1_TWI1_IRQHandler
104
104
},
105
105
#endif
106
106
#if SPI2_ENABLED
107
107
{
108
- SPIS2_IRQ ,
108
+ SPI2_IRQ ,
109
109
(uint32_t ) SPIM2_SPIS2_SPI2_IRQHandler
110
110
},
111
111
#endif
@@ -254,12 +254,24 @@ void spi_init(spi_t *obj,
254
254
PinName mosi , PinName miso , PinName sclk , PinName ssel )
255
255
{
256
256
int i ;
257
+ for (i = 0 ; i < SPI_COUNT ; ++ i ) {
258
+ spi_info_t * p_spi_info = & m_spi_info [i ];
259
+ if (p_spi_info -> initialized &&
260
+ p_spi_info -> mosi_pin == (uint8_t )mosi &&
261
+ p_spi_info -> miso_pin == (uint8_t )miso &&
262
+ p_spi_info -> sck_pin == (uint8_t )sclk &&
263
+ p_spi_info -> ss_pin == (uint8_t )ssel ) {
264
+ // Reuse the already allocated SPI instance (instead of allocating
265
+ // a new one), if it appears to be initialized with exactly the same
266
+ // pin assignments.
267
+ SPI_IDX (obj ) = i ;
268
+ return ;
269
+ }
270
+ }
271
+
257
272
for (i = 0 ; i < SPI_COUNT ; ++ i ) {
258
273
spi_info_t * p_spi_info = & m_spi_info [i ];
259
274
if (!p_spi_info -> initialized ) {
260
-
261
- NVIC_SetVector (spi_hanlder_desc [i ].IRQn , spi_hanlder_desc [i ].vector );
262
-
263
275
p_spi_info -> sck_pin = (uint8_t )sclk ;
264
276
p_spi_info -> mosi_pin = (mosi != NC ) ?
265
277
(uint8_t )mosi : NRF_DRV_SPI_PIN_NOT_USED ;
@@ -270,6 +282,8 @@ void spi_init(spi_t *obj,
270
282
p_spi_info -> spi_mode = (uint8_t )NRF_DRV_SPI_MODE_0 ;
271
283
p_spi_info -> frequency = NRF_DRV_SPI_FREQ_1M ;
272
284
285
+ NVIC_SetVector (spi_handler_desc [i ].IRQn , spi_handler_desc [i ].vector );
286
+
273
287
// By default each SPI instance is initialized to work as a master.
274
288
// Should the slave mode be used, the instance will be reconfigured
275
289
// appropriately in 'spi_format'.
0 commit comments