http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/a1481cb2/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/timer/nrf_drv_timer.h ---------------------------------------------------------------------- diff --git a/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/timer/nrf_drv_timer.h b/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/timer/nrf_drv_timer.h deleted file mode 100644 index f0ab9b4..0000000 --- a/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/timer/nrf_drv_timer.h +++ /dev/null @@ -1,380 +0,0 @@ -/* Copyright (c) 2015 Nordic Semiconductor. All Rights Reserved. - * - * The information contained herein is property of Nordic Semiconductor ASA. - * Terms and conditions of usage are described in detail in NORDIC - * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT. - * - * Licensees are granted free, non-transferable use of the information. NO - * WARRANTY of ANY KIND is provided. This heading must NOT be removed from - * the file. - * - */ - -/**@file - * @addtogroup nrf_timer Timer HAL and driver - * @ingroup nrf_drivers - * @brief Timer APIs. - * @details The timer HAL provides basic APIs for accessing the registers - * of the timer. The timer driver provides APIs on a higher level. - * - * @defgroup lib_driver_timer Timer driver - * @{ - * @ingroup nrf_timer - * @brief Multi-instance timer driver. - */ - -#ifndef NRF_DRV_TIMER_H__ -#define NRF_DRV_TIMER_H__ - -#include "nordic_common.h" -#include "nrf_drv_config.h" -#include "nrf_timer.h" -#include "sdk_errors.h" -#include "nrf_assert.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @brief Timer driver instance data structure. - */ -typedef struct -{ - NRF_TIMER_Type * p_reg; ///< Pointer to the structure with TIMER peripheral instance registers. - uint8_t instance_id; ///< Driver instance index. - uint8_t cc_channel_count; ///< Number of capture/compare channels. -} nrf_drv_timer_t; - -/** - * @brief Macro for creating a timer driver instance. - */ -#define NRF_DRV_TIMER_INSTANCE(id) \ -{ \ - .p_reg = CONCAT_2(NRF_TIMER, id), \ - .instance_id = CONCAT_3(TIMER, id, _INSTANCE_INDEX), \ - .cc_channel_count = NRF_TIMER_CC_CHANNEL_COUNT(id), \ -} - -/** - * @brief Timer driver instance configuration structure. - */ -typedef struct -{ - nrf_timer_frequency_t frequency; ///< Frequency. - nrf_timer_mode_t mode; ///< Mode of operation. - nrf_timer_bit_width_t bit_width; ///< Bit width. - uint8_t interrupt_priority; ///< Interrupt priority. - void * p_context; ///< Context passed to interrupt handler. -} nrf_drv_timer_config_t; - -#define TIMER_CONFIG_FREQUENCY(id) CONCAT_3(TIMER, id, _CONFIG_FREQUENCY) -#define TIMER_CONFIG_MODE(id) CONCAT_3(TIMER, id, _CONFIG_MODE) -#define TIMER_CONFIG_BIT_WIDTH(id) CONCAT_3(TIMER, id, _CONFIG_BIT_WIDTH) -#define TIMER_CONFIG_IRQ_PRIORITY(id) CONCAT_3(TIMER, id, _CONFIG_IRQ_PRIORITY) - -/** - * @brief Timer driver instance default configuration. - */ -#define NRF_DRV_TIMER_DEFAULT_CONFIG(id) \ -{ \ - .frequency = TIMER_CONFIG_FREQUENCY(id), \ - .mode = (nrf_timer_mode_t)TIMER_CONFIG_MODE(id), \ - .bit_width = (nrf_timer_bit_width_t)TIMER_CONFIG_BIT_WIDTH(id), \ - .interrupt_priority = TIMER_CONFIG_IRQ_PRIORITY(id), \ - .p_context = NULL \ -} - -/** - * @brief Timer driver event handler type. - * - * @param[in] event_type Timer event. - * @param[in] p_context General purpose parameter set during initialization of - * the timer. This parameter can be used to pass - * additional information to the handler function, for - * example, the timer ID. - */ -typedef void (* nrf_timer_event_handler_t)(nrf_timer_event_t event_type, - void * p_context); - -/** - * @brief Function for initializing the timer. - * - * @param[in] p_instance Timer instance. - * @param[in] p_config Initial configuration. - * If NULL, the default configuration is used. - * @param[in] timer_event_handler Event handler provided by the user. - * Must not be NULL. - * - * @retval NRF_SUCCESS If initialization was successful. - * @retval NRF_ERROR_INVALID_STATE If the instance is already initialized. - * @retval NRF_ERROR_INVALID_PARAM If no handler was provided. - */ -ret_code_t nrf_drv_timer_init(nrf_drv_timer_t const * const p_instance, - nrf_drv_timer_config_t const * p_config, - nrf_timer_event_handler_t timer_event_handler); - -/** - * @brief Function for uninitializing the timer. - * - * @param[in] p_instance Timer instance. - */ -void nrf_drv_timer_uninit(nrf_drv_timer_t const * const p_instance); - -/** - * @brief Function for turning on the timer. - * - * @param[in] p_instance Timer instance. - */ -void nrf_drv_timer_enable(nrf_drv_timer_t const * const p_instance); - -/** - * @brief Function for turning off the timer. - * - * Note that the timer will allow to enter the lowest possible SYSTEM_ON state - * only after this function is called. - * - * @param[in] p_instance Timer instance. - */ -void nrf_drv_timer_disable(nrf_drv_timer_t const * const p_instance); - -/** - * @brief Function for pausing the timer. - * - * @param[in] p_instance Timer instance. - */ -void nrf_drv_timer_pause(nrf_drv_timer_t const * const p_instance); - -/** - * @brief Function for resuming the timer. - * - * @param[in] p_instance Timer instance. - */ -void nrf_drv_timer_resume(nrf_drv_timer_t const * const p_instance); - -/** - * @brief Function for clearing the timer. - * - * @param[in] p_instance Timer instance. - */ -void nrf_drv_timer_clear(nrf_drv_timer_t const * const p_instance); - -/** - * @brief Function for incrementing the timer. - * - * @param[in] p_instance Timer instance. - */ -void nrf_drv_timer_increment(nrf_drv_timer_t const * const p_instance); - -/** - * @brief Function for returning the address of a specific timer task. - * - * @param[in] p_instance Timer instance. - * @param[in] timer_task Timer task. - * - * @return Task address. - */ -__STATIC_INLINE uint32_t nrf_drv_timer_task_address_get( - nrf_drv_timer_t const * const p_instance, - nrf_timer_task_t timer_task); - -/** - * @brief Function for returning the address of a specific timer capture task. - * - * @param[in] p_instance Timer instance. - * @param[in] channel Capture channel number. - * - * @return Task address. - */ -__STATIC_INLINE uint32_t nrf_drv_timer_capture_task_address_get( - nrf_drv_timer_t const * const p_instance, - uint32_t channel); - -/** - * @brief Function for returning the address of a specific timer event. - * - * @param[in] p_instance Timer instance. - * @param[in] timer_event Timer event. - * - * @return Event address. - */ -__STATIC_INLINE uint32_t nrf_drv_timer_event_address_get( - nrf_drv_timer_t const * const p_instance, - nrf_timer_event_t timer_event); - -/** - * @brief Function for returning the address of a specific timer compare event. - * - * @param[in] p_instance Timer instance. - * @param[in] channel Compare channel number. - * - * @return Event address. - */ -__STATIC_INLINE uint32_t nrf_drv_timer_compare_event_address_get( - nrf_drv_timer_t const * const p_instance, - uint32_t channel); - -/** - * @brief Function for capturing the timer value. - * - * @param[in] p_instance Timer instance. - * @param[in] cc_channel Capture channel number. - * - * @return Captured value. - */ -uint32_t nrf_drv_timer_capture(nrf_drv_timer_t const * const p_instance, - nrf_timer_cc_channel_t cc_channel); - -/** - * @brief Function for returning the capture value from a specific channel. - * - * Use this function to read channel values when PPI is used for capturing. - * - * @param[in] p_instance Timer instance. - * @param[in] cc_channel Capture channel number. - * - * @return Captured value. - */ -__STATIC_INLINE uint32_t nrf_drv_timer_capture_get( - nrf_drv_timer_t const * const p_instance, - nrf_timer_cc_channel_t cc_channel); - -/** - * @brief Function for setting the timer channel in compare mode. - * - * @param[in] p_instance Timer instance. - * @param[in] cc_channel Compare channel number. - * @param[in] cc_value Compare value. - * @param[in] enable_int Enable or disable the interrupt for the compare channel. - */ -void nrf_drv_timer_compare(nrf_drv_timer_t const * const p_instance, - nrf_timer_cc_channel_t cc_channel, - uint32_t cc_value, - bool enable_int); - -/** - * @brief Function for setting the timer channel in extended compare mode. - * - * @param[in] p_instance Timer instance. - * @param[in] cc_channel Compare channel number. - * @param[in] cc_value Compare value. - * @param[in] timer_short_mask Shortcut between the compare event on the channel - * and the timer task (STOP or CLEAR). - * @param[in] enable_int Enable or disable the interrupt for the compare - * channel. - */ -void nrf_drv_timer_extended_compare(nrf_drv_timer_t const * const p_instance, - nrf_timer_cc_channel_t cc_channel, - uint32_t cc_value, - nrf_timer_short_mask_t timer_short_mask, - bool enable_int); - -/** - * @brief Function for converting time in microseconds to timer ticks. - * - * @param[in] p_instance Timer instance. - * @param[in] time_us Time in microseconds. - * - * @return Number of ticks. - */ -__STATIC_INLINE uint32_t nrf_drv_timer_us_to_ticks( - nrf_drv_timer_t const * const p_instance, - uint32_t time_us); - -/** - * @brief Function for converting time in milliseconds to timer ticks. - * - * @param[in] p_instance Timer instance. - * @param[in] time_ms Time in milliseconds. - * - * @return Number of ticks. - */ -__STATIC_INLINE uint32_t nrf_drv_timer_ms_to_ticks( - nrf_drv_timer_t const * const p_instance, - uint32_t time_ms); - -/** - * @brief Function for enabling timer compare interrupt. - * - * @param[in] p_instance Timer instance. - * @param[in] channel Compare channel. - */ -void nrf_drv_timer_compare_int_enable(nrf_drv_timer_t const * const p_instance, - uint32_t channel); - -/** - * @brief Function for disabling timer compare interrupt. - * - * @param[in] p_instance Timer instance. - * @param[in] channel Compare channel. - */ -void nrf_drv_timer_compare_int_disable(nrf_drv_timer_t const * const p_instance, - uint32_t channel); - - -#ifndef SUPPRESS_INLINE_IMPLEMENTATION - -__STATIC_INLINE uint32_t nrf_drv_timer_task_address_get( - nrf_drv_timer_t const * const p_instance, - nrf_timer_task_t timer_task) -{ - return (uint32_t)nrf_timer_task_address_get(p_instance->p_reg, timer_task); -} - -__STATIC_INLINE uint32_t nrf_drv_timer_capture_task_address_get( - nrf_drv_timer_t const * const p_instance, - uint32_t channel) -{ - ASSERT(channel < p_instance->cc_channel_count); - return (uint32_t)nrf_timer_task_address_get(p_instance->p_reg, - nrf_timer_capture_task_get(channel)); -} - -__STATIC_INLINE uint32_t nrf_drv_timer_event_address_get( - nrf_drv_timer_t const * const p_instance, - nrf_timer_event_t timer_event) -{ - return (uint32_t)nrf_timer_event_address_get(p_instance->p_reg, timer_event); -} - -__STATIC_INLINE uint32_t nrf_drv_timer_compare_event_address_get( - nrf_drv_timer_t const * const p_instance, - uint32_t channel) -{ - ASSERT(channel < p_instance->cc_channel_count); - return (uint32_t)nrf_timer_event_address_get(p_instance->p_reg, - nrf_timer_compare_event_get(channel)); -} - -__STATIC_INLINE uint32_t nrf_drv_timer_capture_get( - nrf_drv_timer_t const * const p_instance, - nrf_timer_cc_channel_t cc_channel) -{ - return nrf_timer_cc_read(p_instance->p_reg, cc_channel); -} - -__STATIC_INLINE uint32_t nrf_drv_timer_us_to_ticks( - nrf_drv_timer_t const * const p_instance, - uint32_t timer_us) -{ - return nrf_timer_us_to_ticks(timer_us, - nrf_timer_frequency_get(p_instance->p_reg)); -} - -__STATIC_INLINE uint32_t nrf_drv_timer_ms_to_ticks( - nrf_drv_timer_t const * const p_instance, - uint32_t timer_ms) -{ - return nrf_timer_ms_to_ticks(timer_ms, - nrf_timer_frequency_get(p_instance->p_reg)); -} - -#endif // SUPPRESS_INLINE_IMPLEMENTATION - -#ifdef __cplusplus -} -#endif - -#endif // NRF_DRV_TIMER_H__ - -/** @} */
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/a1481cb2/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/twi_master/deprecated/config/twi_master_config.h ---------------------------------------------------------------------- diff --git a/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/twi_master/deprecated/config/twi_master_config.h b/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/twi_master/deprecated/config/twi_master_config.h deleted file mode 100644 index 7d2b169..0000000 --- a/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/twi_master/deprecated/config/twi_master_config.h +++ /dev/null @@ -1,26 +0,0 @@ -/* Copyright (c) 2012 Nordic Semiconductor. All Rights Reserved. - * - * The information contained herein is property of Nordic Semiconductor ASA. - * Terms and conditions of usage are described in detail in NORDIC - * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT. - * - * Licensees are granted free, non-transferable use of the information. NO - * WARRANTY of ANY KIND is provided. This heading must NOT be removed from - * the file. - * - */ -#ifndef TWI_MASTER_CONFIG -#define TWI_MASTER_CONFIG - -#ifdef __cplusplus -extern "C" { -#endif - -#define TWI_MASTER_CONFIG_CLOCK_PIN_NUMBER (24U) -#define TWI_MASTER_CONFIG_DATA_PIN_NUMBER (25U) - -#ifdef __cplusplus -} -#endif - -#endif http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/a1481cb2/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/twi_master/deprecated/twi_hw_master.c ---------------------------------------------------------------------- diff --git a/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/twi_master/deprecated/twi_hw_master.c b/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/twi_master/deprecated/twi_hw_master.c deleted file mode 100644 index bf54bb7..0000000 --- a/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/twi_master/deprecated/twi_hw_master.c +++ /dev/null @@ -1,304 +0,0 @@ -/* Copyright (c) 2009 Nordic Semiconductor. All Rights Reserved. - * - * The information contained herein is property of Nordic Semiconductor ASA. - * Terms and conditions of usage are described in detail in NORDIC - * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT. - * - * Licensees are granted free, non-transferable use of the information. NO - * WARRANTY of ANY KIND is provided. This heading must NOT be removed from - * the file. - * - */ - -#include "twi_master.h" -#include "twi_master_config.h" -#include <stdbool.h> -#include <stdint.h> -#include "nrf.h" -#include "nrf_delay.h" -#include "nrf_gpio.h" - -/* Max cycles approximately to wait on RXDREADY and TXDREADY event, - * This is optimized way instead of using timers, this is not power aware. */ -#define MAX_TIMEOUT_LOOPS (20000UL) /**< MAX while loops to wait for RXD/TXD event */ - -static bool twi_master_write(uint8_t * data, uint8_t data_length, bool issue_stop_condition) -{ - uint32_t timeout = MAX_TIMEOUT_LOOPS; /* max loops to wait for EVENTS_TXDSENT event*/ - - if (data_length == 0) - { - /* Return false for requesting data of size 0 */ - return false; - } - - NRF_TWI1->TXD = *data++; - NRF_TWI1->TASKS_STARTTX = 1; - - /** @snippet [TWI HW master write] */ - while (true) - { - while (NRF_TWI1->EVENTS_TXDSENT == 0 && NRF_TWI1->EVENTS_ERROR == 0 && (--timeout)) - { - // Do nothing. - } - - if (timeout == 0 || NRF_TWI1->EVENTS_ERROR != 0) - { - // Recover the peripheral as indicated by PAN 56: "TWI: TWI module lock-up." found at - // Product Anomaly Notification document found at - // https://www.nordicsemi.com/eng/Products/Bluetooth-R-low-energy/nRF51822/#Downloads - NRF_TWI1->EVENTS_ERROR = 0; - NRF_TWI1->ENABLE = TWI_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos; - NRF_TWI1->POWER = 0; - nrf_delay_us(5); - NRF_TWI1->POWER = 1; - NRF_TWI1->ENABLE = TWI_ENABLE_ENABLE_Enabled << TWI_ENABLE_ENABLE_Pos; - - (void)twi_master_init(); - - return false; - } - NRF_TWI1->EVENTS_TXDSENT = 0; - if (--data_length == 0) - { - break; - } - - NRF_TWI1->TXD = *data++; - } - /** @snippet [TWI HW master write] */ - - if (issue_stop_condition) - { - NRF_TWI1->EVENTS_STOPPED = 0; - NRF_TWI1->TASKS_STOP = 1; - /* Wait until stop sequence is sent */ - while(NRF_TWI1->EVENTS_STOPPED == 0) - { - // Do nothing. - } - } - return true; -} - - -/** @brief Function for read by twi_master. - */ -static bool twi_master_read(uint8_t * data, uint8_t data_length, bool issue_stop_condition) -{ - uint32_t timeout = MAX_TIMEOUT_LOOPS; /* max loops to wait for RXDREADY event*/ - - if (data_length == 0) - { - /* Return false for requesting data of size 0 */ - return false; - } - else if (data_length == 1) - { - NRF_PPI->CH[0].TEP = (uint32_t)&NRF_TWI1->TASKS_STOP; - } - else - { - NRF_PPI->CH[0].TEP = (uint32_t)&NRF_TWI1->TASKS_SUSPEND; - } - - NRF_PPI->CHENSET = PPI_CHENSET_CH0_Msk; - NRF_TWI1->EVENTS_RXDREADY = 0; - NRF_TWI1->TASKS_STARTRX = 1; - - /** @snippet [TWI HW master read] */ - while (true) - { - while (NRF_TWI1->EVENTS_RXDREADY == 0 && NRF_TWI1->EVENTS_ERROR == 0 && (--timeout)) - { - // Do nothing. - } - NRF_TWI1->EVENTS_RXDREADY = 0; - - if (timeout == 0 || NRF_TWI1->EVENTS_ERROR != 0) - { - // Recover the peripheral as indicated by PAN 56: "TWI: TWI module lock-up." found at - // Product Anomaly Notification document found at - // https://www.nordicsemi.com/eng/Products/Bluetooth-R-low-energy/nRF51822/#Downloads - NRF_TWI1->EVENTS_ERROR = 0; - NRF_TWI1->ENABLE = TWI_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos; - NRF_TWI1->POWER = 0; - nrf_delay_us(5); - NRF_TWI1->POWER = 1; - NRF_TWI1->ENABLE = TWI_ENABLE_ENABLE_Enabled << TWI_ENABLE_ENABLE_Pos; - - (void)twi_master_init(); - - return false; - } - - *data++ = NRF_TWI1->RXD; - - /* Configure PPI to stop TWI master before we get last BB event */ - if (--data_length == 1) - { - NRF_PPI->CH[0].TEP = (uint32_t)&NRF_TWI1->TASKS_STOP; - } - - if (data_length == 0) - { - break; - } - - // Recover the peripheral as indicated by PAN 56: "TWI: TWI module lock-up." found at - // Product Anomaly Notification document found at - // https://www.nordicsemi.com/eng/Products/Bluetooth-R-low-energy/nRF51822/#Downloads - nrf_delay_us(20); - NRF_TWI1->TASKS_RESUME = 1; - } - /** @snippet [TWI HW master read] */ - - /* Wait until stop sequence is sent */ - while(NRF_TWI1->EVENTS_STOPPED == 0) - { - // Do nothing. - } - NRF_TWI1->EVENTS_STOPPED = 0; - - NRF_PPI->CHENCLR = PPI_CHENCLR_CH0_Msk; - return true; -} - - -/** - * @brief Function for detecting stuck slaves (SDA = 0 and SCL = 1) and tries to clear the bus. - * - * @return - * @retval false Bus is stuck. - * @retval true Bus is clear. - */ -static bool twi_master_clear_bus(void) -{ - uint32_t twi_state; - bool bus_clear; - uint32_t clk_pin_config; - uint32_t data_pin_config; - - // Save and disable TWI hardware so software can take control over the pins. - twi_state = NRF_TWI1->ENABLE; - NRF_TWI1->ENABLE = TWI_ENABLE_ENABLE_Disabled << TWI_ENABLE_ENABLE_Pos; - - clk_pin_config = \ - NRF_GPIO->PIN_CNF[TWI_MASTER_CONFIG_CLOCK_PIN_NUMBER]; - NRF_GPIO->PIN_CNF[TWI_MASTER_CONFIG_CLOCK_PIN_NUMBER] = \ - (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) \ - | (GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) \ - | (GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos) \ - | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) \ - | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos); - - data_pin_config = \ - NRF_GPIO->PIN_CNF[TWI_MASTER_CONFIG_DATA_PIN_NUMBER]; - NRF_GPIO->PIN_CNF[TWI_MASTER_CONFIG_DATA_PIN_NUMBER] = \ - (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) \ - | (GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) \ - | (GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos) \ - | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) \ - | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos); - - TWI_SDA_HIGH(); - TWI_SCL_HIGH(); - TWI_DELAY(); - - if ((TWI_SDA_READ() == 1) && (TWI_SCL_READ() == 1)) - { - bus_clear = true; - } - else - { - uint_fast8_t i; - bus_clear = false; - - // Clock max 18 pulses worst case scenario(9 for master to send the rest of command and 9 - // for slave to respond) to SCL line and wait for SDA come high. - for (i=18; i--;) - { - TWI_SCL_LOW(); - TWI_DELAY(); - TWI_SCL_HIGH(); - TWI_DELAY(); - - if (TWI_SDA_READ() == 1) - { - bus_clear = true; - break; - } - } - } - - NRF_GPIO->PIN_CNF[TWI_MASTER_CONFIG_CLOCK_PIN_NUMBER] = clk_pin_config; - NRF_GPIO->PIN_CNF[TWI_MASTER_CONFIG_DATA_PIN_NUMBER] = data_pin_config; - - NRF_TWI1->ENABLE = twi_state; - - return bus_clear; -} - - -/** @brief Function for initializing the twi_master. - */ -bool twi_master_init(void) -{ - /* To secure correct signal levels on the pins used by the TWI - master when the system is in OFF mode, and when the TWI master is - disabled, these pins must be configured in the GPIO peripheral. - */ - NRF_GPIO->PIN_CNF[TWI_MASTER_CONFIG_CLOCK_PIN_NUMBER] = \ - (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) \ - | (GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) \ - | (GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos) \ - | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) \ - | (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos); - - NRF_GPIO->PIN_CNF[TWI_MASTER_CONFIG_DATA_PIN_NUMBER] = \ - (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) \ - | (GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) \ - | (GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos) \ - | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) \ - | (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos); - - NRF_TWI1->EVENTS_RXDREADY = 0; - NRF_TWI1->EVENTS_TXDSENT = 0; - NRF_TWI1->PSELSCL = TWI_MASTER_CONFIG_CLOCK_PIN_NUMBER; - NRF_TWI1->PSELSDA = TWI_MASTER_CONFIG_DATA_PIN_NUMBER; - NRF_TWI1->FREQUENCY = TWI_FREQUENCY_FREQUENCY_K100 << TWI_FREQUENCY_FREQUENCY_Pos; - NRF_PPI->CH[0].EEP = (uint32_t)&NRF_TWI1->EVENTS_BB; - NRF_PPI->CH[0].TEP = (uint32_t)&NRF_TWI1->TASKS_SUSPEND; - NRF_PPI->CHENCLR = PPI_CHENCLR_CH0_Msk; - NRF_TWI1->ENABLE = TWI_ENABLE_ENABLE_Enabled << TWI_ENABLE_ENABLE_Pos; - - return twi_master_clear_bus(); -} - - -/** @brief Function for transfer by twi_master. - */ -bool twi_master_transfer(uint8_t address, - uint8_t * data, - uint8_t data_length, - bool issue_stop_condition) -{ - bool transfer_succeeded = false; - if (data_length > 0 && twi_master_clear_bus()) - { - NRF_TWI1->ADDRESS = (address >> 1); - - if ((address & TWI_READ_BIT)) - { - transfer_succeeded = twi_master_read(data, data_length, issue_stop_condition); - } - else - { - transfer_succeeded = twi_master_write(data, data_length, issue_stop_condition); - } - } - return transfer_succeeded; -} - -/*lint --flb "Leave library region" */ http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/a1481cb2/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/twi_master/deprecated/twi_master.h ---------------------------------------------------------------------- diff --git a/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/twi_master/deprecated/twi_master.h b/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/twi_master/deprecated/twi_master.h deleted file mode 100644 index 2ac62cc..0000000 --- a/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/twi_master/deprecated/twi_master.h +++ /dev/null @@ -1,109 +0,0 @@ - /* Copyright (c) 2009 Nordic Semiconductor. All Rights Reserved. - * - * The information contained herein is property of Nordic Semiconductor ASA. - * Terms and conditions of usage are described in detail in NORDIC - * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT. - * - * Licensees are granted free, non-transferable use of the information. NO - * WARRANTY of ANY KIND is provided. This heading must NOT be removed from - * the file. - * - */ - -#ifndef TWI_MASTER_H -#define TWI_MASTER_H - -#ifdef __cplusplus -extern "C" { -#endif - -/*lint ++flb "Enter library region" */ - -#include <stdbool.h> -#include <stdint.h> - -/** @file -* @brief Software controlled TWI Master driver. -* -* -* @defgroup lib_driver_twi_master Software controlled TWI Master driver -* @{ -* @ingroup nrf_twi -* @brief Software controlled TWI Master driver (deprecated). -* -* @warning This module is deprecated. -* -* Supported features: -* - Repeated start -* - No multi-master -* - Only 7-bit addressing -* - Supports clock stretching (with optional SMBus style slave timeout) -* - Tries to handle slaves stuck in the middle of transfer -*/ - -#define TWI_READ_BIT (0x01) //!< If this bit is set in the address field, transfer direction is from slave to master. - -#define TWI_ISSUE_STOP ((bool)true) //!< Parameter for @ref twi_master_transfer -#define TWI_DONT_ISSUE_STOP ((bool)false) //!< Parameter for @ref twi_master_transfer - -/* These macros are needed to see if the slave is stuck and we as master send dummy clock cycles to end its wait */ -/*lint -e717 -save "Suppress do {} while (0) for these macros" */ -/*lint ++flb "Enter library region" */ -#define TWI_SCL_HIGH() do { NRF_GPIO->OUTSET = (1UL << TWI_MASTER_CONFIG_CLOCK_PIN_NUMBER); } while(0) /*!< Pulls SCL line high */ -#define TWI_SCL_LOW() do { NRF_GPIO->OUTCLR = (1UL << TWI_MASTER_CONFIG_CLOCK_PIN_NUMBER); } while(0) /*!< Pulls SCL line low */ -#define TWI_SDA_HIGH() do { NRF_GPIO->OUTSET = (1UL << TWI_MASTER_CONFIG_DATA_PIN_NUMBER); } while(0) /*!< Pulls SDA line high */ -#define TWI_SDA_LOW() do { NRF_GPIO->OUTCLR = (1UL << TWI_MASTER_CONFIG_DATA_PIN_NUMBER); } while(0) /*!< Pulls SDA line low */ -#define TWI_SDA_INPUT() do { NRF_GPIO->DIRCLR = (1UL << TWI_MASTER_CONFIG_DATA_PIN_NUMBER); } while(0) /*!< Configures SDA pin as input */ -#define TWI_SDA_OUTPUT() do { NRF_GPIO->DIRSET = (1UL << TWI_MASTER_CONFIG_DATA_PIN_NUMBER); } while(0) /*!< Configures SDA pin as output */ -#define TWI_SCL_OUTPUT() do { NRF_GPIO->DIRSET = (1UL << TWI_MASTER_CONFIG_CLOCK_PIN_NUMBER); } while(0) /*!< Configures SCL pin as output */ -/*lint -restore */ - -#define TWI_SDA_READ() ((NRF_GPIO->IN >> TWI_MASTER_CONFIG_DATA_PIN_NUMBER) & 0x1UL) /*!< Reads current state of SDA */ -#define TWI_SCL_READ() ((NRF_GPIO->IN >> TWI_MASTER_CONFIG_CLOCK_PIN_NUMBER) & 0x1UL) /*!< Reads current state of SCL */ - -#define TWI_DELAY() nrf_delay_us(4) /*!< Time to wait when pin states are changed. For fast-mode the delay can be zero and for standard-mode 4 us delay is sufficient. */ - - -/** - * @brief Function for initializing TWI bus IO pins and checks if the bus is operational. - * - * Both pins are configured as Standard-0, No-drive-1 (open drain). - * - * @return - * @retval true TWI bus is clear for transfers. - * @retval false TWI bus is stuck. - */ -bool twi_master_init(void); - -/** - * @brief Function for transferring data over TWI bus. - * - * If TWI master detects even one NACK from the slave or timeout occurs, STOP condition is issued - * and the function returns false. - * Bit 0 (@ref TWI_READ_BIT) in the address parameter controls transfer direction; - * - If 1, master reads data_length number of bytes from the slave - * - If 0, master writes data_length number of bytes to the slave. - * - * @note Make sure at least data_length number of bytes is allocated in data if TWI_READ_BIT is set. - * @note @ref TWI_ISSUE_STOP - * - * @param address Data transfer direction (LSB) / Slave address (7 MSBs). - * @param data Pointer to data. - * @param data_length Number of bytes to transfer. - * @param issue_stop_condition If @ref TWI_ISSUE_STOP, STOP condition is issued before exiting function. If @ref TWI_DONT_ISSUE_STOP, STOP condition is not issued before exiting function. If transfer failed for any reason, STOP condition will be issued in any case. - * @return - * @retval true Data transfer succeeded without errors. - * @retval false Data transfer failed. - */ -bool twi_master_transfer(uint8_t address, uint8_t *data, uint8_t data_length, bool issue_stop_condition); - -/** - *@} - **/ - -/*lint --flb "Leave library region" */ -#ifdef __cplusplus -} -#endif - -#endif //TWI_MASTER_H http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/a1481cb2/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/twi_master/deprecated/twi_sw_master.c ---------------------------------------------------------------------- diff --git a/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/twi_master/deprecated/twi_sw_master.c b/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/twi_master/deprecated/twi_sw_master.c deleted file mode 100644 index cbd1432..0000000 --- a/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/twi_master/deprecated/twi_sw_master.c +++ /dev/null @@ -1,492 +0,0 @@ -/* Copyright (c) 2009 Nordic Semiconductor. All Rights Reserved. - * - * The information contained herein is property of Nordic Semiconductor ASA. - * Terms and conditions of usage are described in detail in NORDIC - * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT. - * - * Licensees are granted free, non-transferable use of the information. NO - * WARRANTY of ANY KIND is provided. This heading must NOT be removed from - * the file. - * - */ - -#include <stdbool.h> -#include <stdint.h> -#include "twi_master.h" -#include "nrf_delay.h" - -#include "twi_master_config.h" - -/*lint -e415 -e845 -save "Out of bounds access" */ -#define TWI_SDA_STANDARD0_NODRIVE1() do { \ - NRF_GPIO->PIN_CNF[TWI_MASTER_CONFIG_DATA_PIN_NUMBER] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) \ - |(GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) \ - |(GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos) \ - |(GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) \ - |(GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos); \ -} while (0) /*!< Configures SDA pin to Standard-0, No-drive 1 */ - - -#define TWI_SCL_STANDARD0_NODRIVE1() do { \ - NRF_GPIO->PIN_CNF[TWI_MASTER_CONFIG_CLOCK_PIN_NUMBER] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) \ - |(GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) \ - |(GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos) \ - |(GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) \ - |(GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos); \ -} while (0) /*!< Configures SCL pin to Standard-0, No-drive 1 */ - - -/*lint -restore */ - -#ifndef TWI_MASTER_TIMEOUT_COUNTER_LOAD_VALUE -#define TWI_MASTER_TIMEOUT_COUNTER_LOAD_VALUE (0UL) //!< Unit is number of empty loops. Timeout for SMBus devices is 35 ms. Set to zero to disable slave timeout altogether. -#endif - -static bool twi_master_clear_bus(void); -static bool twi_master_issue_startcondition(void); -static bool twi_master_issue_stopcondition(void); -static bool twi_master_clock_byte(uint_fast8_t databyte); -static bool twi_master_clock_byte_in(uint8_t * databyte, bool ack); -static bool twi_master_wait_while_scl_low(void); - -bool twi_master_init(void) -{ - // Configure both pins to output Standard 0, No-drive (open-drain) 1 - TWI_SDA_STANDARD0_NODRIVE1(); /*lint !e416 "Creation of out of bounds pointer" */ - TWI_SCL_STANDARD0_NODRIVE1(); /*lint !e416 "Creation of out of bounds pointer" */ - - // Configure SCL as output - TWI_SCL_HIGH(); - TWI_SCL_OUTPUT(); - - // Configure SDA as output - TWI_SDA_HIGH(); - TWI_SDA_OUTPUT(); - - return twi_master_clear_bus(); -} - -bool twi_master_transfer(uint8_t address, uint8_t * data, uint8_t data_length, bool issue_stop_condition) -{ - bool transfer_succeeded = true; - - transfer_succeeded &= twi_master_issue_startcondition(); - transfer_succeeded &= twi_master_clock_byte(address); - - if (address & TWI_READ_BIT) - { - /* Transfer direction is from Slave to Master */ - while (data_length-- && transfer_succeeded) - { - // To indicate to slave that we've finished transferring last data byte - // we need to NACK the last transfer. - if (data_length == 0) - { - transfer_succeeded &= twi_master_clock_byte_in(data, (bool)false); - } - else - { - transfer_succeeded &= twi_master_clock_byte_in(data, (bool)true); - } - data++; - } - } - else - { - /* Transfer direction is from Master to Slave */ - while (data_length-- && transfer_succeeded) - { - transfer_succeeded &= twi_master_clock_byte(*data); - data++; - } - } - - if (issue_stop_condition || !transfer_succeeded) - { - transfer_succeeded &= twi_master_issue_stopcondition(); - } - - return transfer_succeeded; -} - -/** - * @brief Function for detecting stuck slaves and tries to clear the bus. - * - * @return - * @retval false Bus is stuck. - * @retval true Bus is clear. - */ -static bool twi_master_clear_bus(void) -{ - bool bus_clear; - - TWI_SDA_HIGH(); - TWI_SCL_HIGH(); - TWI_DELAY(); - - - if (TWI_SDA_READ() == 1 && TWI_SCL_READ() == 1) - { - bus_clear = true; - } - else if (TWI_SCL_READ() == 1) - { - bus_clear = false; - // Clock max 18 pulses worst case scenario(9 for master to send the rest of command and 9 for slave to respond) to SCL line and wait for SDA come high - for (uint_fast8_t i = 18; i--;) - { - TWI_SCL_LOW(); - TWI_DELAY(); - TWI_SCL_HIGH(); - TWI_DELAY(); - - if (TWI_SDA_READ() == 1) - { - bus_clear = true; - break; - } - } - } - else - { - bus_clear = false; - } - - return bus_clear; -} - -/** - * @brief Function for issuing TWI START condition to the bus. - * - * START condition is signaled by pulling SDA low while SCL is high. After this function SCL and SDA will be low. - * - * @return - * @retval false Timeout detected - * @retval true Clocking succeeded - */ -static bool twi_master_issue_startcondition(void) -{ -#if 0 - if (TWI_SCL_READ() == 1 && TWI_SDA_READ() == 1) - { - // Pull SDA low - TWI_SDA_LOW(); - } - else if (TWI_SCL_READ() == 1 && TWI_SDA_READ() == 0) - { - // Issue Stop by pulling SDA high - TWI_SDA_HIGH(); - TWI_DELAY(); - - // Then Start by pulling SDA low - TWI_SDA_LOW(); - } - else if (TWI_SCL_READ() == 0 && TWI_SDA_READ() == 0) - { - // First pull SDA high - TWI_SDA_HIGH(); - - // Then SCL high - if (!twi_master_wait_while_scl_low()) - { - return false; - } - - // Then SDA low - TWI_SDA_LOW(); - } - else if (TWI_SCL_READ() == 0 && TWI_SDA_READ() == 1) - { - // SCL high - if (!twi_master_wait_while_scl_low()) - { - return false; - } - - // Then SDA low - TWI_SDA_LOW(); - } - - TWI_DELAY(); - TWI_SCL_LOW(); -#endif - - // Make sure both SDA and SCL are high before pulling SDA low. - TWI_SDA_HIGH(); - TWI_DELAY(); - if (!twi_master_wait_while_scl_low()) - { - return false; - } - - TWI_SDA_LOW(); - TWI_DELAY(); - - // Other module function expect SCL to be low - TWI_SCL_LOW(); - TWI_DELAY(); - - return true; -} - -/** - * @brief Function for issuing TWI STOP condition to the bus. - * - * STOP condition is signaled by pulling SDA high while SCL is high. After this function SDA and SCL will be high. - * - * @return - * @retval false Timeout detected - * @retval true Clocking succeeded - */ -static bool twi_master_issue_stopcondition(void) -{ -#if 0 - if (TWI_SCL_READ() == 1 && TWI_SDA_READ() == 1) - { - // Issue start, then issue stop - - // Pull SDA low to issue START - TWI_SDA_LOW(); - TWI_DELAY(); - - // Pull SDA high while SCL is high to issue STOP - TWI_SDA_HIGH(); - } - else if (TWI_SCL_READ() == 1 && TWI_SDA_READ() == 0) - { - // Pull SDA high while SCL is high to issue STOP - TWI_SDA_HIGH(); - } - else if (TWI_SCL_READ() == 0 && TWI_SDA_READ() == 0) - { - if (!twi_master_wait_while_scl_low()) - { - return false; - } - - // Pull SDA high while SCL is high to issue STOP - TWI_SDA_HIGH(); - } - else if (TWI_SCL_READ() == 0 && TWI_SDA_READ() == 1) - { - TWI_SDA_LOW(); - TWI_DELAY(); - - // SCL high - if (!twi_master_wait_while_scl_low()) - { - return false; - } - - // Pull SDA high while SCL is high to issue STOP - TWI_SDA_HIGH(); - } - - TWI_DELAY(); -#endif - - TWI_SDA_LOW(); - TWI_DELAY(); - if (!twi_master_wait_while_scl_low()) - { - return false; - } - - TWI_SDA_HIGH(); - TWI_DELAY(); - - return true; -} - -/** - * @brief Function for clocking one data byte out and reads slave acknowledgment. - * - * Can handle clock stretching. - * After calling this function SCL is low and SDA low/high depending on the - * value of LSB of the data byte. - * SCL is expected to be output and low when entering this function. - * - * @param databyte Data byte to clock out. - * @return - * @retval true Slave acknowledged byte. - * @retval false Timeout or slave didn't acknowledge byte. - */ -static bool twi_master_clock_byte(uint_fast8_t databyte) -{ - bool transfer_succeeded = true; - - /** @snippet [TWI SW master write] */ - // Make sure SDA is an output - TWI_SDA_OUTPUT(); - - // MSB first - for (uint_fast8_t i = 0x80; i != 0; i >>= 1) - { - TWI_SCL_LOW(); - TWI_DELAY(); - - if (databyte & i) - { - TWI_SDA_HIGH(); - } - else - { - TWI_SDA_LOW(); - } - - if (!twi_master_wait_while_scl_low()) - { - transfer_succeeded = false; // Timeout - break; - } - } - - // Finish last data bit by pulling SCL low - TWI_SCL_LOW(); - TWI_DELAY(); - - /** @snippet [TWI SW master write] */ - - // Configure TWI_SDA pin as input for receiving the ACK bit - TWI_SDA_INPUT(); - - // Give some time for the slave to load the ACK bit on the line - TWI_DELAY(); - - // Pull SCL high and wait a moment for SDA line to settle - // Make sure slave is not stretching the clock - transfer_succeeded &= twi_master_wait_while_scl_low(); - - // Read ACK/NACK. NACK == 1, ACK == 0 - transfer_succeeded &= !(TWI_SDA_READ()); - - // Finish ACK/NACK bit clock cycle and give slave a moment to release control - // of the SDA line - TWI_SCL_LOW(); - TWI_DELAY(); - - // Configure TWI_SDA pin as output as other module functions expect that - TWI_SDA_OUTPUT(); - - return transfer_succeeded; -} - - -/** - * @brief Function for clocking one data byte in and sends ACK/NACK bit. - * - * Can handle clock stretching. - * SCL is expected to be output and low when entering this function. - * After calling this function, SCL is high and SDA low/high depending if ACK/NACK was sent. - * - * @param databyte Data byte to clock out. - * @param ack If true, send ACK. Otherwise send NACK. - * @return - * @retval true Byte read succesfully - * @retval false Timeout detected - */ -static bool twi_master_clock_byte_in(uint8_t *databyte, bool ack) -{ - uint_fast8_t byte_read = 0; - bool transfer_succeeded = true; - - /** @snippet [TWI SW master read] */ - // Make sure SDA is an input - TWI_SDA_INPUT(); - - // SCL state is guaranteed to be high here - - // MSB first - for (uint_fast8_t i = 0x80; i != 0; i >>= 1) - { - if (!twi_master_wait_while_scl_low()) - { - transfer_succeeded = false; - break; - } - - if (TWI_SDA_READ()) - { - byte_read |= i; - } - else - { - // No need to do anything - } - - TWI_SCL_LOW(); - TWI_DELAY(); - } - - // Make sure SDA is an output before we exit the function - TWI_SDA_OUTPUT(); - /** @snippet [TWI SW master read] */ - - *databyte = (uint8_t)byte_read; - - // Send ACK bit - - // SDA high == NACK, SDA low == ACK - if (ack) - { - TWI_SDA_LOW(); - } - else - { - TWI_SDA_HIGH(); - } - - // Let SDA line settle for a moment - TWI_DELAY(); - - // Drive SCL high to start ACK/NACK bit transfer - // Wait until SCL is high, or timeout occurs - if (!twi_master_wait_while_scl_low()) - { - transfer_succeeded = false; // Timeout - } - - // Finish ACK/NACK bit clock cycle and give slave a moment to react - TWI_SCL_LOW(); - TWI_DELAY(); - - return transfer_succeeded; -} - - -/** - * @brief Function for pulling SCL high and waits until it is high or timeout occurs. - * - * SCL is expected to be output before entering this function. - * @note If TWI_MASTER_TIMEOUT_COUNTER_LOAD_VALUE is set to zero, timeout functionality is not compiled in. - * @return - * @retval true SCL is now high. - * @retval false Timeout occurred and SCL is still low. - */ -static bool twi_master_wait_while_scl_low(void) -{ -#if TWI_MASTER_TIMEOUT_COUNTER_LOAD_VALUE != 0 - uint32_t volatile timeout_counter = TWI_MASTER_TIMEOUT_COUNTER_LOAD_VALUE; -#endif - - // Pull SCL high just in case if something left it low - TWI_SCL_HIGH(); - TWI_DELAY(); - - while (TWI_SCL_READ() == 0) - { - // If SCL is low, one of the slaves is busy and we must wait - -#if TWI_MASTER_TIMEOUT_COUNTER_LOAD_VALUE != 0 - if (timeout_counter-- == 0) - { - // If timeout_detected, return false - return false; - } -#endif - } - - return true; -} - -/*lint --flb "Leave library region" */ http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/a1481cb2/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/twi_master/nrf_drv_twi.c ---------------------------------------------------------------------- diff --git a/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/twi_master/nrf_drv_twi.c b/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/twi_master/nrf_drv_twi.c deleted file mode 100644 index 2a9c2e4..0000000 --- a/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/twi_master/nrf_drv_twi.c +++ /dev/null @@ -1,1014 +0,0 @@ -/* Copyright (c) 2015 Nordic Semiconductor. All Rights Reserved. - * - * The information contained herein is property of Nordic Semiconductor ASA. - * Terms and conditions of usage are described in detail in NORDIC - * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT. - * - * Licensees are granted free, non-transferable use of the information. NO - * WARRANTY of ANY KIND is provided. This heading must NOT be removed from - * the file. - * - */ - -#include "nrf_drv_twi.h" -#include "nrf_drv_common.h" -#include "nrf_gpio.h" -#include "nrf_assert.h" -#include "app_util_platform.h" -#include "nrf_delay.h" - -#include <stdio.h> - -#define TWI0_IRQ_HANDLER SPI0_TWI0_IRQHandler -#define TWI1_IRQ_HANDLER SPI1_TWI1_IRQHandler - -#if (defined(TWIM_IN_USE) && defined(TWI_IN_USE)) - // TWIM and TWI combined - #define CODE_FOR_TWIM(code) if (p_instance->use_easy_dma) { code } - #define CODE_FOR_TWI(code) else { code } -#elif (defined(TWIM_IN_USE) && !defined(TWI_IN_USE)) - // TWIM only - #define CODE_FOR_TWIM(code) { code } - #define CODE_FOR_TWI(code) -#elif (!defined(TWIM_IN_USE) && defined(TWI_IN_USE)) - // TWI only - #define CODE_FOR_TWIM(code) - #define CODE_FOR_TWI(code) { code } -#else - #error "Wrong configuration." -#endif - -// All interrupt flags -#define DISABLE_ALL 0xFFFFFFFF - -#define SCL_PIN_CONF ((GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) \ - | (GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) \ - | (GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos) \ - | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) \ - | (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos)) - -#define SDA_PIN_CONF SCL_PIN_CONF - -#define SCL_PIN_CONF_CLR ((GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos) \ - | (GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos) \ - | (GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos) \ - | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) \ - | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos)) - -#define SDA_PIN_CONF_CLR SCL_PIN_CONF_CLR - -// Control block - driver instance local data. -typedef struct -{ - nrf_drv_twi_evt_handler_t handler; - void * p_context; - volatile uint32_t int_mask; - nrf_drv_twi_xfer_desc_t xfer_desc; - uint32_t flags; - uint8_t * p_curr_buf; - uint8_t curr_length; - bool curr_no_stop; - nrf_drv_state_t state; - bool error; - volatile bool busy; - bool repeated; - uint8_t bytes_transferred; -} twi_control_block_t; - -static twi_control_block_t m_cb[TWI_COUNT]; - -static nrf_drv_twi_config_t const m_default_config[TWI_COUNT] = { -#if TWI0_ENABLED - NRF_DRV_TWI_DEFAULT_CONFIG(0), -#endif -#if TWI1_ENABLED - NRF_DRV_TWI_DEFAULT_CONFIG(1), -#endif -}; - -#if PERIPHERAL_RESOURCE_SHARING_ENABLED - #define IRQ_HANDLER_NAME(n) irq_handler_for_instance_##n - #define IRQ_HANDLER(n) static void IRQ_HANDLER_NAME(n)(void) - - #if TWI0_ENABLED - IRQ_HANDLER(0); - #endif - #if TWI1_ENABLED - IRQ_HANDLER(1); - #endif - static nrf_drv_irq_handler_t const m_irq_handlers[TWI_COUNT] = { - #if TWI0_ENABLED - IRQ_HANDLER_NAME(0), - #endif - #if TWI1_ENABLED - IRQ_HANDLER_NAME(1), - #endif - }; -#else - #define IRQ_HANDLER(n) void SPI##n##_TWI##n##_IRQHandler(void) -#endif // PERIPHERAL_RESOURCE_SHARING_ENABLED - -static void twi_clear_bus(nrf_drv_twi_t const * const p_instance, - nrf_drv_twi_config_t const * p_config) -{ - NRF_GPIO->PIN_CNF[p_config->scl] = SCL_PIN_CONF; - NRF_GPIO->PIN_CNF[p_config->sda] = SDA_PIN_CONF; - - nrf_gpio_pin_set(p_config->scl); - nrf_gpio_pin_set(p_config->sda); - - NRF_GPIO->PIN_CNF[p_config->scl] = SCL_PIN_CONF_CLR; - NRF_GPIO->PIN_CNF[p_config->sda] = SDA_PIN_CONF_CLR; - - nrf_delay_us(4); - - for(int i = 0; i < 9; i++) - { - if (nrf_gpio_pin_read(p_config->sda)) - { - if(i == 0) - { - return; - } - else - { - break; - } - } - nrf_gpio_pin_clear(p_config->scl); - nrf_delay_us(4); - nrf_gpio_pin_set(p_config->scl); - nrf_delay_us(4); - } - nrf_gpio_pin_clear(p_config->sda); - nrf_delay_us(4); - nrf_gpio_pin_set(p_config->sda); -} - -ret_code_t nrf_drv_twi_init(nrf_drv_twi_t const * p_instance, - nrf_drv_twi_config_t const * p_config, - nrf_drv_twi_evt_handler_t event_handler, - void * p_context) -{ - twi_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; - - if (p_cb->state != NRF_DRV_STATE_UNINITIALIZED) - { - return NRF_ERROR_INVALID_STATE; - } - - if (p_config == NULL) - { - p_config = &m_default_config[p_instance->drv_inst_idx]; - } - -#if PERIPHERAL_RESOURCE_SHARING_ENABLED - if (nrf_drv_common_per_res_acquire(p_instance->reg.p_twi, - m_irq_handlers[p_instance->drv_inst_idx]) != NRF_SUCCESS) - { - return NRF_ERROR_BUSY; - } -#endif // PERIPHERAL_RESOURCE_SHARING_ENABLED - - p_cb->handler = event_handler; - p_cb->p_context = p_context; - p_cb->int_mask = 0; - p_cb->repeated = false; - p_cb->busy = false; - - twi_clear_bus(p_instance, p_config); - - /* To secure correct signal levels on the pins used by the TWI - master when the system is in OFF mode, and when the TWI master is - disabled, these pins must be configured in the GPIO peripheral. - */ - NRF_GPIO->PIN_CNF[p_config->scl] = SCL_PIN_CONF; - NRF_GPIO->PIN_CNF[p_config->sda] = SDA_PIN_CONF; - - CODE_FOR_TWIM - ( - NRF_TWIM_Type * p_twim = p_instance->reg.p_twim; - nrf_twim_pins_set(p_twim, p_config->scl, p_config->sda); - nrf_twim_frequency_set(p_twim, - (nrf_twim_frequency_t)p_config->frequency); - ) - CODE_FOR_TWI - ( - NRF_TWI_Type * p_twi = p_instance->reg.p_twi; - nrf_twi_pins_set(p_twi, p_config->scl, p_config->sda); - nrf_twi_frequency_set(p_twi, - (nrf_twi_frequency_t)p_config->frequency); - ) - - if (p_cb->handler) - { - CODE_FOR_TWIM - ( - nrf_drv_common_irq_enable(nrf_drv_get_IRQn((void *)p_instance->reg.p_twim), - p_config->interrupt_priority); - ) - CODE_FOR_TWI - ( - nrf_drv_common_irq_enable(nrf_drv_get_IRQn((void *)p_instance->reg.p_twi), - p_config->interrupt_priority); - ) - } - - p_cb->state = NRF_DRV_STATE_INITIALIZED; - - return NRF_SUCCESS; -} - -void nrf_drv_twi_uninit(nrf_drv_twi_t const * p_instance) -{ - twi_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; - ASSERT(p_cb->state != NRF_DRV_STATE_UNINITIALIZED); - - if (p_cb->handler) - { - CODE_FOR_TWIM - ( - nrf_drv_common_irq_disable(nrf_drv_get_IRQn((void *)p_instance->reg.p_twim)); - ) - CODE_FOR_TWI - ( - nrf_drv_common_irq_disable(nrf_drv_get_IRQn((void *)p_instance->reg.p_twi)); - ) - } - nrf_drv_twi_disable(p_instance); - -#if PERIPHERAL_RESOURCE_SHARING_ENABLED - nrf_drv_common_per_res_release(p_instance->reg.p_twi); -#endif - - p_cb->state = NRF_DRV_STATE_UNINITIALIZED; -} - -void nrf_drv_twi_enable(nrf_drv_twi_t const * p_instance) -{ - twi_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; - ASSERT(p_cb->state == NRF_DRV_STATE_INITIALIZED); - - CODE_FOR_TWIM - ( - NRF_TWIM_Type * p_twim = p_instance->reg.p_twim; - - nrf_twim_enable(p_twim); - ) - CODE_FOR_TWI - ( - NRF_TWI_Type * p_twi = p_instance->reg.p_twi; - - nrf_twi_enable(p_twi); - ) - - p_cb->state = NRF_DRV_STATE_POWERED_ON; -} - -void nrf_drv_twi_disable(nrf_drv_twi_t const * p_instance) -{ - twi_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; - ASSERT(p_cb->state != NRF_DRV_STATE_UNINITIALIZED); - - CODE_FOR_TWIM - ( - NRF_TWIM_Type * p_twim = p_instance->reg.p_twim; - p_cb->int_mask = 0; - nrf_twim_int_disable(p_twim, DISABLE_ALL); - nrf_twim_shorts_disable(p_twim, DISABLE_ALL); - nrf_twim_disable(p_twim); - ) - CODE_FOR_TWI - ( - NRF_TWI_Type * p_twi = p_instance->reg.p_twi; - nrf_twi_int_disable(p_twi, DISABLE_ALL); - nrf_twi_shorts_disable(p_twi, DISABLE_ALL); - nrf_twi_disable(p_twi); - ) - - p_cb->state = NRF_DRV_STATE_INITIALIZED; -} - -#ifdef TWI_IN_USE -static bool twi_send_byte(NRF_TWI_Type * p_twi, - uint8_t const * p_data, - uint8_t length, - uint8_t * p_bytes_transferred, - bool no_stop) -{ - if (*p_bytes_transferred < length) - { - nrf_twi_txd_set(p_twi, p_data[*p_bytes_transferred]); - ++(*p_bytes_transferred); - } - else - { - if (no_stop) - { - nrf_twi_task_trigger(p_twi, NRF_TWI_TASK_SUSPEND); - return false; - } - else - { - nrf_twi_task_trigger(p_twi, NRF_TWI_TASK_STOP); - } - } - return true; -} - -static bool twi_receive_byte(NRF_TWI_Type * p_twi, - uint8_t * p_data, - uint8_t length, - uint8_t * p_bytes_transferred, - bool no_stop) -{ - if (*p_bytes_transferred < length) - { - p_data[*p_bytes_transferred] = nrf_twi_rxd_get(p_twi); - - ++(*p_bytes_transferred); - - if ((*p_bytes_transferred == length-1) && !no_stop) - { - nrf_twi_shorts_set(p_twi, NRF_TWI_SHORT_BB_STOP_MASK); - } - else if (*p_bytes_transferred == length) - { - goto xfer_done; - } - - nrf_twi_task_trigger(p_twi, NRF_TWI_TASK_RESUME); - - return true; - } - -xfer_done: - if (no_stop) { - return false; - } else { - return true; - } -} - -static bool twi_transfer(NRF_TWI_Type * p_twi, - bool * p_error, - uint8_t * p_bytes_transferred, - uint8_t * p_data, - uint8_t length, - bool no_stop) -{ - bool do_stop_check; - - if ((*p_error == true) || (*p_bytes_transferred == length)) - { - do_stop_check = true; - } - else - { - do_stop_check = false; - } - - if (*p_error) - { - nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_ERROR); - nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_TXDSENT); - nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_RXDREADY); - } - else if (nrf_twi_event_check(p_twi, NRF_TWI_EVENT_ERROR)) - { - nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_ERROR); - nrf_twi_task_trigger(p_twi, NRF_TWI_TASK_STOP); - *p_error = true; - } - else - { - if (nrf_twi_event_check(p_twi, NRF_TWI_EVENT_TXDSENT)) - { - nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_TXDSENT); - if (nrf_twi_event_check(p_twi, NRF_TWI_EVENT_ERROR)) - { - nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_ERROR); - nrf_twi_task_trigger(p_twi, NRF_TWI_TASK_STOP); - *p_error = true; - } - else - { - if (!twi_send_byte(p_twi, p_data, length, p_bytes_transferred, no_stop)) - { - return false; - } - } - } - else if (nrf_twi_event_check(p_twi, NRF_TWI_EVENT_RXDREADY)) - { - nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_RXDREADY); - if (nrf_twi_event_check(p_twi, NRF_TWI_EVENT_ERROR)) - { - nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_ERROR); - nrf_twi_task_trigger(p_twi, NRF_TWI_TASK_STOP); - *p_error = true; - } - else - { - if (!twi_receive_byte(p_twi, p_data, length, - p_bytes_transferred, no_stop)) - { - return false; - } - } - } - } - - if (do_stop_check && nrf_twi_event_check(p_twi, NRF_TWI_EVENT_STOPPED)) - { - nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_STOPPED); - return false; - } - - return true; -} - -static ret_code_t twi_tx_start_transfer(twi_control_block_t * p_cb, - NRF_TWI_Type * p_twi, - uint8_t const * p_data, - uint8_t length, - bool no_stop) -{ - ret_code_t ret_code = NRF_SUCCESS; - - 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); - nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_RXDREADY); - nrf_twi_shorts_set(p_twi, 0); - - p_cb->bytes_transferred = 0; - p_cb->error = false; - - // In case TWI is suspended resume its operation. - nrf_twi_task_trigger(p_twi, NRF_TWI_TASK_RESUME); - nrf_twi_task_trigger(p_twi, NRF_TWI_TASK_STARTTX); - - (void)twi_send_byte(p_twi, p_data, length, &p_cb->bytes_transferred, no_stop); - - if (p_cb->handler) - { - p_cb->int_mask = NRF_TWI_INT_STOPPED_MASK | - NRF_TWI_INT_ERROR_MASK | - NRF_TWI_INT_TXDSENT_MASK | - NRF_TWI_INT_RXDREADY_MASK; - nrf_twi_int_enable(p_twi, p_cb->int_mask); - } - else - { - while (twi_transfer(p_twi, &p_cb->error, &p_cb->bytes_transferred, (uint8_t *)p_data, length, no_stop)) - {} - - if (p_cb->error) - { - ret_code = NRF_ERROR_INTERNAL; - } - } - return ret_code; -} - -static ret_code_t twi_rx_start_transfer(twi_control_block_t * p_cb, - NRF_TWI_Type * p_twi, - uint8_t const * p_data, - uint8_t length) -{ - bool no_stop; - ret_code_t ret_code = NRF_SUCCESS; - - 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); - nrf_twi_event_clear(p_twi, NRF_TWI_EVENT_RXDREADY); - - p_cb->bytes_transferred = 0; - p_cb->error = false; - - if (p_cb->flags & NRF_DRV_TWI_FLAG_RX_NO_STOP) - { - no_stop = true; - } else - { - no_stop = false; - } - - if ((length == 1) && !no_stop) - { - nrf_twi_shorts_set(p_twi, NRF_TWI_SHORT_BB_STOP_MASK); - } - else - { - nrf_twi_shorts_set(p_twi, NRF_TWI_SHORT_BB_SUSPEND_MASK); - } - // In case TWI is suspended resume its operation. - nrf_twi_task_trigger(p_twi, NRF_TWI_TASK_RESUME); - nrf_twi_task_trigger(p_twi, NRF_TWI_TASK_STARTRX); - - if (p_cb->handler) - { - p_cb->int_mask = NRF_TWI_INT_STOPPED_MASK | - NRF_TWI_INT_ERROR_MASK | - NRF_TWI_INT_TXDSENT_MASK | - NRF_TWI_INT_RXDREADY_MASK; - nrf_twi_int_enable(p_twi, p_cb->int_mask); - } - else - { - while (twi_transfer(p_twi, &p_cb->error, &p_cb->bytes_transferred, - (uint8_t *)p_data, length, no_stop)) - {} - - if (p_cb->error) - { - ret_code = NRF_ERROR_INTERNAL; - } - } - return ret_code; -} - -__STATIC_INLINE ret_code_t twi_xfer(twi_control_block_t * p_cb, - NRF_TWI_Type * p_twi, - nrf_drv_twi_xfer_desc_t const * p_xfer_desc, - uint32_t flags) -{ - ret_code_t ret = NRF_SUCCESS; - - /* Block TWI interrupts to ensure that function is not interrupted by TWI interrupt. */ - nrf_twi_int_disable(p_twi, DISABLE_ALL); - - if (p_cb->busy) - { - nrf_twi_int_enable(p_twi, p_cb->int_mask); - return NRF_ERROR_BUSY; - } - else - { - p_cb->busy = (NRF_DRV_TWI_FLAG_NO_XFER_EVT_HANDLER & flags) ? false : true; - } - - if (flags & NRF_DRV_TWI_FLAG_HOLD_XFER) - { - return NRF_ERROR_NOT_SUPPORTED; - } - - p_cb->flags = flags; - p_cb->xfer_desc = *p_xfer_desc; - p_cb->curr_length = p_xfer_desc->primary_length; - p_cb->p_curr_buf = p_xfer_desc->p_primary_buf; - nrf_twi_address_set(p_twi, p_xfer_desc->address); - - if (p_xfer_desc->type != NRF_DRV_TWI_XFER_RX) - { - p_cb->curr_no_stop = ((p_xfer_desc->type == NRF_DRV_TWI_XFER_TX) && - !(flags & NRF_DRV_TWI_FLAG_TX_NO_STOP)) ? false : true; - ret = twi_tx_start_transfer(p_cb, p_twi, p_xfer_desc->p_primary_buf, p_xfer_desc->primary_length, p_cb->curr_no_stop); - } - else - { - p_cb->curr_no_stop = false; - ret = twi_rx_start_transfer(p_cb, p_twi, p_xfer_desc->p_primary_buf, p_xfer_desc->primary_length); - } - if (p_cb->handler == NULL) - { - p_cb->busy = false; - } - return ret; -} -#endif - -#ifdef TWIM_IN_USE -__STATIC_INLINE void twim_list_enable_handle(NRF_TWIM_Type * p_twim, uint32_t flags) -{ - if (NRF_DRV_TWI_FLAG_TX_POSTINC & flags) - { - nrf_twim_tx_list_enable(p_twim); - } - else - { - nrf_twim_tx_list_disable(p_twim); - } - - if (NRF_DRV_TWI_FLAG_RX_POSTINC & flags) - { - nrf_twim_rx_list_enable(p_twim); - } - else - { - nrf_twim_rx_list_disable(p_twim); - } -#ifndef NRF52_PAN_46 -#endif -} -__STATIC_INLINE ret_code_t twim_xfer(twi_control_block_t * p_cb, - NRF_TWIM_Type * p_twim, - nrf_drv_twi_xfer_desc_t const * p_xfer_desc, - uint32_t flags) -{ - ret_code_t ret = NRF_SUCCESS; - nrf_twim_task_t start_task = NRF_TWIM_TASK_STARTTX; - nrf_twim_event_t evt_to_wait = NRF_TWIM_EVENT_STOPPED; - - if (!nrf_drv_is_in_RAM(p_xfer_desc->p_primary_buf)) - { - return NRF_ERROR_INVALID_ADDR; - } - /* Block TWI interrupts to ensure that function is not interrupted by TWI interrupt. */ - nrf_twim_int_disable(p_twim, DISABLE_ALL); - if (p_cb->busy) - { - nrf_twim_int_enable(p_twim, p_cb->int_mask); - return NRF_ERROR_BUSY; - } - else - { - - p_cb->busy = ((NRF_DRV_TWI_FLAG_NO_XFER_EVT_HANDLER & flags) || - (NRF_DRV_TWI_FLAG_REPEATED_XFER & flags)) ? false: true; - } - - p_cb->xfer_desc = *p_xfer_desc; - p_cb->repeated = (flags & NRF_DRV_TWI_FLAG_REPEATED_XFER) ? true : false; - nrf_twim_address_set(p_twim, p_xfer_desc->address); - - nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_STOPPED); - nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_ERROR); - - twim_list_enable_handle(p_twim, flags); - switch (p_xfer_desc->type) - { - case NRF_DRV_TWI_XFER_TXTX: - ASSERT(!(flags & NRF_DRV_TWI_FLAG_REPEATED_XFER)); - ASSERT(!(flags & NRF_DRV_TWI_FLAG_HOLD_XFER)); - ASSERT(!(flags & NRF_DRV_TWI_FLAG_NO_XFER_EVT_HANDLER)); - if (!nrf_drv_is_in_RAM(p_xfer_desc->p_secondary_buf)) - { - return NRF_ERROR_INVALID_ADDR; - } - nrf_twim_shorts_set(p_twim, NRF_TWIM_SHORT_LASTTX_SUSPEND_MASK); - nrf_twim_tx_buffer_set(p_twim, p_xfer_desc->p_primary_buf, p_xfer_desc->primary_length); - nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_TXSTARTED); - nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_LASTTX); - nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_SUSPENDED); - nrf_twim_task_trigger(p_twim, NRF_TWIM_TASK_RESUME); - nrf_twim_task_trigger(p_twim, NRF_TWIM_TASK_STARTTX); - while(!nrf_twim_event_check(p_twim, NRF_TWIM_EVENT_TXSTARTED)) - {} - nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_TXSTARTED); - nrf_twim_tx_buffer_set(p_twim, p_xfer_desc->p_secondary_buf, p_xfer_desc->secondary_length); - p_cb->int_mask = NRF_TWIM_INT_SUSPENDED_MASK | NRF_TWIM_INT_ERROR_MASK; - break; - case NRF_DRV_TWI_XFER_TXRX: - nrf_twim_tx_buffer_set(p_twim, p_xfer_desc->p_primary_buf, p_xfer_desc->primary_length); - nrf_twim_rx_buffer_set(p_twim, p_xfer_desc->p_secondary_buf, p_xfer_desc->secondary_length); - nrf_twim_shorts_set(p_twim, NRF_TWIM_SHORT_LASTTX_STARTRX_MASK | - NRF_TWIM_SHORT_LASTRX_STOP_MASK); - p_cb->int_mask = NRF_TWIM_INT_STOPPED_MASK | NRF_TWIM_INT_ERROR_MASK; - break; - case NRF_DRV_TWI_XFER_TX: - nrf_twim_tx_buffer_set(p_twim, p_xfer_desc->p_primary_buf, p_xfer_desc->primary_length); - if (NRF_DRV_TWI_FLAG_TX_NO_STOP & flags) - { - nrf_twim_shorts_set(p_twim, NRF_TWIM_SHORT_LASTTX_SUSPEND_MASK); - p_cb->int_mask = NRF_TWIM_INT_SUSPENDED_MASK | NRF_TWIM_INT_ERROR_MASK; - nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_SUSPENDED); - evt_to_wait = NRF_TWIM_EVENT_SUSPENDED; - } - else - { - nrf_twim_shorts_set(p_twim, NRF_TWIM_SHORT_LASTTX_STOP_MASK); - p_cb->int_mask = NRF_TWIM_INT_STOPPED_MASK | NRF_TWIM_INT_ERROR_MASK; - } - nrf_twim_task_trigger(p_twim, NRF_TWIM_TASK_RESUME); - break; - case NRF_DRV_TWI_XFER_RX: - nrf_twim_rx_buffer_set(p_twim, p_xfer_desc->p_primary_buf, p_xfer_desc->primary_length); - nrf_twim_shorts_set(p_twim, NRF_TWIM_SHORT_LASTRX_STOP_MASK); - p_cb->int_mask = NRF_TWIM_INT_STOPPED_MASK | NRF_TWIM_INT_ERROR_MASK; - start_task = NRF_TWIM_TASK_STARTRX; - nrf_twim_task_trigger(p_twim, NRF_TWIM_TASK_RESUME); - break; - default: - ret = NRF_ERROR_INVALID_PARAM; - break; - } - - if (!(flags & NRF_DRV_TWI_FLAG_HOLD_XFER) && (p_xfer_desc->type != NRF_DRV_TWI_XFER_TXTX)) - { - nrf_twim_task_trigger(p_twim, start_task); - } - - if (p_cb->handler) - { - if (flags & NRF_DRV_TWI_FLAG_NO_XFER_EVT_HANDLER) - { - p_cb->int_mask = NRF_TWIM_INT_ERROR_MASK; - } - nrf_twim_int_enable(p_twim, p_cb->int_mask); - } - else - { - while (!nrf_twim_event_check(p_twim, evt_to_wait)) - { - if (nrf_twim_event_check(p_twim, NRF_TWIM_EVENT_ERROR)) - { - nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_ERROR); - nrf_twim_task_trigger(p_twim, NRF_TWIM_TASK_RESUME); - nrf_twim_task_trigger(p_twim, NRF_TWIM_TASK_STOP); - evt_to_wait = NRF_TWIM_EVENT_STOPPED; - } - } - - uint32_t errorsrc = nrf_twim_errorsrc_get_and_clear(p_twim); - - p_cb->busy = false; - - if (errorsrc) - { - ret = NRF_ERROR_INTERNAL; - } - } - return ret; -} -#endif - -ret_code_t nrf_drv_twi_xfer(nrf_drv_twi_t const * p_instance, - nrf_drv_twi_xfer_desc_t const * p_xfer_desc, - uint32_t flags) -{ - ret_code_t ret = NRF_SUCCESS; - twi_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx]; - - // TXRX and TXTX transfers are support only in non-blocking mode. - ASSERT( !((p_cb->handler == NULL) && (p_xfer_desc->type == NRF_DRV_TWI_XFER_TXRX))); - ASSERT( !((p_cb->handler == NULL) && (p_xfer_desc->type == NRF_DRV_TWI_XFER_TXTX))); - - CODE_FOR_TWIM - ( - ret = twim_xfer(p_cb, (NRF_TWIM_Type *)p_instance->reg.p_twim, p_xfer_desc, flags); - ) - CODE_FOR_TWI - ( - if ( (NRF_DRV_TWI_FLAG_TX_POSTINC | NRF_DRV_TWI_FLAG_RX_POSTINC) & flags) - { - return NRF_ERROR_NOT_SUPPORTED; - } - ret = twi_xfer(p_cb, (NRF_TWI_Type *)p_instance->reg.p_twi, p_xfer_desc, flags); - ) - return ret; -} - -ret_code_t nrf_drv_twi_tx(nrf_drv_twi_t const * p_instance, - uint8_t address, - uint8_t const * p_data, - uint8_t length, - bool no_stop) -{ - nrf_drv_twi_xfer_desc_t xfer = NRF_DRV_TWI_XFER_DESC_TX(address, (uint8_t*)p_data, length); - - return nrf_drv_twi_xfer(p_instance, &xfer, no_stop ? NRF_DRV_TWI_FLAG_TX_NO_STOP : 0); -} - -ret_code_t nrf_drv_twi_rx(nrf_drv_twi_t const * p_instance, - uint8_t address, - uint8_t * p_data, - uint8_t length) -{ - nrf_drv_twi_xfer_desc_t xfer = NRF_DRV_TWI_XFER_DESC_RX(address, p_data, length); - return nrf_drv_twi_xfer(p_instance, &xfer, 0); -} - -ret_code_t nrf_drv_twi_rx_ext(nrf_drv_twi_t const * p_instance, - uint8_t address, - uint8_t * p_data, - uint8_t length, - bool no_stop) -{ - uint32_t flags; - nrf_drv_twi_xfer_desc_t xfer = NRF_DRV_TWI_XFER_DESC_RX(address, p_data, length); - - if (no_stop) { - flags = NRF_DRV_TWI_FLAG_RX_NO_STOP; - } else { - flags = 0; - } - return nrf_drv_twi_xfer(p_instance, &xfer, flags); -} - - -uint32_t nrf_drv_twi_data_count_get(nrf_drv_twi_t const * const p_instance) -{ - CODE_FOR_TWIM - ( - ASSERT(false); - return 0; - ) - CODE_FOR_TWI - ( - return m_cb[p_instance->drv_inst_idx].bytes_transferred; - ) -} -uint32_t nrf_drv_twi_start_task_get(nrf_drv_twi_t const * p_instance, nrf_drv_twi_xfer_type_t xfer_type) -{ - CODE_FOR_TWIM - ( - return (uint32_t)nrf_twim_task_address_get(p_instance->reg.p_twim, - (xfer_type != NRF_DRV_TWI_XFER_RX) ? NRF_TWIM_TASK_STARTTX : NRF_TWIM_TASK_STARTRX); - ) - CODE_FOR_TWI - ( - return (uint32_t)nrf_twi_task_address_get(p_instance->reg.p_twi, - (xfer_type != NRF_DRV_TWI_XFER_RX) ? NRF_TWI_TASK_STARTTX : NRF_TWI_TASK_STARTRX); - ) -} - -uint32_t nrf_drv_twi_stopped_event_get(nrf_drv_twi_t const * p_instance) -{ - CODE_FOR_TWIM - ( - return (uint32_t)nrf_twim_event_address_get(p_instance->reg.p_twim, NRF_TWIM_EVENT_STOPPED); - ) - CODE_FOR_TWI - ( - return (uint32_t)nrf_twi_event_address_get(p_instance->reg.p_twi, NRF_TWI_EVENT_STOPPED); - ) -} - -#ifdef TWIM_IN_USE -static void irq_handler_twim(NRF_TWIM_Type * p_twim, twi_control_block_t * p_cb) -{ - ASSERT(p_cb->handler); - - if (nrf_twim_event_check(p_twim, NRF_TWIM_EVENT_ERROR)) - { - nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_ERROR); - if (!nrf_twim_event_check(p_twim, NRF_TWIM_EVENT_STOPPED)) - { - nrf_twim_int_disable(p_twim, p_cb->int_mask); - p_cb->int_mask = NRF_TWIM_INT_STOPPED_MASK; - nrf_twim_int_enable(p_twim, p_cb->int_mask); - - nrf_twim_task_trigger(p_twim, NRF_TWIM_TASK_RESUME); - nrf_twim_task_trigger(p_twim, NRF_TWIM_TASK_STOP); - return; - } - } - - nrf_drv_twi_evt_t event; - - if (nrf_twim_event_check(p_twim, NRF_TWIM_EVENT_STOPPED)) - { - nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_STOPPED); - event.xfer_desc = p_cb->xfer_desc; - if (p_cb->error) - { - - event.xfer_desc.primary_length = (p_cb->xfer_desc.type == NRF_DRV_TWI_XFER_RX) ? - (uint8_t)nrf_twim_rxd_amount_get(p_twim) : (uint8_t)nrf_twim_txd_amount_get(p_twim); - event.xfer_desc.secondary_length = (p_cb->xfer_desc.type == NRF_DRV_TWI_XFER_TXRX) ? - (uint8_t)nrf_twim_rxd_amount_get(p_twim) : (uint8_t)nrf_twim_txd_amount_get(p_twim); - - } - nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_LASTTX); - nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_LASTRX); - if (!p_cb->repeated || p_cb->error) - { - nrf_twim_shorts_set(p_twim, 0); - p_cb->int_mask = 0; - nrf_twim_int_disable(p_twim, DISABLE_ALL); - } - } - else - { - nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_SUSPENDED); - if (p_cb->xfer_desc.type == NRF_DRV_TWI_XFER_TX) - { - event.xfer_desc = p_cb->xfer_desc; - if (!p_cb->repeated) - { - nrf_twim_shorts_set(p_twim, 0); - p_cb->int_mask = 0; - nrf_twim_int_disable(p_twim, DISABLE_ALL); - } - } - else - { - nrf_twim_shorts_set(p_twim, NRF_TWIM_SHORT_LASTTX_STOP_MASK); - p_cb->int_mask = NRF_TWIM_INT_STOPPED_MASK | NRF_TWIM_INT_ERROR_MASK; - nrf_twim_int_disable(p_twim, DISABLE_ALL); - nrf_twim_int_enable(p_twim, p_cb->int_mask); - nrf_twim_task_trigger(p_twim, NRF_TWIM_TASK_STARTTX); - nrf_twim_task_trigger(p_twim, NRF_TWIM_TASK_RESUME); - return; - } - } - - uint32_t errorsrc = nrf_twim_errorsrc_get_and_clear(p_twim); - if (errorsrc & NRF_TWIM_ERROR_ADDRESS_NACK) - { - event.type = NRF_DRV_TWI_EVT_ADDRESS_NACK; - } - else if (errorsrc & NRF_TWIM_ERROR_DATA_NACK) - { - event.type = NRF_DRV_TWI_EVT_DATA_NACK; - } - else - { - event.type = NRF_DRV_TWI_EVT_DONE; - } - - if (!p_cb->repeated) - { - p_cb->busy = false; - } - p_cb->handler(&event, p_cb->p_context); -} -#endif // TWIM_IN_USE - -#ifdef TWI_IN_USE -static void irq_handler_twi(NRF_TWI_Type * p_twi, twi_control_block_t * p_cb) -{ - ASSERT(p_cb->handler); - - if (twi_transfer(p_twi, &p_cb->error, &p_cb->bytes_transferred, p_cb->p_curr_buf, p_cb->curr_length, p_cb->curr_no_stop )) - { - return; - } - - if (!p_cb->error && - ((p_cb->xfer_desc.type == NRF_DRV_TWI_XFER_TXRX) || - (p_cb->xfer_desc.type == NRF_DRV_TWI_XFER_TXTX)) && - p_cb->p_curr_buf == p_cb->xfer_desc.p_primary_buf) - { - p_cb->p_curr_buf = p_cb->xfer_desc.p_secondary_buf; - p_cb->curr_length = p_cb->xfer_desc.secondary_length; - p_cb->curr_no_stop = (p_cb->flags & NRF_DRV_TWI_FLAG_TX_NO_STOP); - - if (p_cb->xfer_desc.type == NRF_DRV_TWI_XFER_TXTX) - { - (void)twi_tx_start_transfer(p_cb, p_twi, p_cb->p_curr_buf, p_cb->curr_length, p_cb->curr_no_stop); - } - else - { - (void)twi_rx_start_transfer(p_cb, p_twi, p_cb->p_curr_buf, p_cb->curr_length); - } - } - else - { - nrf_drv_twi_evt_t event; - event.xfer_desc = p_cb->xfer_desc; - - if (p_cb->error) - { - uint32_t errorsrc = nrf_twi_errorsrc_get_and_clear(p_twi); - if (errorsrc & NRF_TWI_ERROR_ADDRESS_NACK) - { - event.type = NRF_DRV_TWI_EVT_ADDRESS_NACK; - } - else if (errorsrc & NRF_TWI_ERROR_DATA_NACK) - { - event.type = NRF_DRV_TWI_EVT_DATA_NACK; - } - } - else - { - event.type = NRF_DRV_TWI_EVT_DONE; - } - - p_cb->busy = false; - - if (!(NRF_DRV_TWI_FLAG_NO_XFER_EVT_HANDLER & p_cb->flags)) - { - p_cb->handler(&event, p_cb->p_context); - } - } - -} -#endif // TWI_IN_USE - -#if TWI0_ENABLED -IRQ_HANDLER(0) -{ - #if (TWI0_USE_EASY_DMA == 1) && defined(NRF52) - irq_handler_twim(NRF_TWIM0, - #else - irq_handler_twi(NRF_TWI0, - #endif - &m_cb[TWI0_INSTANCE_INDEX]); -} -#endif // TWI0_ENABLED - -#if TWI1_ENABLED -IRQ_HANDLER(1) -{ - #if (TWI1_USE_EASY_DMA == 1) - irq_handler_twim(NRF_TWIM1, - #else - irq_handler_twi(NRF_TWI1, - #endif - &m_cb[TWI1_INSTANCE_INDEX]); -} -#endif // TWI1_ENABLED