Merge pull request #4634 from nvlsianpu/bugfix/issue_4357_I2C_SPI_simultaneously

Fix the issue #4357: NRF52 doesn't support simultaneous use of I2C and SPI.
pull/4754/head
Martin Kojtal 2017-07-13 16:53:33 +02:00 committed by GitHub
commit c295187750
2 changed files with 15 additions and 8 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'.
@ -305,11 +305,11 @@ void spi_init(spi_t *obj,
p_spi_info->initialized = true;
p_spi_info->master = true;
p_spi_info->flag.busy = false;
#if DEVICE_SPI_ASYNCH
#if DEVICE_SPI_ASYNCH
p_spi_info->handler = 0;
#endif
#endif
SPI_IDX(obj) = i;
NVIC_SetVector(spi_handler_desc[i].IRQn, spi_handler_desc[i].vector);
return;
}
}