Incorrect frames in non blocking TWI TX xfer

Hi,

I am using the non blocking TWI on the nrf 52840 with the following code:

void hal_drv_charger_set_current_768mA(void)
{   

    uint8_t frame[5] = {0x0F, 0xF0, 0x0F, 0xF0, 0x0F};
    
    // Transfer type
    m_hal_drv_charger.xfer.twi_xfer.type = NRF_DRV_TWI_XFER_TX;

    // Length 
    m_hal_drv_charger.xfer.twi_xfer.primary_length = 5;

    // Copy the frame pointer
    m_hal_drv_charger.xfer.twi_xfer.p_primary_buf = &frame[0];
    
    //nrf_delay_ms(100);

    // Add i2c xfer
    hal_drv_pwr_i2c_add_xfer(&m_hal_drv_charger.xfer);
}

The xfer is handled like this:

static void launch_xfer_state(void) {
    
    NRF_LOG_INFO("Launch xfer");

    //We are not in wait xfer state
    if(m_hal_drv_pwr_i2c.state != WAIT_XFER_PWR_I2C_ST)
    {

      // If the XFER queue contains XFERs
      if (!nrf_queue_is_empty(&pwr_i2c_xfer_queue)) 
      {

        // Get the XFER from the XFER queue
        if(nrf_queue_pop(&pwr_i2c_xfer_queue, &m_hal_drv_pwr_i2c.xfer) == NRF_SUCCESS)
        {

          if (m_hal_drv_pwr_i2c.xfer.twi_xfer.type == NRF_DRV_TWI_XFER_TXRX)
          { 
            //Catch the return data pointer
            preturn = m_hal_drv_pwr_i2c.xfer.twi_xfer.p_secondary_buf;
          }
          
          // Performs the XFER call on the PWR_I2C TWI instance
          memcpy(sent_buff, m_hal_drv_pwr_i2c.xfer.twi_xfer.p_primary_buf, 5);
          xfer_desc = m_hal_drv_pwr_i2c.xfer.twi_xfer;
          primary_length = m_hal_drv_pwr_i2c.xfer.twi_xfer.primary_length;
          //m_hal_drv_pwr_i2c.xfer.twi_xfer.primary_length = 4;

          NRF_LOG_INFO("First byte sent is : %d", sent_buff[0]);
          NRF_LOG_INFO("Second byte sent is : %d", sent_buff[1]);
          NRF_LOG_INFO("Third byte sent is : %d", sent_buff[2]);
          NRF_LOG_INFO("4 byte sent is : %d", sent_buff[3]);
          NRF_LOG_INFO("5 byte sent is : %d", sent_buff[4]);
          NRF_LOG_INFO("Frame length is : %d", primary_length);

          // Performs the XFER call on the PWR_I2C TWI instance
          result = nrf_drv_twi_xfer(&i2c_twi, &m_hal_drv_pwr_i2c.xfer.twi_xfer, 0);//NRF_DRV_TWI_FLAG_NO_XFER_EVT_HANDLER
          m_hal_drv_pwr_i2c.state = WAIT_XFER_PWR_I2C_ST;
          run_xfer_fsm();
        }

        else 
        {
        //error handler if you can't get the XFER from the XFER queue
        }

      }

      else //If the XFER queue is empty
      {
		  // Goes to IDLE state
		  m_hal_drv_pwr_i2c.state = IDLE_PWR_I2C_ST;
		  run_xfer_fsm();
      }

    }
	
    else //We are in wait state
    {
            //Do nothing
    }
}

TWI config is

static void init_state(void) {

    // On state transition
    if (m_hal_drv_pwr_i2c.state != m_hal_drv_pwr_i2c.prev_state) {

        // Set the entry phase done
        m_hal_drv_pwr_i2c.prev_state = m_hal_drv_pwr_i2c.state;

        // Initialize the TWI driver
        ret_code_t err_code = nrf_drv_twi_init(&i2c_twi, &i2c_twi_config, twi_event_handler, NULL);//twi_event_handler
        //herat
        APP_ERROR_CHECK(err_code);
        nrf_drv_twi_enable(&i2c_twi);

        // Reset the XFER queue
        nrf_queue_reset(&pwr_i2c_xfer_queue);

        // Goes to IDLE state
        m_hal_drv_pwr_i2c.state = IDLE_PWR_I2C_ST;
    }
}

and

static nrf_drv_twi_config_t i2c_twi_config =
{                                                                                
    .frequency          = (nrf_drv_twi_frequency_t)NRF_DRV_TWI_FREQ_100K, 
    .scl                = SCL_PWR_PIN,                                                    
    .sda                = SDA_PWR_PIN,                                                    
    .interrupt_priority = TWI_DEFAULT_CONFIG_IRQ_PRIORITY,                       
    .clear_bus_init     = TWI_DEFAULT_CONFIG_CLR_BUS_INIT,                       
    .hold_bus_uninit    = TWI_DEFAULT_CONFIG_HOLD_BUS_UNINIT,                    
};

The twi_event_handler is empty.

Here is what I see on RTT:

The result on oscilloscope is good for the first byte, but then its only 0 ..: (slave address is 0x6A):

Thanks

Related