<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://devzone.nordicsemi.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>I2C driver with soft device</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/27021/i2c-driver-with-soft-device</link><description>hello there i want to send output of i2C sensor on ble. but how to add i2c driver for ble application???</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Tue, 29 Dec 2015 15:18:36 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/27021/i2c-driver-with-soft-device" /><item><title>RE: I2C driver with soft device</title><link>https://devzone.nordicsemi.com/thread/106071?ContentTypeID=1</link><pubDate>Tue, 29 Dec 2015 15:18:36 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:4c12f58c-43bc-4943-a534-b64723b97529</guid><dc:creator>Petter Myhre</dc:creator><description>&lt;p&gt;It might be related, add a link to this question in the new question. Also add what SoftDevice and SDK version you are using. You can upload code, but please upload your complete project. Zip it and attach it to the question. And tell us where to unzip it. You attach the project by using the paper clip button.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I2C driver with soft device</title><link>https://devzone.nordicsemi.com/thread/106070?ContentTypeID=1</link><pubDate>Tue, 29 Dec 2015 15:14:16 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:e7b4b735-1530-4b83-b3eb-cb16c3c1bafd</guid><dc:creator>rushin</dc:creator><description>&lt;p&gt;can i upload code here?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I2C driver with soft device</title><link>https://devzone.nordicsemi.com/thread/106069?ContentTypeID=1</link><pubDate>Tue, 29 Dec 2015 15:11:08 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:91581e85-0e8f-4e56-92b2-b11f90f4d1c2</guid><dc:creator>rushin</dc:creator><description>&lt;p&gt;but i think new problem is related with i2c driver&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I2C driver with soft device</title><link>https://devzone.nordicsemi.com/thread/106068?ContentTypeID=1</link><pubDate>Tue, 29 Dec 2015 15:06:53 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:0377dec0-78f1-4287-8cad-081e263b0625</guid><dc:creator>Petter Myhre</dc:creator><description>&lt;p&gt;If you have a new problem I suggest you create a new question. Thanks.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I2C driver with soft device</title><link>https://devzone.nordicsemi.com/thread/106066?ContentTypeID=1</link><pubDate>Tue, 29 Dec 2015 13:11:55 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:e5db5d86-b010-47a5-843e-e209e52f0bca</guid><dc:creator>rushin</dc:creator><description>&lt;p&gt;but my new problem is that i have written code for interfacing with adxl345. i am getting data on uart. now i want to send data on BLE. so i used that code in ble pheripheral. i am using soft device s110. but now i am not getting output on terminal?. can i upload all code??&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I2C driver with soft device</title><link>https://devzone.nordicsemi.com/thread/106065?ContentTypeID=1</link><pubDate>Tue, 29 Dec 2015 13:08:15 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:8cd0c989-0ff7-4264-870c-bee3120d2636</guid><dc:creator>rushin</dc:creator><description>&lt;p&gt;hello my problem is solved&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I2C driver with soft device</title><link>https://devzone.nordicsemi.com/thread/106067?ContentTypeID=1</link><pubDate>Mon, 28 Dec 2015 14:21:26 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:f5f127bf-e987-4e0f-a395-4a25929467a2</guid><dc:creator>Petter Myhre</dc:creator><description>&lt;p&gt;Have you defined SPI0_TWI0_IRQHandler in main.c?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I2C driver with soft device</title><link>https://devzone.nordicsemi.com/thread/106072?ContentTypeID=1</link><pubDate>Sun, 27 Dec 2015 06:52:26 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:e3e695cc-5a07-4342-b01e-6c35418dff74</guid><dc:creator>rushin</dc:creator><description>&lt;p&gt;hey that solved my problem but when i start twi api in main file i am getting error like&lt;/p&gt;
&lt;p&gt;._build\nrf51422_xxac_s110.axf: Error: L6200E: Symbol SPI0_TWI0_IRQHandler multiply defined (by nrf_drv_twi.o and main.o).&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.\_build\nrf51422_xxac_s110.axf: Error: L6200E: Symbol nrf_drv_twi_data_count_get multiply defined (by nrf_drv_twi.o and main.o).
.\_build\nrf51422_xxac_s110.axf: Error: L6200E: Symbol nrf_drv_twi_disable multiply defined (by nrf_drv_twi.o and main.o).
.\_build\nrf51422_xxac_s110.axf: Error: L6200E: Symbol nrf_drv_twi_enable multiply defined (by nrf_drv_twi.o and main.o).
.\_build\nrf51422_xxac_s110.axf: Error: L6200E: Symbol nrf_drv_twi_init multiply defined (by nrf_drv_twi.o and main.o).
.\_build\nrf51422_xxac_s110.axf: Error: L6200E: Symbol nrf_drv_twi_rx multiply defined (by nrf_drv_twi.o and main.o).
.\_build\nrf51422_xxac_s110.axf: Error: L6200E: Symbol nrf_drv_twi_tx multiply defined (by nrf_drv_twi.o and main.o).
.\_build\nrf51422_xxac_s110.axf: Error: L6200E: Symbol nrf_drv_twi_uninit multiply defined (by nrf_drv_twi.o and main.o).
&lt;/code&gt;&lt;/pre&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I2C driver with soft device</title><link>https://devzone.nordicsemi.com/thread/106057?ContentTypeID=1</link><pubDate>Tue, 22 Dec 2015 20:31:19 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:edc47dc2-836e-4793-86bf-ebfeecd2de6e</guid><dc:creator>Johannes Lorenz</dc:creator><description>&lt;p&gt;Edit &lt;code&gt;nrf_drv_config.h&lt;/code&gt; as I showed in my previous comment. E.g. &lt;code&gt;define TWI0_ENABLED 1&lt;/code&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I2C driver with soft device</title><link>https://devzone.nordicsemi.com/thread/106059?ContentTypeID=1</link><pubDate>Tue, 22 Dec 2015 19:35:27 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:19d1274b-5b30-4904-b7ec-129c2a911382</guid><dc:creator>rushin</dc:creator><description>&lt;p&gt;how to change it??&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I2C driver with soft device</title><link>https://devzone.nordicsemi.com/thread/106058?ContentTypeID=1</link><pubDate>Tue, 22 Dec 2015 19:12:39 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:b92c2f94-dd83-484a-b5fa-53c0495defef</guid><dc:creator>Johannes Lorenz</dc:creator><description>&lt;p&gt;Hi, IMHO at least one of &lt;code&gt;TWI0_ENABLED&lt;/code&gt; or &lt;code&gt;TWI!_Enabled&lt;/code&gt;should be enabled (e.g. = 1). Not only to become functional, but also to set TWI_COUNT &amp;gt; 0, thus e.g. the array &lt;code&gt;static volatile control_block_t m_cb[TWI_COUNT];&lt;/code&gt; can be initialized.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I2C driver with soft device</title><link>https://devzone.nordicsemi.com/thread/106060?ContentTypeID=1</link><pubDate>Tue, 22 Dec 2015 18:35:47 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:90059b20-143a-41ca-b05a-7b888f3e63a1</guid><dc:creator>rushin</dc:creator><description>&lt;p&gt;hey it is my file&amp;#39;s contents&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I2C driver with soft device</title><link>https://devzone.nordicsemi.com/thread/106062?ContentTypeID=1</link><pubDate>Tue, 22 Dec 2015 18:34:05 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:20c7d52a-c0d7-4e5d-9de7-1efdd84ea88f</guid><dc:creator>rushin</dc:creator><description>&lt;p&gt;#define TWI0_ENABLED 0&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#if (TWI0_ENABLED == 1)
#define TWI0_CONFIG_FREQUENCY    NRF_TWI_FREQ_100K
#define TWI0_CONFIG_SCL          0
#define TWI0_CONFIG_SDA          1
#define TWI0_CONFIG_IRQ_PRIORITY APP_IRQ_PRIORITY_LOW

