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