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 Reply Children
  • #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?

Related