#define TWI0_INSTANCE_INDEX      0
#endif

#define TWI1_ENABLED 0

#if (TWI1_ENABLED == 1)
#define TWI1_CONFIG_FREQUENCY    NRF_TWI_FREQ_100K
#define TWI1_CONFIG_SCL          0
#define TWI1_CONFIG_SDA          1
#define TWI1_CONFIG_IRQ_PRIORITY APP_IRQ_PRIORITY_LOW

#define TWI1_INSTANCE_INDEX      (TWI0_ENABLED)
#endif

#define TWI_COUNT                (TWI0_ENABLED+TWI1_ENABLED)
&lt;/code&gt;&lt;/pre&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I2C driver with soft device</title><link>https://devzone.nordicsemi.com/thread/106063?ContentTypeID=1</link><pubDate>Tue, 22 Dec 2015 17:57:17 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:dc29763b-6fc4-49d0-b267-79bdf2af862d</guid><dc:creator>Johannes Lorenz</dc:creator><description>&lt;p&gt;Hi, check &lt;code&gt;nrd_drv_config.h&lt;/code&gt;.
Do you have:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#define TWI0_ENABLED 0
#define TWI0_ENABLED 1
.....
#define TWI_COUNT                (TWI0_ENABLED+TWI1_ENABLED)
&lt;/code&gt;&lt;/pre&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I2C driver with soft device</title><link>https://devzone.nordicsemi.com/thread/106064?ContentTypeID=1</link><pubDate>Tue, 22 Dec 2015 16:33:40 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:e91412d5-9eaf-4a47-a371-52b17d141c96</guid><dc:creator>rushin</dc:creator><description>&lt;p&gt;it gives me error like&lt;/p&gt;
&lt;p&gt;............\components\drivers_nrf\twi_master\nrf_drv_twi.c(90): error:  #94-D: the size of an array must be greater than zero&lt;/p&gt;
&lt;p&gt;............\components\drivers_nrf\twi_master\nrf_drv_twi.c(95): error:  #1514: an empty initializer is invalid for an array with unspecified bound&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I2C driver with soft device</title><link>https://devzone.nordicsemi.com/thread/106056?ContentTypeID=1</link><pubDate>Tue, 22 Dec 2015 16:30:11 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:c60306db-282d-4994-b9e2-cdbc6cbc9ccf</guid><dc:creator>rushin</dc:creator><description>&lt;p&gt;hey i  did that. but still i am getting error. compiler says that there is mistakes in my nrf  i2c driver file nrf_drv_twi.c&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;quot;nrf_drv_twi.h&amp;quot;
#include &amp;quot;nrf_assert.h&amp;quot;
#include &amp;quot;app_util_platform.h&amp;quot;
#include &amp;quot;nrf_delay.h&amp;quot;
#include &amp;quot;nrf_gpio.h&amp;quot;

/**@brief Determine how long driver will be wait for event (in blocking mode). */
#define BUSY_LOOP_TIMEOUT   0xFFF

#define DISABLE_MASK        UINT32_MAX

#define SCL_PIN_CONF        ((GPIO_PIN_CNF_SENSE_Disabled &amp;lt;&amp;lt; GPIO_PIN_CNF_SENSE_Pos)    \
                            | (GPIO_PIN_CNF_DRIVE_S0D1     &amp;lt;&amp;lt; GPIO_PIN_CNF_DRIVE_Pos)   \
                            | (GPIO_PIN_CNF_PULL_Pullup    &amp;lt;&amp;lt; GPIO_PIN_CNF_PULL_Pos)    \
                            | (GPIO_PIN_CNF_INPUT_Connect  &amp;lt;&amp;lt; GPIO_PIN_CNF_INPUT_Pos)   \
                            | (GPIO_PIN_CNF_DIR_Input      &amp;lt;&amp;lt; GPIO_PIN_CNF_DIR_Pos))
