/** * @brief Function for prepering shortcut register. * * @param[in] p_instance TWI. */ static void txrx_shorts_set_task_start(volatile nrf_drv_twi_t const * const p_instance) { uint32_t short_mask; volatile transfer_t * p_transfer = &(m_cb[p_instance->instance_id].transfer); nrf_twi_shorts_clear(p_instance->p_reg, NRF_TWI_SHORTS_BB_SUSPEND_MASK | NRF_TWI_SHORTS_BB_STOP_MASK); // if the last one and no pending transfer prepare to wait for stopped event if (((p_transfer->count + 1) == p_transfer->length) && p_transfer->xfer_pending == false) { short_mask = NRF_TWI_SHORTS_BB_STOP_MASK; p_transfer->end_event = NRF_TWI_EVENTS_STOPPED; nrf_twi_event_clear(p_instance->p_reg, p_transfer->end_event); if (m_handlers[p_instance->instance_id]) { nrf_twi_int_disable(p_instance->p_reg, p_transfer->end_int); p_transfer->end_int = NRF_TWI_INT_STOPPED_MASK; nrf_twi_int_enable(p_instance->p_reg, p_transfer->end_int); } state_machine(p_instance, TO_STOP); } else { short_mask = NRF_TWI_SHORTS_BB_SUSPEND_MASK; } nrf_twi_shorts_set(p_instance->p_reg, short_mask); nrf_twi_tasks_t prev_task = p_transfer->task; p_transfer->task = NRF_TWI_TASKS_RESUME; nrf_twi_task_set(p_instance->p_reg, prev_task); }
void nrf_drv_twi_uninit(nrf_drv_twi_t const * const p_instance) { ASSERT(m_cb[p_instance->instance_id].state != NRF_DRV_STATE_UNINITIALIZED); if (m_handlers[p_instance->instance_id]) { nrf_drv_common_irq_disable(p_instance->irq); } nrf_drv_twi_disable(p_instance); nrf_twi_shorts_clear(p_instance->p_reg, DISABLE_MASK); m_cb[p_instance->instance_id].state = NRF_DRV_STATE_UNINITIALIZED; }