I2C TWI

signed char BNO055_I2C_bus_read(unsigned char dev_addr,unsigned char reg_addr, unsigned char *reg_data, unsigned char cnt)
{
BNO055_RETURN_FUNCTION_TYPE comres = BNO055_ZERO_U8X;
I2C.beginTransmission(dev_addr); //Start of transmission
I2C.write(reg_addr); //Desired start register
comres = I2C.endTransmission(); //Stop of transmission
delayMicroseconds(150); //Caution Delay
I2C.requestFrom(dev_addr, cnt); //Request data
while(I2C.available()) //The slave device may send less than requested (burst read)
{
*reg_data = I2C.read(); //Receive a byte
reg_data++; //Increment pointer
}
return comres;
}


signed char BNO055_I2C_bus_write(unsigned char dev_addr,unsigned char reg_addr, unsigned char *reg_data, unsigned char cnt)
{
BNO055_RETURN_FUNCTION_TYPE comres = BNO055_ZERO_U8X;
I2C.beginTransmission(dev_addr); //Start of transmission
I2C.write(reg_addr); //Desired start register
for(unsigned char index = 0; index < cnt; index++) //Note that the BNO055 supports burst write
{
I2C.write(*reg_data); //Write the data
reg_data++; //Increment pointer
}
comres = I2C.endTransmission(); //Stop of transmission
delayMicroseconds(150); //Caution Delay
return comres;
}

The above code is for arduino i2c  and I want to translate it for nrf52840 twi. Need help