#define SDA_PIN_CONF        SCL_PIN_CONF

#define SCL_PIN_CONF_CLR    ((GPIO_PIN_CNF_SENSE_Disabled &amp;lt;&amp;lt; GPIO_PIN_CNF_SENSE_Pos)    \
                            | (GPIO_PIN_CNF_DRIVE_S0D1     &amp;lt;&amp;lt; GPIO_PIN_CNF_DRIVE_Pos)   \
                            | (GPIO_PIN_CNF_PULL_Pullup    &amp;lt;&amp;lt; GPIO_PIN_CNF_PULL_Pos)    \
                            | (GPIO_PIN_CNF_INPUT_Connect  &amp;lt;&amp;lt; GPIO_PIN_CNF_INPUT_Pos)   \
                            | (GPIO_PIN_CNF_DIR_Output     &amp;lt;&amp;lt; GPIO_PIN_CNF_DIR_Pos))
#define SDA_PIN_CONF_CLR    SCL_PIN_CONF_CLR

/**@brief TWI powered on substates. */
typedef enum
{
    NRF_DRV_TWI_SUBSTATE_IDLE,          /**&amp;lt; Idle state. Transmission is stoped. */
    NRF_DRV_TWI_SUBSTATE_SUSPEND,       /**&amp;lt; Tx transmission is suspended. */
    NRF_DRV_TWI_SUBSTATE_RX_SUSPEND,    /**&amp;lt; Rx transmission is suspended. */
    NRF_DRV_TWI_SUBSTATE_STOP,          /**&amp;lt; Transmission will be stoped. */
    NRF_DRV_TWI_SUBSTATE_ERROR          /**&amp;lt; Error condition. */         
} substate_t;

/**@brief State machine events. */
typedef enum
{
    TX_ADDR_REQ,
    RX_ADDR_REQ,
    TX_DONE,
    RX_DONE,
    TO_STOP,
    ON_ERROR
} sm_evt_t;

/**@brief TWI transfer structure. */
typedef struct
{
    bool             is_tx;                 /**&amp;lt; Transmission from master to slave (if is_tx is set) or from slave to master (if not). */
    bool             xfer_pending;          /**&amp;lt; Transmission will be suspended (if xfer_pending is set) or stopped (if not). */
    bool             transfer_in_progress;  /**&amp;lt; Data transfer is in progress. */
    bool             error_condition;       /**&amp;lt; Error has occured. */
    uint8_t          address;               /**&amp;lt; Address of slave device. */
    uint8_t        * p_data;                /**&amp;lt; Pointer to data buffer. */
    uint16_t         length;                /**&amp;lt; Length of data buffer. */
    uint16_t         count;                 /**&amp;lt; Count of already transferred bytes. */
    nrf_twi_tasks_t  task;                  /**&amp;lt; Next task. */
    nrf_twi_events_t end_event;             /**&amp;lt; Event for which the state machine waits. */
    nrf_twi_int_mask_t end_int;             /**&amp;lt; Interrupt for which the state machine waits. */
} transfer_t;

/**@brief TWI driver instance control block structure. */
typedef struct
{
    nrf_drv_state_t state;    /**&amp;lt; Instance state. */
    substate_t      substate; /**&amp;lt; Instance substate when powered on. */
    transfer_t      transfer; /**&amp;lt; Transfer structure. */
} control_block_t;

/**@brief Macro for getting the number of elements of the array. */
#define ARRAY_LENGTH(a) (sizeof(a) / sizeof(a[0]))

/** @brief User callbacks storage. */
static volatile nrf_drv_twi_evt_handler_t m_handlers[TWI_COUNT];

/** @brief Control blocks storage. */
static volatile control_block_t           m_cb[TWI_COUNT];

/** @brief TWI instances pointers storage. */
static volatile nrf_drv_twi_t *           m_instances[TWI_COUNT];

static const nrf_drv_twi_config_t m_default_config[] = {
#if (TWI0_ENABLED == 1)
    NRF_DRV_TWI_DEFAULT_CONFIG(0),
#endif
#if (TWI1_ENABLED == 1)
    NRF_DRV_TWI_DEFAULT_CONFIG(1)
#endif
};

/**@brief TWI state machine action. */
typedef void (* sm_action_t)(volatile nrf_drv_twi_t const * const p_instance);

/**@brief TWI transition structure. */
typedef struct
{
    sm_evt_t    evt;
    substate_t  next_state;
    sm_action_t func;
} transition_t;

/**
 * @brief Function for initializing data transfer (from master to slave).
 *
 * @param[in] p_instance      TWI.
 */
static void address_req(volatile nrf_drv_twi_t const * const p_instance);

/**
 * @brief Function for initializing data transfer (from slave to master).
 *
 * @param[in] p_instance      TWI.
 */
static void rx_address_req(volatile nrf_drv_twi_t const * const p_instance);

/**
 * @brief Function for preparing byte transfer (from master to slave).
 *
 * @param[in] p_instance      TWI.
 */
static void tx_prepare(volatile nrf_drv_twi_t const * const p_instance);

/**
 * @brief Function for confirming byte transfer (from master to slave).
 *
 * @param[in] p_instance      TWI.
 */
static void tx_done(volatile nrf_drv_twi_t const * const p_instance);

/**
 * @brief Function for preparing byte transfer (from slave to master).
 *
 * @param[in] p_instance      TWI.
 */
static void rx_prepare(volatile nrf_drv_twi_t const * const p_instance);

/**
 * @brief Function for confirming byte transfer (from slave to master).
 *
 * @param[in] p_instance      TWI.
 */
static void rx_done(volatile nrf_drv_twi_t const * const p_instance);

/**
 * @brief Function for ending transfer after an error.
 *
 * @param[in] p_instance      TWI.
 */
static void on_error(volatile nrf_drv_twi_t const * const p_instance);

