How to reduce the power consumption of the 9160‘s modem?

I am using 9160 to develop a customer's product, which needs to reduce power consumption as much as possible to prolong the battery life of the product. I know that 9160 communicates with the modem through the default UART0. My product design uses UART2 to communicate with a peripheral.  Setting UART2 to DEVICE_PM_LOW_POWER_STATE alone reduces the current by only about 30uA, whereas setting Uart0 to DEVICE_PM_LOW_POWER_STATE reduces the current by almost 500uA. What I can't understand is,  In fact, the GPIO pin mapped to UART0 is not connected to any line, why do you need to set the low power state to reduce power consumption?  

#define MODEM_DEV		"UART_0"
#define BLE_DEV			"UART_2"

	uart_ble = device_get_binding(BLE_DEV);
	if(!uart_ble)
	{
	#ifdef UART_DEBUG
		LOGD("Could not get %s device", BLE_DEV);
	#endif
		return;
	}

	uart_modem = device_get_binding(MODEM_DEV);
	if(!uart_modem)
	{
	#ifdef UART_DEBUG
		LOGD("Could not get %s device", uart_modem);
	#endif
		return;
	}
	
void uart_sleep_out(void)
{
#ifdef CONFIG_DEVICE_POWER_MANAGEMENT
	if(k_timer_remaining_get(&uart_sleep_in_timer) > 0)
		k_timer_stop(&uart_sleep_in_timer);
	k_timer_start(&uart_sleep_in_timer, K_SECONDS(UART_WAKE_HOLD_TIME_SEC), NULL);

	if(uart_is_waked)
		return;

#if 1	
	device_set_power_state(uart_ble, DEVICE_PM_ACTIVE_STATE, NULL, NULL);
	uart_irq_rx_enable(uart_ble);
	uart_irq_tx_enable(uart_ble);
	k_sleep(K_MSEC(10));
#else
	device_set_power_state(uart_modem, DEVICE_PM_ACTIVE_STATE, NULL, NULL);
	uart_irq_rx_enable(uart_modem);
	uart_irq_tx_enable(uart_modem);
	k_sleep(K_MSEC(10));
#endif	
	
	uart_is_waked = true;

#ifdef UART_DEBUG
	LOGD("uart set active success!");
#endif
#endif
}

void uart_sleep_in(void)
{
#ifdef CONFIG_DEVICE_POWER_MANAGEMENT
	if(!uart_is_waked)
		return;

#if 1	
	uart_irq_rx_disable(uart_ble);
	uart_irq_tx_disable(uart_ble);
	device_set_power_state(uart_ble, DEVICE_PM_LOW_POWER_STATE, NULL, NULL);
	k_sleep(K_MSEC(10));
#else
	uart_irq_rx_disable(uart_modem);
	uart_irq_tx_disable(uart_modem);
	device_set_power_state(uart_modem, DEVICE_PM_LOW_POWER_STATE, NULL, NULL);
	k_sleep(K_MSEC(10));
#endif
	
	uart_is_waked = false;

#ifdef UART_DEBUG
	LOGD("uart set low power success!");
#endif
#endif
}

Parents
  • Hello,

    My product design uses UART2 to communicate with a peripheral. 

    I’m not quite sure if I fully have understood your setup yet.

    I know that 9160 communicates with the modem through the default UART0.

    The application core of the nRF9160 does not communicate with the modem via uart0. This is done via a shared memory area using the modem library, as described here. Do you run the application on a nRF9160 or another device, which communicates with the nRF9160 via uart0?

    In fact, the GPIO pin mapped to UART0 is not connected to any line, why do you need to set the low power state to reduce power consumption?  

    The UART peripheral is powered by the HFCLK clock controller and not the peripheral itself. So if pins are assigned to uart0 doesn’t really matter, as long as the peripheral is enabled in the devicetree.

    Regards,

    Markus

  • Sorry, I didn't make it clear. I mean, I connected a sensor using Uart2.

    Do you mean 9160 does not need to use UART0 to communicate with modem?  However, previous tests showed that I did receive some log output about the network from UART0 while connecting to the network.  The test results also show that if I set uART0 to low power, the power of the product does go down, which is very strange!  The SDK version I am currently using is NCS1.2.0  

Reply Children
No Data
Related