Parents
  • Hi, you should start out with an I2C sample from the SDK, to see how it works, and then do the necessary modifications.

    If you are using the nRF5 SDK, you can start with this sample: https://infocenter.nordicsemi.com/topic/sdk_nrf5_v17.1.0/twi_sensor_example.html?cp=8_1_4_6_43

    For Zephyr, you can probably start with one of the sensor applications that uses I2C: http://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/zephyr/samples/sensor/sensor.html

  • #define TWI_INSTANCE_ID 0 // create a ID constant

    static volatile bool m_xfer_done = false;


    static const nrf_drv_twi_t m_twi = NRF_DRV_TWI_INSTANCE(TWI_INSTANCE_ID);

    void twi_handler(nrf_drv_twi_evt_t const* p_event, void * p_context)
    {
    switch (p_event-> type)
    {
    case NRF_DRV_TWI_EVT_DONE:
    break;

    m_xfer_done = true;
    break;

    default:
    break;
    }
    }

    // a function to initialize the twi(i2c)
    void twi_master_init(void)
    {
    ret_code_t err_code; 


    const nrf_drv_twi_config_t twi_config = {
    .scl = 27, 
    .sda = 26 ,
    .frequency = NRF_DRV_TWI_FREQ_100K, 
    .interrupt_priority = APP_IRQ_PRIORITY_HIGH, 
    .clear_bus_init = false 

    err_code = nrf_drv_twi_init(&m_twi, &twi_config, NULL, NULL); 


    APP_ERROR_CHECK(err_code);
    nrf_drv_twi_enable(&m_twi); 
    }

    s8 BNO055_I2C_bus_write(u8 dev_addr, u8 reg_addr, u8 *reg_data, u8 cnt)
    {

    ret_code_t err_code;
    s32 BNO055_iERROR = BNO055_ZERO_U8X;
    u8 array[I2C_BUFFER_LEN];
    u8 stringpos = BNO055_ZERO_U8X;
    m_xfer_done = false;
    array[BNO055_ZERO_U8X] = reg_addr;

    err_code =nrf_drv_twi_tx(&m_twi, BNO055_I2C_ADDR1,array,I2C_BUFFER_LEN,false );

    while (m_xfer_done == false)
    {
    }

    if (NRF_SUCCESS != err_code)
    {
    return false;
    }

    for (stringpos = BNO055_ZERO_U8X; stringpos < cnt; stringpos++)
    {
    array[stringpos + BNO055_I2C_BUS_WRITE_ARRAY_INDEX] = *(reg_data + stringpos);
    }
    }


    s8 BNO055_I2C_bus_read(u8 dev_addr, u8 reg_addr, u8 *reg_data, u8 cnt)
    {
    ret_code_t err_code;

    m_xfer_done = false;
    s32 BNO055_iERROR = BNO055_ZERO_U8X;
    u8 array[I2C_BUFFER_LEN] = { BNO055_ZERO_U8X };
    u8 stringpos = BNO055_ZERO_U8X;

    array[BNO055_ZERO_U8X] = reg_addr;

    err_code= nrf_drv_twi_tx(&m_twi, BNO055_I2C_ADDR1, array, 1, true );

    while (m_xfer_done == false)
    {}
    if (NRF_SUCCESS != err_code)
    {
    return false;
    }
    m_xfer_done=false;

    err_code=nrf_drv_twi_rx (&m_twi,BNO055_I2C_ADDR1,reg_data, cnt);
    while (m_xfer_done == false)
    {}
    if (NRF_SUCCESS != err_code)
    {
    return false;
    }
    for (stringpos = BNO055_ZERO_U8X; stringpos < cnt; stringpos++)
    {
    *(reg_data + stringpos) = array[stringpos];
    }

    return (s8)BNO055_iERROR;
    }

    Is this one correct?

Reply
  • #define TWI_INSTANCE_ID 0 // create a ID constant

    static volatile bool m_xfer_done = false;


    static const nrf_drv_twi_t m_twi = NRF_DRV_TWI_INSTANCE(TWI_INSTANCE_ID);

    void twi_handler(nrf_drv_twi_evt_t const* p_event, void * p_context)
    {
    switch (p_event-> type)
    {
    case NRF_DRV_TWI_EVT_DONE:
    break;

    m_xfer_done = true;
    break;

    default:
    break;
    }
    }

    // a function to initialize the twi(i2c)
    void twi_master_init(void)
    {
    ret_code_t err_code; 


    const nrf_drv_twi_config_t twi_config = {
    .scl = 27, 
    .sda = 26 ,
    .frequency = NRF_DRV_TWI_FREQ_100K, 
    .interrupt_priority = APP_IRQ_PRIORITY_HIGH, 
    .clear_bus_init = false 

    err_code = nrf_drv_twi_init(&m_twi, &twi_config, NULL, NULL); 


    APP_ERROR_CHECK(err_code);
    nrf_drv_twi_enable(&m_twi); 
    }

    s8 BNO055_I2C_bus_write(u8 dev_addr, u8 reg_addr, u8 *reg_data, u8 cnt)
    {

    ret_code_t err_code;
    s32 BNO055_iERROR = BNO055_ZERO_U8X;
    u8 array[I2C_BUFFER_LEN];
    u8 stringpos = BNO055_ZERO_U8X;
    m_xfer_done = false;
    array[BNO055_ZERO_U8X] = reg_addr;

    err_code =nrf_drv_twi_tx(&m_twi, BNO055_I2C_ADDR1,array,I2C_BUFFER_LEN,false );

    while (m_xfer_done == false)
    {
    }

    if (NRF_SUCCESS != err_code)
    {
    return false;
    }

    for (stringpos = BNO055_ZERO_U8X; stringpos < cnt; stringpos++)
    {
    array[stringpos + BNO055_I2C_BUS_WRITE_ARRAY_INDEX] = *(reg_data + stringpos);
    }
    }


    s8 BNO055_I2C_bus_read(u8 dev_addr, u8 reg_addr, u8 *reg_data, u8 cnt)
    {
    ret_code_t err_code;

    m_xfer_done = false;
    s32 BNO055_iERROR = BNO055_ZERO_U8X;
    u8 array[I2C_BUFFER_LEN] = { BNO055_ZERO_U8X };
    u8 stringpos = BNO055_ZERO_U8X;

    array[BNO055_ZERO_U8X] = reg_addr;

    err_code= nrf_drv_twi_tx(&m_twi, BNO055_I2C_ADDR1, array, 1, true );

    while (m_xfer_done == false)
    {}
    if (NRF_SUCCESS != err_code)
    {
    return false;
    }
    m_xfer_done=false;

    err_code=nrf_drv_twi_rx (&m_twi,BNO055_I2C_ADDR1,reg_data, cnt);
    while (m_xfer_done == false)
    {}
    if (NRF_SUCCESS != err_code)
    {
    return false;
    }
    for (stringpos = BNO055_ZERO_U8X; stringpos < cnt; stringpos++)
    {
    *(reg_data + stringpos) = array[stringpos];
    }

    return (s8)BNO055_iERROR;
    }

    Is this one correct?

Children
No Data
Related