/**
 * @brief Function for ending transfer after an error.
 *
 * @param[in] p_instance      TWI.
 */
static void ack_error(volatile nrf_drv_twi_t const * const p_instance);

/**@brief List of idle state transitions. */
static const transition_t m_idle[] = {
    {TX_ADDR_REQ,  NRF_DRV_TWI_SUBSTATE_SUSPEND,    address_req},
    {RX_ADDR_REQ,  NRF_DRV_TWI_SUBSTATE_RX_SUSPEND, rx_address_req},
};

/**@brief List of TX suspended state transitions. */
static const transition_t m_tx_suspended[] = {
    {TX_DONE,         NRF_DRV_TWI_SUBSTATE_SUSPEND,    tx_done},
    {RX_ADDR_REQ,     NRF_DRV_TWI_SUBSTATE_RX_SUSPEND, rx_address_req},
    {TX_ADDR_REQ,     NRF_DRV_TWI_SUBSTATE_SUSPEND,    tx_prepare},
    {TO_STOP,         NRF_DRV_TWI_SUBSTATE_STOP,       NULL},
    {ON_ERROR,        NRF_DRV_TWI_SUBSTATE_ERROR,      on_error}
};

/**@brief List of RX suspended state transitions. */
static const transition_t m_rx_suspended[] = {
    {RX_ADDR_REQ,     NRF_DRV_TWI_SUBSTATE_RX_SUSPEND, rx_prepare},
    {RX_DONE,         NRF_DRV_TWI_SUBSTATE_RX_SUSPEND, rx_done},
    {TO_STOP,         NRF_DRV_TWI_SUBSTATE_STOP,       NULL},
    {ON_ERROR,        NRF_DRV_TWI_SUBSTATE_ERROR,      on_error}
};

/**@brief List of stopped state transitions. */
static const transition_t m_stopped[] = {
    {RX_DONE,   NRF_DRV_TWI_SUBSTATE_IDLE,  rx_done},
    {TX_DONE,   NRF_DRV_TWI_SUBSTATE_IDLE,  tx_done},
    {ON_ERROR,  NRF_DRV_TWI_SUBSTATE_IDLE,  ack_error}
};

/**@brief List of error state transitions. */
static const transition_t m_error[] = {
    {RX_DONE,   NRF_DRV_TWI_SUBSTATE_IDLE,  ack_error},
    {TX_DONE,   NRF_DRV_TWI_SUBSTATE_IDLE,  ack_error},
    {ON_ERROR,  NRF_DRV_TWI_SUBSTATE_IDLE,  ack_error}
};

/**@brief List of state machine states. */
static const transition_t * mp_states[] = {
    m_idle,
    m_tx_suspended,
    m_rx_suspended,
    m_stopped,
    m_error
};

/**@brief List of amounts for each state transitions. */
static const uint32_t m_states_len[] =
{
    ARRAY_LENGTH(m_idle),
    ARRAY_LENGTH(m_tx_suspended),
    ARRAY_LENGTH(m_rx_suspended),
    ARRAY_LENGTH(m_stopped),
    ARRAY_LENGTH(m_error)
};

/**
 * @brief Function for running state machine.
 *
 * @param[in] p_instance      TWI.
 * @param[in] evt             State machine event.
 */
static void state_machine(volatile nrf_drv_twi_t const * const p_instance, sm_evt_t evt)
{
    bool                 evt_found = false;
    substate_t           substate  = m_cb[p_instance-&amp;gt;instance_id].substate;
    transition_t const * p_state   = mp_states[substate];

    for (uint32_t i = 0; i &amp;lt; m_states_len[substate]; i++)
    {
        if (evt == p_state[i].evt)
        {
            m_cb[p_instance-&amp;gt;instance_id].substate = p_state[i].next_state;

            if (p_state[i].func)
            {
                p_state[i].func(p_instance);
            }
            evt_found = true;
            break;
        }
    }
    UNUSED_VARIABLE(evt_found);
    ASSERT(evt_found);
}


