mirror of https://github.com/ARMmbed/mbed-os.git
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
parent
cbfb234f07
commit
c1870afa86
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue