This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

IIC forzen

When debugging IIC, it always crashes here. what is the problem。

nrfx_twim.c,line 441.

else
{
while (!nrf_twim_event_check(p_twim, evt_to_wait))//forzen here
{
if (nrf_twim_event_check(p_twim, NRF_TWIM_EVENT_ERROR))
{
NRFX_LOG_DEBUG("TWIM: Event: %s.", EVT_TO_STR_TWIM(NRF_TWIM_EVENT_ERROR));
nrf_twim_event_clear(p_twim, NRF_TWIM_EVENT_ERROR);
nrf_twim_task_trigger(p_twim, NRF_TWIM_TASK_RESUME);
nrf_twim_task_trigger(p_twim, NRF_TWIM_TASK_STOP);
evt_to_wait = NRF_TWIM_EVENT_STOPPED;
}
}

Parents
  • Hi,

    It is hard to say exactly what is causing this, but often it is related to the pins being used by other peripherals or similar.

    Can you check what is happening on the TWI bus with a logic analyzer?

    Which GPIOs are you using for SCL and SDA?

    Best regards,
    Jørgen

  • #define TWI_SDA2                			22   //touch/eeprom/oled Master SDA pin
    #define TWI_SCL2                			23   //touch/eeprom/oled Master SCL pin
    
    #define TWI_SCL1                			16   //IC/8563 Master SCL pin
    #define TWI_SDA1                			17   //IC/8563 Master SDA pin
    
    void bsp_iic1_master_init(void)
    {
    	ret_code_t ret;
    
    	uint32_t *twim1_power = (uint32_t *)(NRF_TWIM0_BASE+0xFFC);
    
    	*twim1_power = 0;	//turn off TWIM0
    
    	*(volatile uint32_t *)twim1_power;	  //wait for register to be written (CPU runs faster than the peripherals)
    
    	*twim1_power = 1;	//turn on TWIM0
    	
    	const nrf_drv_twi_config_t config =
    	{
    	   .scl 			   = TWI_SCL1,
    	   .sda 			   = TWI_SDA1,
    	   .frequency		   = NRF_TWI_FREQ_100K,
    	   .interrupt_priority = APP_IRQ_PRIORITY_HIGH,
    	   .clear_bus_init	   = true,
    	};
    
    	ret = nrf_drv_twi_init(&m_twi_master1, &config, NULL, NULL);
    
    	if (NRF_SUCCESS == ret)
    	{
    		nrf_drv_twi_enable(&m_twi_master1);
    	}
    	else
    	{
    		APP_ERROR_CHECK(ret);
    	}
    	
    }
    
    void bsp_iic2_master_init(void)
    {
    	ret_code_t ret;
    
    	uint32_t *twim2_power = (uint32_t *)(NRF_TWIM1_BASE+0xFFC);
    
    	*twim2_power = 0;	//turn off TWIM0
    
    	*(volatile uint32_t *)twim2_power;	  //wait for register to be written (CPU runs faster than the peripherals)
    
    	*twim2_power = 1;	//turn on TWIM0
    	
    	const nrf_drv_twi_config_t config =
    	{
    	   .scl 			   = TWI_SCL2,
    	   .sda 			   = TWI_SDA2,
    	   .frequency		   = NRF_TWI_FREQ_100K,
    	   .interrupt_priority = APP_IRQ_PRIORITY_HIGH,
    	   .clear_bus_init	   = true,
    	};
    
    	ret = nrf_drv_twi_init(&m_twi_master2, &config, NULL, NULL);
    
    	if (NRF_SUCCESS == ret)
    	{
    		nrf_drv_twi_enable(&m_twi_master2);
    	}
    	else
    	{
    		APP_ERROR_CHECK(ret);
    	}
    	
    }
    

Reply
  • #define TWI_SDA2                			22   //touch/eeprom/oled Master SDA pin
    #define TWI_SCL2                			23   //touch/eeprom/oled Master SCL pin
    
    #define TWI_SCL1                			16   //IC/8563 Master SCL pin
    #define TWI_SDA1                			17   //IC/8563 Master SDA pin
    
    void bsp_iic1_master_init(void)
    {
    	ret_code_t ret;
    
    	uint32_t *twim1_power = (uint32_t *)(NRF_TWIM0_BASE+0xFFC);
    
    	*twim1_power = 0;	//turn off TWIM0
    
    	*(volatile uint32_t *)twim1_power;	  //wait for register to be written (CPU runs faster than the peripherals)
    
    	*twim1_power = 1;	//turn on TWIM0
    	
    	const nrf_drv_twi_config_t config =
    	{
    	   .scl 			   = TWI_SCL1,
    	   .sda 			   = TWI_SDA1,
    	   .frequency		   = NRF_TWI_FREQ_100K,
    	   .interrupt_priority = APP_IRQ_PRIORITY_HIGH,
    	   .clear_bus_init	   = true,
    	};
    
    	ret = nrf_drv_twi_init(&m_twi_master1, &config, NULL, NULL);
    
    	if (NRF_SUCCESS == ret)
    	{
    		nrf_drv_twi_enable(&m_twi_master1);
    	}
    	else
    	{
    		APP_ERROR_CHECK(ret);
    	}
    	
    }
    
    void bsp_iic2_master_init(void)
    {
    	ret_code_t ret;
    
    	uint32_t *twim2_power = (uint32_t *)(NRF_TWIM1_BASE+0xFFC);
    
    	*twim2_power = 0;	//turn off TWIM0
    
    	*(volatile uint32_t *)twim2_power;	  //wait for register to be written (CPU runs faster than the peripherals)
    
    	*twim2_power = 1;	//turn on TWIM0
    	
    	const nrf_drv_twi_config_t config =
    	{
    	   .scl 			   = TWI_SCL2,
    	   .sda 			   = TWI_SDA2,
    	   .frequency		   = NRF_TWI_FREQ_100K,
    	   .interrupt_priority = APP_IRQ_PRIORITY_HIGH,
    	   .clear_bus_init	   = true,
    	};
    
    	ret = nrf_drv_twi_init(&m_twi_master2, &config, NULL, NULL);
    
    	if (NRF_SUCCESS == ret)
    	{
    		nrf_drv_twi_enable(&m_twi_master2);
    	}
    	else
    	{
    		APP_ERROR_CHECK(ret);
    	}
    	
    }
    

Children
No Data
Related