/**
 * @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 = &amp;amp;(m_cb[p_instance-&amp;gt;instance_id].transfer);

    nrf_twi_shorts_clear(p_instance-&amp;gt;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-&amp;gt;count + 1) == p_transfer-&amp;gt;length) &amp;amp;&amp;amp; p_transfer-&amp;gt;xfer_pending == false)
    {
        short_mask = NRF_TWI_SHORTS_BB_STOP_MASK;

        p_transfer-&amp;gt;end_event = NRF_TWI_EVENTS_STOPPED;
        nrf_twi_event_clear(p_instance-&amp;gt;p_reg, p_transfer-&amp;gt;end_event);

        if (m_handlers[p_instance-&amp;gt;instance_id])
        {
            nrf_twi_int_disable(p_instance-&amp;gt;p_reg, p_transfer-&amp;gt;end_int);
            p_transfer-&amp;gt;end_int   = NRF_TWI_INT_STOPPED_MASK;
            nrf_twi_int_enable(p_instance-&amp;gt;p_reg, p_transfer-&amp;gt;end_int);
        }

        state_machine(p_instance, TO_STOP);
    }
    else
    {
        short_mask = NRF_TWI_SHORTS_BB_SUSPEND_MASK;
    }

    nrf_twi_shorts_set(p_instance-&amp;gt;p_reg, short_mask);
    nrf_twi_tasks_t prev_task = p_transfer-&amp;gt;task;
    p_transfer-&amp;gt;task = NRF_TWI_TASKS_RESUME;
    nrf_twi_task_set(p_instance-&amp;gt;p_reg, prev_task);
}


static void address_req(volatile nrf_drv_twi_t const * const p_instance)
{
    volatile transfer_t * p_transfer = &amp;amp;(m_cb[p_instance-&amp;gt;instance_id].transfer);
    nrf_twi_address_set(p_instance-&amp;gt;p_reg, p_transfer-&amp;gt;address);

    nrf_twi_task_set(p_instance-&amp;gt;p_reg, NRF_TWI_TASKS_RESUME);
    p_transfer-&amp;gt;task = NRF_TWI_TASKS_STARTTX;
    p_transfer-&amp;gt;end_event = NRF_TWI_EVENTS_TXDSENT;
    nrf_twi_event_clear(p_instance-&amp;gt;p_reg, p_transfer-&amp;gt;end_event);

    if (m_handlers[p_instance-&amp;gt;instance_id])
    {
        nrf_twi_int_disable(p_instance-&amp;gt;p_reg, p_transfer-&amp;gt;end_int);
        p_transfer-&amp;gt;end_int   = NRF_TWI_INT_TXDSENT_MASK;
        nrf_twi_int_enable(p_instance-&amp;gt;p_reg, p_transfer-&amp;gt;end_int);
    }

    tx_prepare(p_instance);
}


static void rx_address_req(volatile nrf_drv_twi_t const * const p_instance)
{
    volatile transfer_t * p_transfer = &amp;amp;(m_cb[p_instance-&amp;gt;instance_id].transfer);

    nrf_twi_address_set(p_instance-&amp;gt;p_reg, p_transfer-&amp;gt;address);
    nrf_twi_task_set(p_instance-&amp;gt;p_reg, NRF_TWI_TASKS_RESUME);
    p_transfer-&amp;gt;task = NRF_TWI_TASKS_STARTRX;
    p_transfer-&amp;gt;end_event = NRF_TWI_EVENTS_RXDREADY;
    nrf_twi_event_clear(p_instance-&amp;gt;p_reg, p_transfer-&amp;gt;end_event);
    if (m_handlers[p_instance-&amp;gt;instance_id])
    {
        nrf_twi_int_disable(p_instance-&amp;gt;p_reg, p_transfer-&amp;gt;end_int);
        p_transfer-&amp;gt;end_int   = NRF_TWI_INT_RXDREADY_MASK;
        nrf_twi_int_enable(p_instance-&amp;gt;p_reg, p_transfer-&amp;gt;end_int);
    }

    rx_prepare(p_instance);
}


static void rx_prepare(volatile nrf_drv_twi_t const * const p_instance)
{
    txrx_shorts_set_task_start(p_instance);
}


static void rx_done(volatile nrf_drv_twi_t const * const p_instance)
{
    volatile transfer_t * p_transfer = &amp;amp;(m_cb[p_instance-&amp;gt;instance_id].transfer);

    p_transfer-&amp;gt;p_data[p_transfer-&amp;gt;count] = nrf_twi_rxd_get(p_instance-&amp;gt;p_reg);
    p_transfer-&amp;gt;count++;

    if (p_transfer-&amp;gt;count &amp;lt; p_transfer-&amp;gt;length)
    {
        rx_prepare(p_instance);
    }
}


static void tx_prepare(volatile nrf_drv_twi_t const * const p_instance)
{
    volatile transfer_t * p_transfer = &amp;amp;(m_cb[p_instance-&amp;gt;instance_id].transfer);

    nrf_twi_txd_set(p_instance-&amp;gt;p_reg, p_transfer-&amp;gt;p_data[p_transfer-&amp;gt;count]);
    txrx_shorts_set_task_start(p_instance);
}


static void tx_done(volatile nrf_drv_twi_t const * const p_instance)
{
    volatile transfer_t * p_transfer = &amp;amp;(m_cb[p_instance-&amp;gt;instance_id].transfer);

    p_transfer-&amp;gt;count++;

    if (p_transfer-&amp;gt;count &amp;lt; p_transfer-&amp;gt;length)
    {
        tx_prepare(p_instance);
    }
}


static void on_error(volatile nrf_drv_twi_t const * const p_instance)
{
    volatile transfer_t * p_transfer = &amp;amp;(m_cb[p_instance-&amp;gt;instance_id].transfer);

    p_transfer-&amp;gt;end_event            = NRF_TWI_EVENTS_STOPPED;
    nrf_twi_event_clear(p_instance-&amp;gt;p_reg, p_transfer-&amp;gt;end_event);

    if (m_handlers[p_instance-&amp;gt;instance_id])
    {
        nrf_twi_int_disable(p_instance-&amp;gt;p_reg, p_transfer-&amp;gt;end_int);
        p_transfer-&amp;gt;end_int   = NRF_TWI_INT_STOPPED_MASK;
        nrf_twi_int_enable(p_instance-&amp;gt;p_reg, p_transfer-&amp;gt;end_int);
    }

    nrf_twi_task_set(p_instance-&amp;gt;p_reg, NRF_TWI_TASKS_RESUME);
    nrf_twi_task_set(p_instance-&amp;gt;p_reg, NRF_TWI_TASKS_STOP);
}

static void ack_error(volatile nrf_drv_twi_t const * const p_instance)
{
    volatile transfer_t * p_transfer = &amp;amp;(m_cb[p_instance-&amp;gt;instance_id].transfer);

    p_transfer-&amp;gt;error_condition = true;
}

/**
 * @brief Function for blocking the module until desired event occurs.
 *
 * @param[in] p_instance      TWI.
 *
 * @return    False if any error has occurred.
 */
static bool twi_action_wait(nrf_drv_twi_t const * const p_instance)
{
    bool     error;
    bool     done;
    uint32_t timeout = 0;
    volatile transfer_t * p_transfer = &amp;amp;(m_cb[p_instance-&amp;gt;instance_id].transfer);

    do
    {
        done  = nrf_twi_event_check(p_instance-&amp;gt;p_reg, p_transfer-&amp;gt;end_event);
        error = nrf_twi_event_check(p_instance-&amp;gt;p_reg, NRF_TWI_EVENTS_ERROR);
        error |= (++timeout &amp;lt; BUSY_LOOP_TIMEOUT) ? false : true;
    } while (!(error | done));
    return !error;
}

