diff --git a/targets/TARGET_NORDIC/TARGET_NRF5_SDK13/gpio_api.c b/targets/TARGET_NORDIC/TARGET_NRF5_SDK13/gpio_api.c index bec5e26876..c7ae53a759 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5_SDK13/gpio_api.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5_SDK13/gpio_api.c @@ -20,11 +20,13 @@ #include "nrf_drv_gpiote.h" #if defined(TARGET_MCU_NRF51822) - #define GPIO_PIN_COUNT 48 -#elif defined(TARGET_MCU_NRF51822) #define GPIO_PIN_COUNT 31 -#else +#elif defined(TARGET_MCU_NRF52832) #define GPIO_PIN_COUNT 32 +#elif defined(TARGET_MCU_NRF52840) + #define GPIO_PIN_COUNT 48 +#else + #error not recognized gpio count for mcu #endif typedef struct { @@ -38,7 +40,7 @@ typedef struct { } gpio_cfg_t; #if GPIO_PIN_COUNT > 32 - typedef uint32_t gpio_mask_t; + typedef uint64_t gpio_mask_t; #else typedef uint32_t gpio_mask_t; #endif diff --git a/targets/TARGET_NORDIC/TARGET_NRF5_SDK13/objects.h b/targets/TARGET_NORDIC/TARGET_NRF5_SDK13/objects.h index 033cc85ba0..4ae7530509 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5_SDK13/objects.h +++ b/targets/TARGET_NORDIC/TARGET_NRF5_SDK13/objects.h @@ -8,7 +8,7 @@ * 1. Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * - * 2. Redistributions in// binary form, except as embedded into a Nordic Semiconductor ASA + * 2. Redistributions in binary form, except as embedded into a Nordic Semiconductor ASA * integrated circuit in a product or a software update for such product, must reproduce * the above copyright notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the distribution. diff --git a/targets/TARGET_NORDIC/TARGET_NRF5_SDK13/sdk/drivers_nrf/spi_master/nrf_drv_spi.c b/targets/TARGET_NORDIC/TARGET_NRF5_SDK13/sdk/drivers_nrf/spi_master/nrf_drv_spi.c index ac6433b8e6..848255ac68 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5_SDK13/sdk/drivers_nrf/spi_master/nrf_drv_spi.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5_SDK13/sdk/drivers_nrf/spi_master/nrf_drv_spi.c @@ -129,6 +129,7 @@ typedef struct bool tx_done : 1; bool rx_done : 1; + bool abort : 1; } spi_control_block_t; static spi_control_block_t m_cb[ENABLED_SPI_COUNT]; @@ -401,6 +402,19 @@ static bool transfer_byte(NRF_SPI_Type * p_spi, spi_control_block_t * p_cb) // see how the transfer is started in the 'nrf_drv_spi_transfer' // function. uint16_t bytes_used = p_cb->bytes_transferred + 1; + + if (p_cb->abort) + { + if (bytes_used < p_cb->evt.data.done.tx_length) + { + p_cb->evt.data.done.tx_length = bytes_used; + } + if (bytes_used < p_cb->evt.data.done.rx_length) + { + p_cb->evt.data.done.rx_length = bytes_used; + } + } + if (bytes_used < p_cb->evt.data.done.tx_length) { nrf_spi_txd_set(p_spi, p_cb->evt.data.done.p_tx_buffer[bytes_used]); @@ -577,6 +591,7 @@ ret_code_t nrf_drv_spi_xfer(nrf_drv_spi_t const * const p_instance, p_cb->evt.data.done = *p_xfer_desc; p_cb->tx_done = false; p_cb->rx_done = false; + p_cb->abort = false; if (p_cb->ss_pin != NRF_DRV_SPI_PIN_NOT_USED) { diff --git a/targets/TARGET_NORDIC/TARGET_NRF5_SDK13/sdk/drivers_nrf/twi_master/nrf_drv_twi.c b/targets/TARGET_NORDIC/TARGET_NRF5_SDK13/sdk/drivers_nrf/twi_master/nrf_drv_twi.c index 2b203748ae..38d084595b 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5_SDK13/sdk/drivers_nrf/twi_master/nrf_drv_twi.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5_SDK13/sdk/drivers_nrf/twi_master/nrf_drv_twi.c @@ -57,7 +57,7 @@ #define NRF_LOG_DEBUG_COLOR TWI_CONFIG_DEBUG_COLOR #define EVT_TO_STR(event) (event == NRF_DRV_TWI_EVT_DONE ? "EVT_DONE" : \ (event == NRF_DRV_TWI_EVT_ADDRESS_NACK ? "EVT_ADDRESS_NACK" : \ - (event == NRF_DRV_TWI_EVT_DATA_NACK ? "EVT_DATA_NACK" : "UNKNOWN ERROR")))))) + (event == NRF_DRV_TWI_EVT_DATA_NACK ? "EVT_DATA_NACK" : "UNKNOWN ERROR"))) #define EVT_TO_STR_TWI(event) (event == NRF_TWI_EVENT_STOPPED ? "NRF_TWI_EVENT_STOPPED" : \ (event == NRF_TWI_EVENT_RXDREADY ? "NRF_TWI_EVENT_RXDREADY" : \ (event == NRF_TWI_EVENT_TXDSENT ? "NRF_TWI_EVENT_TXDSENT" : \ @@ -129,6 +129,7 @@ | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos)) #define SDA_PIN_INIT_CONF_CLR SCL_PIN_INIT_CONF_CLR +#define HW_TIMEOUT 10000 // Control block - driver instance local data. typedef struct @@ -530,7 +531,10 @@ static ret_code_t twi_tx_start_transfer(twi_control_block_t * p_cb, bool no_stop) { ret_code_t ret_code = NRF_SUCCESS; - + volatile int32_t hw_timeout; + + hw_timeout = HW_TIMEOUT; + nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_STOPPED); nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_ERROR); nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_TXDSENT); @@ -556,9 +560,11 @@ static ret_code_t twi_tx_start_transfer(twi_control_block_t * p_cb, } else { - while (twi_transfer(p_twi, &p_cb->error, &p_cb->bytes_transferred, (uint8_t *)p_data, length, no_stop)) - {} - + while ((hw_timeout > 0) && twi_transfer(p_twi, &p_cb->error, &p_cb->bytes_transferred, (uint8_t *)p_data, length, no_stop)) + { + hw_timeout--; + } + if (p_cb->error) { uint32_t errorsrc = nrf_twi_errorsrc_get_and_clear(p_twi); @@ -569,6 +575,13 @@ static ret_code_t twi_tx_start_transfer(twi_control_block_t * p_cb, } } + if (hw_timeout <= 0) + { + nrf_twi_disable(p_twi); + nrf_twi_enable(p_twi); + ret_code = NRF_ERROR_INTERNAL; + } + } return ret_code; } @@ -579,6 +592,9 @@ static ret_code_t twi_rx_start_transfer(twi_control_block_t * p_cb, uint8_t length) { ret_code_t ret_code = NRF_SUCCESS; + volatile int32_t hw_timeout; + + hw_timeout = HW_TIMEOUT; nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_STOPPED); nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_ERROR); @@ -610,9 +626,11 @@ static ret_code_t twi_rx_start_transfer(twi_control_block_t * p_cb, } else { - while (twi_transfer(p_twi, &p_cb->error, &p_cb->bytes_transferred, (uint8_t*)p_data, length, false)) - {} - + while ((hw_timeout > 0) && twi_transfer(p_twi, &p_cb->error, &p_cb->bytes_transferred, (uint8_t*)p_data, length, false)) + { + hw_timeout--; + } + if (p_cb->error) { uint32_t errorsrc = nrf_twi_errorsrc_get_and_clear(p_twi); @@ -622,6 +640,13 @@ static ret_code_t twi_rx_start_transfer(twi_control_block_t * p_cb, ret_code = twi_process_error(errorsrc); } } + + if (hw_timeout <= 0) + { + nrf_twi_disable(p_twi); + nrf_twi_enable(p_twi); + ret_code = NRF_ERROR_INTERNAL; + } } return ret_code; }