Bugfix: #4357 simultaneous using of I2C and SPI.

Use serial-box of Nordic nRF5 SDK to share resource between
SPI and I2C.
SPI is allocated from highest hw instance number resource in order
to allocate as many I2C instances as possible.
pull/4634/head
Andrzej Puzdrowski 2017-06-26 15:32:18 +02:00
parent cbfb234f07
commit c1870afa86
2 changed files with 13 additions and 6 deletions

View File

@ -290,7 +290,9 @@ static void twi_clear_bus(twi_info_t *twi_info)
void i2c_init(i2c_t *obj, PinName sda, PinName scl)
{
ret_code_t ret;
int i;
for (i = 0; i < TWI_COUNT; ++i) {
if (m_twi_info[i].initialized &&
m_twi_info[i].pselsda == (uint32_t)sda &&
@ -304,6 +306,13 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl)
for (i = 0; i < TWI_COUNT; ++i) {
if (!m_twi_info[i].initialized) {
ret = nrf_drv_common_per_res_acquire(m_twi_instances[i],
m_twi_irq_handlers[i]);
if (ret != NRF_SUCCESS) {
continue; /* the hw resource is busy - test another one */
}
TWI_IDX(obj) = i;
twi_info_t *twi_info = TWI_INFO(obj);
@ -324,8 +333,6 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl)
i2c_reset(obj);
#if DEVICE_I2C_ASYNCH
nrf_drv_common_per_res_acquire(m_twi_instances[i],
m_twi_irq_handlers[i]);
NVIC_SetVector(twi_handlers[i].IRQn, twi_handlers[i].vector);
nrf_drv_common_irq_enable(twi_handlers[i].IRQn, TWI_IRQ_PRIORITY);
#endif

View File

@ -277,9 +277,11 @@ void spi_init(spi_t *obj,
}
}
for (i = 0; i < SPI_COUNT; ++i) {
for (i = SPI_COUNT - 1; i >= 0; i--) {
spi_info_t *p_spi_info = &m_spi_info[i];
if (!p_spi_info->initialized) {
p_spi_info->sck_pin = (uint8_t)sclk;
p_spi_info->mosi_pin = (mosi != NC) ?
(uint8_t)mosi : NRF_DRV_SPI_PIN_NOT_USED;
@ -290,8 +292,6 @@ void spi_init(spi_t *obj,
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'.
@ -309,7 +309,7 @@ void spi_init(spi_t *obj,
p_spi_info->handler = 0;
#endif
SPI_IDX(obj) = i;
NVIC_SetVector(spi_handler_desc[i].IRQn, spi_handler_desc[i].vector);
return;
}
}