static void twi_clear_bus(nrf_drv_twi_t const * const p_instance, nrf_drv_twi_config_t const * p_config)
{
    NRF_GPIO-&amp;gt;PIN_CNF[p_config-&amp;gt;scl] = SCL_PIN_CONF;
    NRF_GPIO-&amp;gt;PIN_CNF[p_config-&amp;gt;sda] = SDA_PIN_CONF;

    nrf_gpio_pin_set(p_config-&amp;gt;scl);
    nrf_gpio_pin_set(p_config-&amp;gt;sda);

    NRF_GPIO-&amp;gt;PIN_CNF[p_config-&amp;gt;scl] = SCL_PIN_CONF_CLR;
    NRF_GPIO-&amp;gt;PIN_CNF[p_config-&amp;gt;sda] = SDA_PIN_CONF_CLR;

    nrf_delay_us(4);

    for(int i = 0; i &amp;lt; 9; i++)
    {
        if (nrf_gpio_pin_read(p_config-&amp;gt;sda))
        {
            if(i == 0)
            {
                return;
            }
            else
            {
                break;
            }
        }
        nrf_gpio_pin_clear(p_config-&amp;gt;scl);
        nrf_delay_us(4);
        nrf_gpio_pin_set(p_config-&amp;gt;scl);
        nrf_delay_us(4);
    }
    nrf_gpio_pin_clear(p_config-&amp;gt;sda);
    nrf_delay_us(4);
    nrf_gpio_pin_set(p_config-&amp;gt;sda);
}

/**
 * @brief Function for transferring data.
 *
 * @note Transmission will be stopped when error or timeout occurs.
 *
 * @param[in] p_instance      TWI.
 * @param[in] address         Address of specific slave device (only 7 LSB).
 * @param[in] p_data          Pointer to a receive buffer.
 * @param[in] length          Number of bytes to be received.
 * @param[in] xfer_pending    After a specified number of bytes transmission will be
 *                            suspended (if xfer_pending is set) or stopped (if not)
 * @param[in] is_tx           Indicate transfer direction (true for master to slave transmission).
 *
 * @retval  NRF_SUCCESS        If the procedure was successful.
 * @retval  NRF_ERROR_BUSY     Driver is not ready for new transfer.
 * @retval  NRF_ERROR_INTERNAL NRF_TWI_EVENTS_ERROR or timeout has occured (only in blocking mode).
 */
static ret_code_t twi_transfer(nrf_drv_twi_t const * const p_instance,
                               uint8_t                     address,
                               uint8_t const             * p_data,
                               uint32_t                    length,
                               bool                        xfer_pending,
                               bool                        is_tx)
{
    ASSERT(m_cb[p_instance-&amp;gt;instance_id].state == NRF_DRV_STATE_POWERED_ON);
    ASSERT(length &amp;gt; 0);

    volatile transfer_t * p_transfer = &amp;amp;(m_cb[p_instance-&amp;gt;instance_id].transfer);


    bool is_busy = false;
    CRITICAL_REGION_ENTER();
    if (p_transfer-&amp;gt;transfer_in_progress)
    {
        is_busy = true;
    }
    else
    {
        p_transfer-&amp;gt;transfer_in_progress = true;
    }
    CRITICAL_REGION_EXIT();
    if (is_busy)
    {
        return NRF_ERROR_BUSY;
    }

    p_transfer-&amp;gt;address         = address;
    p_transfer-&amp;gt;length          = (uint16_t)length;
    p_transfer-&amp;gt;p_data          = (uint8_t *)p_data;
    p_transfer-&amp;gt;count           = 0;
    p_transfer-&amp;gt;xfer_pending    = xfer_pending;
    p_transfer-&amp;gt;is_tx           = is_tx;
    p_transfer-&amp;gt;error_condition = false;

    state_machine(p_instance, p_transfer-&amp;gt;is_tx ? TX_ADDR_REQ : RX_ADDR_REQ);

    if (!m_handlers[p_instance-&amp;gt;instance_id])
    {
        // blocking mode
        sm_evt_t evt = p_transfer-&amp;gt;is_tx ? TX_DONE : RX_DONE;
        do
        {
            if (twi_action_wait(p_instance) == false)
            {
                nrf_twi_event_clear(p_instance-&amp;gt;p_reg, NRF_TWI_EVENTS_ERROR);
                evt = ON_ERROR;
            }
            nrf_twi_event_clear(p_instance-&amp;gt;p_reg, p_transfer-&amp;gt;end_event);
            state_machine(p_instance, evt);

            if (p_transfer-&amp;gt;error_condition)
            {
                p_transfer-&amp;gt;transfer_in_progress = false;
                return NRF_ERROR_INTERNAL;
            }
        }
        while (p_transfer-&amp;gt;count &amp;lt; p_transfer-&amp;gt;length);
        p_transfer-&amp;gt;transfer_in_progress = false;
    }
    return NRF_SUCCESS;
}


ret_code_t nrf_drv_twi_init(nrf_drv_twi_t const * const  p_instance,
                            nrf_drv_twi_config_t const * p_config,
                            nrf_drv_twi_evt_handler_t    event_handler)
{
    if (m_cb[p_instance-&amp;gt;instance_id].state != NRF_DRV_STATE_UNINITIALIZED)
    {
        return NRF_ERROR_INVALID_STATE;
    }

    if (p_config == NULL)
    {
        p_config = &amp;amp;m_default_config[p_instance-&amp;gt;instance_id];
    }


    m_handlers[p_instance-&amp;gt;instance_id]  = event_handler;
    m_instances[p_instance-&amp;gt;instance_id] = (nrf_drv_twi_t *)p_instance;

    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-&amp;gt;PIN_CNF[p_config-&amp;gt;scl] = SCL_PIN_CONF;
    NRF_GPIO-&amp;gt;PIN_CNF[p_config-&amp;gt;sda] = SDA_PIN_CONF;

    nrf_twi_frequency_set(p_instance-&amp;gt;p_reg, p_config-&amp;gt;frequency);
    nrf_twi_pins_set(p_instance-&amp;gt;p_reg, p_config-&amp;gt;scl, p_config-&amp;gt;sda);

    if (m_handlers[p_instance-&amp;gt;instance_id])
    {
        nrf_drv_common_irq_enable(p_instance-&amp;gt;irq, p_config-&amp;gt;interrupt_priority);
    }

    m_cb[p_instance-&amp;gt;instance_id].state = NRF_DRV_STATE_INITIALIZED;

    return NRF_SUCCESS;
}


