Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: Hobbyking_Cheetah_Compact Hobbyking_Cheetah_Compact_DRV8323_14bit Hobbyking_Cheetah_Compact_DRV8323_V51_201907 HKC_MiniCheetah ... more
Fork of mbed-dev by
Diff: targets/TARGET_NORDIC/TARGET_NRF5/spi_api.c
- Revision:
- 160:d5399cc887bb
- Parent:
- 150:02e0a0aed4ec
- Child:
- 165:e614a9f1c9e2
diff -r 612c381a210f -r d5399cc887bb targets/TARGET_NORDIC/TARGET_NRF5/spi_api.c
--- a/targets/TARGET_NORDIC/TARGET_NRF5/spi_api.c Tue Feb 28 17:13:35 2017 +0000
+++ b/targets/TARGET_NORDIC/TARGET_NRF5/spi_api.c Tue Mar 14 16:40:56 2017 +0000
@@ -90,22 +90,22 @@
void SPI1_TWI1_IRQHandler(void);
void SPIM2_SPIS2_SPI2_IRQHandler(void);
-static const peripheral_handler_desc_t spi_hanlder_desc[SPI_COUNT] = {
+static const peripheral_handler_desc_t spi_handler_desc[SPI_COUNT] = {
#if SPI0_ENABLED
{
- SPIS0_IRQ,
+ SPI0_IRQ,
(uint32_t) SPI0_TWI0_IRQHandler
},
#endif
#if SPI1_ENABLED
{
- SPIS1_IRQ,
+ SPI1_IRQ,
(uint32_t) SPI1_TWI1_IRQHandler
},
#endif
#if SPI2_ENABLED
{
- SPIS2_IRQ,
+ SPI2_IRQ,
(uint32_t) SPIM2_SPIS2_SPI2_IRQHandler
},
#endif
@@ -254,12 +254,29 @@
PinName mosi, PinName miso, PinName sclk, PinName ssel)
{
int i;
+
+ // This block is only a workaround that allows to create SPI object several
+ // times, what would be otherwise impossible in the current implementation
+ // of mbed driver that does not call spi_free() from SPI destructor.
+ // Once this mbed's imperfection is corrected, this block should be removed.
+ for (i = 0; i < SPI_COUNT; ++i) {
+ spi_info_t *p_spi_info = &m_spi_info[i];
+ if (p_spi_info->initialized &&
+ p_spi_info->mosi_pin == (uint8_t)mosi &&
+ p_spi_info->miso_pin == (uint8_t)miso &&
+ p_spi_info->sck_pin == (uint8_t)sclk &&
+ p_spi_info->ss_pin == (uint8_t)ssel) {
+ // Reuse the already allocated SPI instance (instead of allocating
+ // a new one), if it appears to be initialized with exactly the same
+ // pin assignments.
+ SPI_IDX(obj) = i;
+ return;
+ }
+ }
+
for (i = 0; i < SPI_COUNT; ++i) {
spi_info_t *p_spi_info = &m_spi_info[i];
if (!p_spi_info->initialized) {
-
- NVIC_SetVector(spi_hanlder_desc[i].IRQn, spi_hanlder_desc[i].vector);
-
p_spi_info->sck_pin = (uint8_t)sclk;
p_spi_info->mosi_pin = (mosi != NC) ?
(uint8_t)mosi : NRF_DRV_SPI_PIN_NOT_USED;
@@ -270,6 +287,8 @@
p_spi_info->spi_mode = (uint8_t)NRF_DRV_SPI_MODE_0;
p_spi_info->frequency = NRF_DRV_SPI_FREQ_1M;
+ NVIC_SetVector(spi_handler_desc[i].IRQn, spi_handler_desc[i].vector);
+
// By default each SPI instance is initialized to work as a master.
// Should the slave mode be used, the instance will be reconfigured
// appropriately in 'spi_format'.
