TARGET_NRF: corrected spi_init() to properly handle re-initialization on the same pins + minor editorial corrections.

pull/3930/head
Głąbek, Andrzej 2017-02-27 13:35:58 +01:00 committed by Anna Bridge
parent 74695e74cf
commit 2129b29bed
1 changed files with 21 additions and 7 deletions

View File

@ -90,22 +90,22 @@ void SPI0_TWI0_IRQHandler(void);
void SPI1_TWI1_IRQHandler(void); void SPI1_TWI1_IRQHandler(void);
void SPIM2_SPIS2_SPI2_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 #if SPI0_ENABLED
{ {
SPIS0_IRQ, SPI0_IRQ,
(uint32_t) SPI0_TWI0_IRQHandler (uint32_t) SPI0_TWI0_IRQHandler
}, },
#endif #endif
#if SPI1_ENABLED #if SPI1_ENABLED
{ {
SPIS1_IRQ, SPI1_IRQ,
(uint32_t) SPI1_TWI1_IRQHandler (uint32_t) SPI1_TWI1_IRQHandler
}, },
#endif #endif
#if SPI2_ENABLED #if SPI2_ENABLED
{ {
SPIS2_IRQ, SPI2_IRQ,
(uint32_t) SPIM2_SPIS2_SPI2_IRQHandler (uint32_t) SPIM2_SPIS2_SPI2_IRQHandler
}, },
#endif #endif
@ -254,12 +254,24 @@ void spi_init(spi_t *obj,
PinName mosi, PinName miso, PinName sclk, PinName ssel) PinName mosi, PinName miso, PinName sclk, PinName ssel)
{ {
int i; int i;
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) { for (i = 0; i < SPI_COUNT; ++i) {
spi_info_t *p_spi_info = &m_spi_info[i]; spi_info_t *p_spi_info = &m_spi_info[i];
if (!p_spi_info->initialized) { 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->sck_pin = (uint8_t)sclk;
p_spi_info->mosi_pin = (mosi != NC) ? p_spi_info->mosi_pin = (mosi != NC) ?
(uint8_t)mosi : NRF_DRV_SPI_PIN_NOT_USED; (uint8_t)mosi : NRF_DRV_SPI_PIN_NOT_USED;
@ -270,6 +282,8 @@ void spi_init(spi_t *obj,
p_spi_info->spi_mode = (uint8_t)NRF_DRV_SPI_MODE_0; p_spi_info->spi_mode = (uint8_t)NRF_DRV_SPI_MODE_0;
p_spi_info->frequency = NRF_DRV_SPI_FREQ_1M; 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. // By default each SPI instance is initialized to work as a master.
// Should the slave mode be used, the instance will be reconfigured // Should the slave mode be used, the instance will be reconfigured
// appropriately in 'spi_format'. // appropriately in 'spi_format'.