void nrf_drv_twi_uninit(nrf_drv_twi_t const * const p_instance)
{
    ASSERT(m_cb[p_instance-&amp;gt;instance_id].state != NRF_DRV_STATE_UNINITIALIZED);

    if (m_handlers[p_instance-&amp;gt;instance_id])
    {
        nrf_drv_common_irq_disable(p_instance-&amp;gt;irq);
    }
    nrf_drv_twi_disable(p_instance);
    nrf_twi_shorts_clear(p_instance-&amp;gt;p_reg, DISABLE_MASK);

    m_cb[p_instance-&amp;gt;instance_id].state = NRF_DRV_STATE_UNINITIALIZED;
}


void nrf_drv_twi_enable(nrf_drv_twi_t const * const p_instance)
{
    ASSERT(m_cb[p_instance-&amp;gt;instance_id].state == NRF_DRV_STATE_INITIALIZED);

    nrf_twi_event_clear(p_instance-&amp;gt;p_reg, NRF_TWI_EVENTS_STOPPED);
    nrf_twi_event_clear(p_instance-&amp;gt;p_reg, NRF_TWI_EVENTS_RXDREADY);
    nrf_twi_event_clear(p_instance-&amp;gt;p_reg, NRF_TWI_EVENTS_TXDSENT);
    nrf_twi_event_clear(p_instance-&amp;gt;p_reg, NRF_TWI_EVENTS_ERROR);

    if (m_handlers[p_instance-&amp;gt;instance_id])
    {
        nrf_twi_int_enable(p_instance-&amp;gt;p_reg, NRF_TWI_INT_ERROR_MASK);
    }

    nrf_twi_enable(p_instance-&amp;gt;p_reg);
    m_cb[p_instance-&amp;gt;instance_id].state    = NRF_DRV_STATE_POWERED_ON;
    m_cb[p_instance-&amp;gt;instance_id].substate = NRF_DRV_TWI_SUBSTATE_IDLE;
}


void nrf_drv_twi_disable(nrf_drv_twi_t const * const p_instance)
{
    ASSERT(m_cb[p_instance-&amp;gt;instance_id].state != NRF_DRV_STATE_UNINITIALIZED);

    nrf_twi_task_set(p_instance-&amp;gt;p_reg, NRF_TWI_TASKS_STOP);
    nrf_twi_disable(p_instance-&amp;gt;p_reg);
    nrf_twi_int_disable(p_instance-&amp;gt;p_reg, DISABLE_MASK);
    m_cb[p_instance-&amp;gt;instance_id].state = NRF_DRV_STATE_INITIALIZED;
}


ret_code_t nrf_drv_twi_tx(nrf_drv_twi_t const * const p_instance,
                          uint8_t                     address,
                          uint8_t const *             p_data,
                          uint32_t                    length,
                          bool                        xfer_pending)
{
    return twi_transfer(p_instance, address,
                        p_data, length,
                        xfer_pending, true);
}


ret_code_t nrf_drv_twi_rx(nrf_drv_twi_t const * const p_instance,
                          uint8_t                     address,
                          uint8_t *                   p_data,
                          uint32_t                    length,
                          bool                        xfer_pending)
{
    return twi_transfer(p_instance, address,
                        p_data, length,
                        xfer_pending, false);
}


uint32_t nrf_drv_twi_data_count_get(nrf_drv_twi_t const * const p_instance)
{
    volatile transfer_t * p_transfer = &amp;amp;(m_cb[p_instance-&amp;gt;instance_id].transfer);

    return p_transfer-&amp;gt;count;
}


/**@brief Generic function for handling TWI interrupt
 *
 * @param[in]  p_reg         Pointer to instance register structure.
 * @param[in]  instance_id   Index of instance.
 */
__STATIC_INLINE void nrf_drv_twi_int_handler(NRF_TWI_Type * p_reg, uint32_t instance_id)
{
    volatile transfer_t * p_transfer = &amp;amp;(m_cb[instance_id].transfer);
    sm_evt_t sm_event;

    bool error_occured   = nrf_twi_event_check(p_reg, NRF_TWI_EVENTS_ERROR);
    bool end_evt_occured = nrf_twi_event_check(p_reg, p_transfer-&amp;gt;end_event);

    nrf_twi_event_clear(p_reg, NRF_TWI_EVENTS_ERROR);
    nrf_twi_event_clear(p_reg, NRF_TWI_EVENTS_TXDSENT);
    nrf_twi_event_clear(p_reg, NRF_TWI_EVENTS_RXDREADY);
    nrf_twi_event_clear(p_reg, NRF_TWI_EVENTS_STOPPED);

    if (error_occured || end_evt_occured)
    {
        if (error_occured)
        {
            sm_event = ON_ERROR;
        }
        else
        {
            sm_event = p_transfer-&amp;gt;is_tx ? TX_DONE : RX_DONE;
        }
        state_machine(m_instances[instance_id], sm_event);

        if (p_transfer-&amp;gt;error_condition)
        {
            p_transfer-&amp;gt;transfer_in_progress = false;
            nrf_drv_twi_evt_t evt =
            {
                .type               = NRF_DRV_TWI_ERROR,
                .p_data    = p_transfer-&amp;gt;p_data,
                .length    = p_transfer-&amp;gt;count,
                // Driver uses shortcuts, so NRF_TWI_ERROR_OVERRUN_NACK will not take place.
                .error_src = (nrf_twi_error_source_get(p_reg) &amp;amp;
                             NRF_TWI_ERROR_ADDRESS_NACK) ? NRF_TWI_ERROR_ADDRESS_NACK
                             : NRF_TWI_ERROR_DATA_NACK,
            };
            m_handlers[instance_id](&amp;amp;evt);
        }
        else if (p_transfer-&amp;gt;count &amp;gt;= p_transfer-&amp;gt;length)
        {
            p_transfer-&amp;gt;transfer_in_progress = false;
            nrf_drv_twi_evt_t evt =
            {
                .type   = p_transfer-&amp;gt;is_tx ? NRF_DRV_TWI_TX_DONE : NRF_DRV_TWI_RX_DONE,
                .p_data = p_transfer-&amp;gt;p_data,
                .length = p_transfer-&amp;gt;count,
            };
            m_handlers[instance_id](&amp;amp;evt);
        }
    }
}


#if (TWI0_ENABLED == 1)
void SPI0_TWI0_IRQHandler(void)
{
    nrf_drv_twi_int_handler(NRF_TWI0, TWI0_INSTANCE_INDEX);
}
#endif // (TWI0_ENABLED == 1)

#if (TWI1_ENABLED == 1)
void SPI1_TWI1_IRQHandler(void)
{
    nrf_drv_twi_int_handler(NRF_TWI1, TWI1_INSTANCE_INDEX);
}
#endif // (TWI1_ENABLED == 1)
enter code here
&lt;/code&gt;&lt;/pre&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I2C driver with soft device</title><link>https://devzone.nordicsemi.com/thread/106073?ContentTypeID=1</link><pubDate>Mon, 21 Dec 2015 14:06:20 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:507bb1dc-e5fd-4d3a-997d-292fcfe8bd62</guid><dc:creator>Johannes Lorenz</dc:creator><description>&lt;p&gt;Things happen ... glad to help and happy coding Your Johannes&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I2C driver with soft device</title><link>https://devzone.nordicsemi.com/thread/106061?ContentTypeID=1</link><pubDate>Mon, 21 Dec 2015 13:56:00 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:761dd595-da64-44ec-8674-3178e920aef8</guid><dc:creator>rushin</dc:creator><description>&lt;p&gt;no i didn&amp;#39;t. so its my mistake.thanks&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I2C driver with soft device</title><link>https://devzone.nordicsemi.com/thread/106055?ContentTypeID=1</link><pubDate>Mon, 21 Dec 2015 13:53:12 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:c55c2d02-f747-43b2-b890-45dd792f6ba8</guid><dc:creator>Johannes Lorenz</dc:creator><description>&lt;p&gt;In Keil -&amp;gt; Options for Target -&amp;gt; C/C++ -&amp;gt; Include Paths -&amp;gt; Folder Setup did you provide the paths to your .h files?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I2C driver with soft device</title><link>https://devzone.nordicsemi.com/thread/106051?ContentTypeID=1</link><pubDate>Mon, 21 Dec 2015 13:34:15 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:84743cf1-2dc5-47e9-b832-a4f0f4188c19</guid><dc:creator>rushin</dc:creator><description>&lt;p&gt;my tool chain is keil&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I2C driver with soft device</title><link>https://devzone.nordicsemi.com/thread/106048?ContentTypeID=1</link><pubDate>Mon, 21 Dec 2015 13:28:08 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:22adeea6-4aa2-403a-83c7-3d15e281d899</guid><dc:creator>Johannes Lorenz</dc:creator><description>&lt;p&gt;You have  &lt;code&gt;#include &amp;quot;nrf_drv_twi.h&amp;quot;&lt;/code&gt; in your source code? And you provided the include path to the &amp;quot;nrf_drv_twi.h&amp;quot; file in your toolchain? What is your toolchain, gcc, Keil?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I2C driver with soft device</title><link>https://devzone.nordicsemi.com/thread/106047?ContentTypeID=1</link><pubDate>Mon, 21 Dec 2015 13:15:44 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:a9810d4a-9eaf-468b-8388-2185f0229108</guid><dc:creator>rushin</dc:creator><description>&lt;p&gt;i have seen TWI example. i have interfaced different sensors bmp180,adxl345. its working. but i want to send this data on ble. when i am writing i2c driver in code 	but
my code says it can&amp;#39;t find nrf_drv_twi.h file&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I2C driver with soft device</title><link>https://devzone.nordicsemi.com/thread/106050?ContentTypeID=1</link><pubDate>Mon, 21 Dec 2015 12:13:16 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:a25ffbde-e0b5-4d33-ad0d-0be609879112</guid><dc:creator>Johannes Lorenz</dc:creator><description>&lt;p&gt;Have a look &lt;a href="https://devzone.nordicsemi.com/question/48894/hardware-twii2c-example/"&gt;here&lt;/a&gt; at the twi_simple_xxx example. The source is really clear and intuitive about how to establish a twi communication. HTH Johannes&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I2C driver with soft device</title><link>https://devzone.nordicsemi.com/thread/106052?ContentTypeID=1</link><pubDate>Mon, 21 Dec 2015 09:39:13 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:7231f245-b619-4f00-b110-62650e36a05e</guid><dc:creator>Sensors</dc:creator><description>&lt;p&gt;I would suggest looking at the TWI examples that are available.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: I2C driver with soft device</title><link>https://devzone.nordicsemi.com/thread/106049?ContentTypeID=1</link><pubDate>Mon, 21 Dec 2015 07:54:52 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:9d3a3ca2-837d-4184-9d98-744ae24f2b2c</guid><dc:creator>rushin</dc:creator><description>&lt;p&gt;Can anyone give me solution ? i can&amp;#39;t find&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>