Hello,
I’m working with a combination of nRF5340 + nRF7002 + NPM1300,
and I’ve only changed the I2C pins connected to the NPM1300 to sda pgio1.4 and scl gpio1.6.
-
SDK version: v3.0.2
-
Toolchain version: v3.0.2
-
Board target: nrf7002dk/nrf5340/cpuapp
In the fuel_gauge example, under the same conditions,
I confirmed that the device works normally by only adding the following to the nrf7002dk_nrf5340_cpuapp.overlay file:
/ {
gpio_fwd: nrf-gpio-forwarder {
compatible = "nordic,nrf-gpio-forwarder";
status = "disabled";
uart {
status = "disabled";
};
};
};
However, when applying the same changes to the ble_coex example, it does not work and I get the error "Pmic device not ready."
The only change made to the ble_coex example was the addition of Wi-Fi FOTA via HTTP.
I would appreciate any help.
CMakeLists.txt
#
# Copyright (c) 2022 Nordic Semiconductor ASA
#
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
#
cmake_minimum_required(VERSION 3.20.0)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(Algo_SC50_rev0)
set(gen_dir ${CMAKE_CURRENT_BINARY_DIR}/certs)
zephyr_include_directories(${gen_dir})
generate_inc_file_for_target(
app
cert/AmazonRootCA1.pem
${gen_dir}/AmazonRootCA1.pem.inc
)
target_sources(app PRIVATE
# src/bt_throughput_test.c
src/main.c
src/Algo/wifi_socket.c
src/Algo/ble.c
src/Algo/adc.c
src/Algo/fuel_gauge.c
)
# For net_private.h
target_include_directories(app PUBLIC
${ZEPHYR_BASE}/subsys/net/ip
)
zephyr_library_include_directories(${ZEPHYR_BASE}/samples/bluetooth)
#####
# add_custom_command(
# OUTPUT ${CMAKE_BINARY_DIR}/zephyr/merged_update.bin
# COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/merge_bin.py
# ${CMAKE_BINARY_DIR}/../signed_by_mcuboot_and_b0_hci_ipc.bin
# ${CMAKE_BINARY_DIR}/zephyr/zephyr.signed.bin
# ${CMAKE_BINARY_DIR}/zephyr/merged_update.bin
# DEPENDS
# ${CMAKE_BINARY_DIR}/../signed_by_mcuboot_and_b0_hci_ipc.bin
# ${CMAKE_BINARY_DIR}/zephyr/zephyr.signed.bin
# COMMENT "Generating merged_update.bin for FOTA"
# VERBATIM
# )
# add_custom_target(
# generate_merged_bin ALL
# DEPENDS ${CMAKE_BINARY_DIR}/zephyr/merged_update.bin
# )
set(MCUBOOT_IMAGE_VERSION "1.2.3")prj.conf
# # Copyright (c) 2022 Nordic Semiconductor ASA # # SPDX-License-Identifier: LicenseRef-Nordic-5-Clause # CONFIG_WIFI=y CONFIG_WIFI_NRF70=y CONFIG_NRF70_SR_COEX=n CONFIG_NRF70_SR_COEX_RF_SWITCH=n # WPA supplicant CONFIG_WIFI_NM_WPA_SUPPLICANT=y # Networking CONFIG_NETWORKING=y CONFIG_NET_SOCKETS=y CONFIG_NET_LOG=y CONFIG_NET_IPV4=y CONFIG_NET_UDP=y CONFIG_NET_TCP=y CONFIG_NET_DHCPV4=y CONFIG_NET_IF_UNICAST_IPV4_ADDR_COUNT=2 CONFIG_NET_MAX_CONTEXTS=8 CONFIG_NET_CONTEXT_SYNC_RECV=y CONFIG_INIT_STACKS=y CONFIG_NET_L2_ETHERNET=y CONFIG_NET_CONFIG_SETTINGS=y CONFIG_NET_CONFIG_INIT_TIMEOUT=0 CONFIG_NET_SOCKETS_POLL_MAX=10 CONFIG_NET_BUF_FIXED_DATA_SIZE=y CONFIG_NET_BUF_DATA_SIZE=256 CONFIG_NET_TCP_WORKQ_STACK_SIZE=2048 # Memories CONFIG_MAIN_STACK_SIZE=4096 CONFIG_NET_TX_STACK_SIZE=2048 CONFIG_NET_RX_STACK_SIZE=2048 # Debugging CONFIG_STACK_SENTINEL=y CONFIG_DEBUG_COREDUMP=y CONFIG_DEBUG_COREDUMP_BACKEND_LOGGING=y CONFIG_DEBUG_COREDUMP_MEMORY_DUMP_MIN=y # Kernel options CONFIG_ENTROPY_GENERATOR=y # Logging CONFIG_LOG=y CONFIG_PRINTK=n CONFIG_POSIX_CLOCK=y CONFIG_USE_SEGGER_RTT=y CONFIG_RTT_CONSOLE=y CONFIG_LOG_MODE_IMMEDIATE=y CONFIG_UART_CONSOLE=n # Benchmarking CONFIG_NET_ZPERF=y CONFIG_ZVFS_OPEN_MAX=16 # Optimized networking settings for performance CONFIG_NET_TC_TX_COUNT=1 CONFIG_NET_PKT_RX_COUNT=8 CONFIG_NET_PKT_TX_COUNT=8 CONFIG_NET_BUF_RX_COUNT=10 CONFIG_NET_BUF_TX_COUNT=10 CONFIG_HEAP_MEM_POOL_SIZE=20480 CONFIG_NRF_WIFI_CTRL_HEAP_SIZE=20000 CONFIG_NRF70_RX_NUM_BUFS=20 CONFIG_NRF70_MAX_TX_AGGREGATION=6 CONFIG_NRF_WIFI_DATA_HEAP_SIZE=96000 CONFIG_WIFI_CREDENTIALS=y CONFIG_WIFI_CREDENTIALS_STATIC=y CONFIG_WIFI_CREDENTIALS_STATIC_SSID="algorigo_tp5G" CONFIG_WIFI_CREDENTIALS_STATIC_PASSWORD="dkfrhflrh24223#" # CONFIG_NET_CONFIG_MY_IPV4_ADDR="192.168.0.8" CONFIG_NET_CONFIG_PEER_IPV4_ADDR="192.168.1.242" CONFIG_NET_CONFIG_MY_IPV4_ADDR="192.168.1.99" CONFIG_NET_CONFIG_MY_IPV4_NETMASK="255.255.255.0" CONFIG_NET_CONFIG_MY_IPV4_GW="192.168.1.1" # DUT zperf configuration CONFIG_WIFI_ZPERF_PROT_UDP=y CONFIG_WIFI_ZPERF_PKT_SIZE=1024 CONFIG_WIFI_ZPERF_RATE=10000 CONFIG_WIFI_ZPERF_SERVER=n CONFIG_BT_DEVICE_NAME="SC50" CONFIG_BT=y CONFIG_BT_SMP=y CONFIG_BT_PERIPHERAL=y CONFIG_BT_CENTRAL=n CONFIG_BT_MAX_CONN=1 CONFIG_BT_SCAN=n CONFIG_BT_SCAN_FILTER_ENABLE=n # CONFIG_BT_SCAN_UUID_CNT=1 CONFIG_BT_GATT_CLIENT=n CONFIG_BT_GATT_DM=n CONFIG_BT_THROUGHPUT=y CONFIG_BT_USER_DATA_LEN_UPDATE=y CONFIG_BT_USER_PHY_UPDATE=y CONFIG_BT_GAP_AUTO_UPDATE_CONN_PARAMS=n CONFIG_BT_BUF_ACL_RX_SIZE=502 CONFIG_BT_ATT_PREPARE_COUNT=2 CONFIG_BT_CONN_TX_MAX=10 CONFIG_BT_L2CAP_TX_BUF_COUNT=10 CONFIG_BT_L2CAP_TX_MTU=498 CONFIG_BT_BUF_ACL_TX_SIZE=502 CONFIG_BT_L2CAP_DYNAMIC_CHANNEL=y CONFIG_DK_LIBRARY=y CONFIG_DK_LIBRARY_DYNAMIC_BUTTON_HANDLERS=y CONFIG_NRF70_MAX_TX_PENDING_QLEN=12 CONFIG_NRF70_QSPI_LOW_POWER=n #Added to fix BLE crash in coex enable cases. CONFIG_NRF_RPC=n CONFIG_NRF_RPC_CBOR=n # CONFIG_MBEDTLS_HEAP_SIZE=1024 CONFIG_MBEDTLS_HEAP_SIZE=65536 #--------------------------------------------------------- CONFIG_GPIO=y CONFIG_SPI=y CONFIG_SPI_NRFX=y CONFIG_SPI_NOR=y CONFIG_SPI_NOR_SFDP_DEVICETREE=y CONFIG_SPI_NOR_FLASH_LAYOUT_PAGE_SIZE=4096 CONFIG_NORDIC_QSPI_NOR=n CONFIG_FLASH=y CONFIG_FLASH_MAP=y CONFIG_IMG_MANAGER=y CONFIG_MCUBOOT_IMG_MANAGER=y CONFIG_PARTITION_MANAGER_ENABLED=y CONFIG_DFU_TARGET=y CONFIG_STREAM_FLASH=y CONFIG_IMG_ERASE_PROGRESSIVELY=y CONFIG_HTTP_PARSER_URL=y ## 250722 CONFIG_BOOTLOADER_MCUBOOT=y CONFIG_UPDATEABLE_IMAGE_NUMBER=2 CONFIG_MCUBOOT_BOOTUTIL_LIB=y CONFIG_REBOOT=y CONFIG_FOTA_DOWNLOAD=y CONFIG_NET_SOCKETS_SOCKOPT_TLS=y CONFIG_NRF_SECURITY=y CONFIG_TLS_CREDENTIALS=y CONFIG_TLS_CREDENTIALS_BACKEND_PROTECTED_STORAGE=y CONFIG_MBEDTLS=y CONFIG_MBEDTLS_ENABLE_HEAP=y CONFIG_MBEDTLS_RSA_C=y CONFIG_MBEDTLS_DHM_C=y CONFIG_MBEDTLS_TLS_LIBRARY=y CONFIG_MBEDTLS_SSL_SERVER_NAME_INDICATION=y CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048 CONFIG_DOWNLOADER=y CONFIG_NET_IPV6=n CONFIG_DNS_RESOLVER=y CONFIG_DNS_SERVER_IP_ADDRESSES=y CONFIG_DNS_SERVER1="8.8.8.8" CONFIG_DOWNLOADER_STACK_SIZE=4096 CONFIG_DOWNLOAD_CLIENT_STACK_SIZE=4096 CONFIG_HTTP_CLIENT=y CONFIG_PCD=y CONFIG_PCD_APP=y CONFIG_PCD_NET=y CONFIG_DFU_TARGET_STREAM=y CONFIG_BOOTLOADER_MCUBOOT=y CONFIG_DFU_TARGET_MCUBOOT=y CONFIG_DFU_MULTI_IMAGE=n # CONFIG_SUIT_DFU_CANDIDATE_PROCESSING_LEVEL=y # CONFIG_SUIT_DFU_CANDIDATE_PROCESSING_FULL=y # CONFIG_SUIT_DFU_CANDIDATE_PROCESSING_PUSH_TO_CACHE=y # Enable PINCTRL CONFIG_PINCTRL=y CONFIG_ADC=y ## npm1300 CONFIG_SHELL=y CONFIG_REGULATOR=y CONFIG_SENSOR=y CONFIG_I2C_SHELL=y CONFIG_NRF_FUEL_GAUGE=y CONFIG_NRF_FUEL_GAUGE_VARIANT_SECONDARY_CELL=y CONFIG_REQUIRES_FLOAT_PRINTF=y # CONFIG_GPIO_NPM1300=y # CONFIG_LED_NPM1300=y # CONFIG_MFD_NPM1300=y # CONFIG_NPM1300_CHARGER=y # CONFIG_REGULATOR_NPM1300=y # CONFIG_WDT_NPM1300=y CONFIG_LED=y # CONFIG_I2C=y # CONFIG_I2C_NRFX=y # CONFIG_SENSOR_SHELL=y # CONFIG_REGULATOR_SHELL=y # CONFIG_NRFX_TWIM1=y CONFIG_PWM=y
sysbuild.conf
# # Copyright (c) 2024 Nordic Semiconductor ASA # # SPDX-License-Identifier: LicenseRef-Nordic-5-Clause # SB_CONFIG_WIFI_NRF70=y SB_CONFIG_BOOTLOADER_MCUBOOT=y SB_CONFIG_SECURE_BOOT_NETCORE=y # Needed for FOTA for nRF5340 and TF-M SB_CONFIG_MCUBOOT_USE_ALL_AVAILABLE_RAM=y # External flash configurations SB_CONFIG_PM_EXTERNAL_FLASH_MCUBOOT_SECONDARY=y SB_CONFIG_PM_OVERRIDE_EXTERNAL_DRIVER_CHECK=y SB_CONFIG_MCUBOOT_UPDATEABLE_IMAGES=2 SB_CONFIG_MCUBOOT_NRF53_MULTI_IMAGE_UPDATE=y SB_CONFIG_NETCORE_APP_UPDATE=y # Net 이미지 빌드 SB_CONFIG_NETCORE_HCI_IPC=y # IPC 채널 SB_CONFIG_DFU_MULTI_IMAGE_PACKAGE_BUILD=y SB_CONFIG_DFU_MULTI_IMAGE_PACKAGE_APP=y SB_CONFIG_DFU_MULTI_IMAGE_PACKAGE_NET=y # SB_CONFIG_DFU_MULTI_IMAGE_PACKAGE_MCUBOOT=y # SB_CONFIG_DFU_MULTI_IMAGE_PACKAGE_WIFI_FW_PATCH=y # SB_CONFIG_SUIT_MULTI_IMAGE_PACKAGE_BUILD=y
nrf7002dk_nrf5340_cpuapp.overlay
// To get started, press Ctrl+Space to bring up the completion menu and view the available nodes.
// You can also use the buttons in the sidebar to perform actions on nodes.
// Actions currently available include:
// * Enabling / disabling the node
// * Adding the bus to a bus
// * Removing the node
// * Connecting ADC channels
// For more help, browse the DeviceTree documentation at https://docs.zephyrproject.org/latest/guides/dts/index.html
// You can also visit the nRF DeviceTree extension documentation at https://docs.nordicsemi.com/bundle/nrf-connect-vscode/page/guides/ncs_configure_app.html#devicetree-support-in-the-extension
/ {
chosen {
// zephyr,bt-hci = &bt_hci_ipc0;
// nordic,802154-spinel-ipc = &ipc0;
// zephyr,ieee802154 = &ieee802154;
nordic,pm-ext-flash = &mx25r64;
};
gpio_fwd: nrf-gpio-forwarder {
compatible = "nordic,nrf-gpio-forwarder";
status = "disabled";
uart {
status = "disabled";
};
};
zephyr,user {
io-channels = <&adc 0>;
DT1-gpios = <&gpio1 11 0>;
DT2-gpios = <&gpio1 13 0>;
DT3-gpios = <&gpio0 7 0>;
DT4-gpios = <&gpio0 25 0>;
MOTOR_POWER_EN-gpios = <&gpio1 0 0>;
// MOTOR_PWM-gpios = <&gpio0 2 0>;
pwms = <&pwm0 0 20 PWM_POLARITY_NORMAL>;
};
buttons {
compatible = "gpio-keys";
button0: button_0 {
gpios = <&gpio1 8 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
label = "Push button 1";
zephyr,code = <INPUT_KEY_0>;
};
button1: button_1 {
status = "disabled";
};
};
/* These aliases are provided for compatibility with samples */
// aliases {
// pwm-led0 = &pwm_led0;
// sw0 = &button0;
// bootloader-led0 = &led0;
// mcuboot-button0 = &button0;
// mcuboot-led0 = &led0;
// watchdog0 = &wdt0;
// };
};
&pinctrl {
pwm0_default: pwm0_default {
group1 {
psels = <NRF_PSEL(PWM_OUT0, 1, 2)>;
// nordic,invert;
};
};
pwm0_sleep: pwm0_sleep {
group1 {
psels = <NRF_PSEL(PWM_OUT0, 1, 2)>;
low-power-enable;
};
};
spi0_default: spi0_default {
group1 {
psels = <NRF_PSEL(SPIM_SCK, 1, 12)>, /* SPI SCK 핀 */
<NRF_PSEL(SPIM_MOSI, 0, 31)>, /* SPI MOSI 핀 */
<NRF_PSEL(SPIM_MISO, 1, 1)>; /* SPI MISO 핀 */
};
};
spi0_sleep: spi0_sleep {
group1 {
psels = <NRF_PSEL(SPIM_SCK, 1, 12)>, /* SPI SCK 핀 */
<NRF_PSEL(SPIM_MOSI, 0, 31)>, /* SPI MOSI 핀 */
<NRF_PSEL(SPIM_MISO, 1, 1)>; /* SPI MISO 핀 */
low-power-enable;
};
};
i2c1_default: i2c1_default {
group1 {
bias-pull-up;
psels = <NRF_PSEL(TWIM_SCL, 1, 6)>,
<NRF_PSEL(TWIM_SDA, 1, 4)>;
};
};
i2c1_sleep: i2c1_sleep {
group1 {
psels = <NRF_PSEL(TWIM_SCL, 1, 6)>,
<NRF_PSEL(TWIM_SDA, 1, 4)>;
low-power-enable;
};
};
};
&uart0 {
status = "disabled";
};
arduino_serial: &uart1 {
status = "disabled";
};
&gpio_fwd {
compatible = "nordic,nrf-gpio-forwarder";
status = "disabled";
uart {
status = "disabled";
};
};
&led0 {
status = "disabled";
};
&led1 {
status = "disabled";
};
&pwm_led0 {
status = "disabled";
};
&pwm0 {
status = "okay"; /* PWM 컨트롤러 활성화 */
pinctrl-0 = <&pwm0_default>; /* 기본 설정 */
pinctrl-1 = <&pwm0_sleep>;
pinctrl-names = "default", "sleep";
// label = "PWM_0";
};
&spi0 {
compatible = "nordic,nrf-spim";
status = "okay";
pinctrl-0 = <&spi0_default>;
pinctrl-1 = <&spi0_sleep>;
pinctrl-names = "default", "sleep";
label = "SPI_0";
cs-gpios = <&gpio0 19 GPIO_ACTIVE_HIGH>, /* CS 4151_1 */
<&gpio0 21 GPIO_ACTIVE_HIGH>, /* CS 4152_2 */
<&gpio0 20 GPIO_ACTIVE_HIGH>; /* CS 4052_2 */
slave1: spi-dev1@0 {
compatible = "spi-device";
reg = <0>; /* 슬레이브 1의 ID */
spi-max-frequency = <8000000>;
// cs-gpios = <&gpio0 8 GPIO_ACTIVE_LOW>;
};
slave2: spi-dev2@1 {
compatible = "spi-device";
reg = <1>; /* 슬레이브 2의 ID */
spi-max-frequency = <8000000>;
// cs-gpios = <&gpio0 9 GPIO_ACTIVE_LOW>;
};
slave3: spi-dev3@2 {
compatible = "spi-device";
reg = <2>; /* 슬레이브 3의 ID */
spi-max-frequency = <8000000>;
// cs-gpios = <&gpio0 10 GPIO_ACTIVE_LOW>;
};
};
&mx25r64 {
status = "okay";
};
#include <dt-bindings/regulator/npm1300.h>
#include <zephyr/dt-bindings/input/input-event-codes.h>
sc50_i2c: &i2c1 {
compatible = "nordic,nrf-twim"; // I2C 마스터 모드 사용
status = "okay";
clock-frequency = <I2C_BITRATE_FAST>;
pinctrl-0 = <&i2c1_default>;
pinctrl-1 = <&i2c1_sleep>;
pinctrl-names = "default", "sleep";
npm1300: pmic@6b {
compatible = "nordic,npm1300";
reg = <0x6b>;
label="npm1300";
pmic-int-pin = <3>;
npm1300_ek_gpio: gpio-controller {
compatible = "nordic,npm1300-gpio";
gpio-controller;
#gpio-cells = <2>;
ngpios = <5>;
};
npm1300_ek_regulators: regulators {
compatible = "nordic,npm1300-regulator";
/* limits are set to min/max allowed values */
npm1300_ek_buck1: BUCK1 {
regulator-min-microvolt = <1000000>;
regulator-max-microvolt = <3300000>;
regulator-init-microvolt = <3000000>;
retention-microvolt = <3000000>;
};
npm1300_ek_buck2: BUCK2 {
regulator-min-microvolt = <1000000>;
regulator-max-microvolt = <3300000>;
};
npm1300_ek_ldo1: LDO1 {
regulator-min-microvolt = <1000000>;
regulator-max-microvolt = <3300000>;
};
npm1300_ek_ldo2: LDO2 {
regulator-min-microvolt = <1000000>;
regulator-max-microvolt = <3300000>;
};
};
npm1300_ek_charger: charger {
// compatible = "nordic,npm1300-charger";
// term-microvolt = <4150000>;
// term-warm-microvolt = <4000000>;
// current-microamp = <500000>;//150000
// dischg-limit-microamp = <1000000>;
// vbus-limit-microamp = <500000>;
// thermistor-ohms = <10000>;
// thermistor-beta = <3380>;
// charging-enable;
// vbatlow-charge-enable;
compatible = "nordic,npm1300-charger";
term-microvolt = <4200000>; // 충전 종료 전압 4.20V
term-warm-microvolt = <3600000>; // 배터리 온도 높을 때 충전 제한 전압 3.6V
current-microamp = <800000>; // 충전 전류 800mA (1A, 2600mAh 배터리의 0.5C)
dischg-limit-microamp = <1000000>; // 방전 제한 1A
vbus-limit-microamp = <500000>; // 기본 500mA로 제한 후 코드에서 충전 전류 상승
thermistor-ohms = <10000>; // 배터리 NTC 서미스터 10kΩ
thermistor-beta = <3380>; // NTC B 값 3380
charging-enable; // 충전 활성화
//vbatlow-charge-enable; // 배터리 저전압에서도 충전 가능
};
npm1300_ek_buttons: buttons {
compatible = "gpio-keys";
pmic_button0: pmic_button_0 {
gpios = < &npm1300_ek_gpio 0 GPIO_ACTIVE_HIGH>;
label = "Pmic button switch 0";
zephyr,code = <INPUT_KEY_0>;
};
};
npm1300_ek_leds: leds {
compatible = "nordic,npm1300-led";
nordic,led0-mode = "error"; // 파랑 "error"
nordic,led1-mode = "host"; // 초록 Full charging
nordic,led2-mode = "charging"; // 빨강 "charging"
};
};
};
main.c
/*
* Copyright (c) 2022 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
*/
/** @file
* @brief SR coexistence sample
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(Algo_SC50, CONFIG_LOG_DEFAULT_LEVEL);
#include <zephyr/kernel.h>
#if NRFX_CLOCK_ENABLED && (defined(CLOCK_FEATURE_HFCLK_DIVIDE_PRESENT) || NRF_CLOCK_HAS_HFCLK192M)
#include <nrfx_clock.h>
#endif
#include <zephyr/init.h>
#include <zephyr/device.h>
#include <zephyr/devicetree.h>
#include <zephyr/drivers/gpio.h>
// #include <zephyr/drivers/i2c.h>
#include <zephyr/drivers/mfd/npm1300.h>
#include <zephyr/drivers/sensor.h>
#include <zephyr/drivers/led.h>
#include "Algo/wifi_socket.h"
#include "Algo/ble.h"
#include "Algo/adc.h"
#include "Algo/fuel_gauge.h"
// #include "Algo/Led.h"
#include "Algo/deviceInformation.h"
#define SLEEP_TIME_MS 1000
#define APPCORE_FW_VER "appcore_v2.0.0"
int powerMode = Power_On;
bool poweron_initialized = false;
bool poweroff_initialized = false;
bool powerdeeosleep_initialized = false;
static const struct device *pmic = DEVICE_DT_GET(DT_NODELABEL(npm1300));
static const struct device *charger = DEVICE_DT_GET(DT_NODELABEL(npm1300_ek_charger));
static const struct device *leds = DEVICE_DT_GET(DT_NODELABEL(npm1300_ek_leds));
static const struct device *gpios = DEVICE_DT_GET(DT_NODELABEL(npm1300_ek_gpio));
static volatile bool vbus_connected;
#define NPM1300_CHARGER_BASE 0x03U
#define REG_BCHGDISABLESET_OFFSET 0x6
#define BCHGDISABLE_NTC_MASK BIT(1)
// VBUS 관련 레지스터 주소 정의
#define NPM1300_VBUS_BASE 0x02U // VBUS 베이스 주소
#define VBUS_OFFSET_STATUS 0x07U // VBUS 상태 플래그가 포함된 오프셋
// VBUSINSTATUS 레지스터의 비트 정의
#define VBUS_DETECTED_BIT (1 << 0) // Bit 0: VBUS detected
#define VBUS_OVERVOLTAGE_BIT (1 << 2) // Bit 2: Overvoltage protection active
#define VBUS_UNDERVOLTAGE_BIT (1 << 3) // Bit 3: Undervoltage detected
// SHIP Mode Base Address
#define SHIP_MODE_BASE 0x0BU
// SHIP Mode 관련 레지스터 오프셋
#define TASKENTERSHIPMODE 0x02U // Ship Mode 진입 명령
static struct k_timer green_blink_timer;
static bool reed_led_state = false;
static bool green_led_state = false;
static bool blue_led_state = false;
// SHIP Mode 진입 함수
int enter_ship_mode(void) {
int ret = mfd_npm1300_reg_write(pmic, SHIP_MODE_BASE, TASKENTERSHIPMODE, 1U);
if (ret == 0) {
printf("Device is entering Ship Mode...\n");
} else {
printf("Failed to enter Ship Mode. Error: %d\n", ret);
}
}
// VBUS 상태 확인 함수
int check_vbus_status(void) {
int ret;
uint8_t vbus_status;
// VBUS 상태 레지스터 읽기
ret = mfd_npm1300_reg_read(pmic, NPM1300_VBUS_BASE, VBUS_OFFSET_STATUS, &vbus_status);
if (ret != 0) {
return ret; // 읽기 실패 시 오류 코드 반환
}
// VBUS 상태 출력
if (vbus_status & VBUS_DETECTED_BIT) {
// printf("VBUS detected.\n");
vbus_connected = true;
} else {
// printf("VBUS not detected.\n");
vbus_connected = false;
}
if (vbus_status & VBUS_OVERVOLTAGE_BIT) {
// printf("VBUS overvoltage detected.\n");
}
if (vbus_status & VBUS_UNDERVOLTAGE_BIT) {
// printf("VBUS undervoltage detected.\n");
}
}
/** NTC 체크 비활성화 */
void disable_ntc_check(void) {
int ret;
uint8_t read_val = 0;
uint8_t val = read_val | BCHGDISABLE_NTC_MASK;
ret = mfd_npm1300_reg_write(pmic, NPM1300_CHARGER_BASE, REG_BCHGDISABLESET_OFFSET, val);
if (ret < 0) {
LOG_ERR("ERROR: Failed to write BCHGDISABLESET! (ret=%d)", ret);
return;
}
LOG_INF("NTC check disable command sent.");
}
static void pmic_event_callback(const struct device *dev, struct gpio_callback *cb, uint32_t pins)
{
if (pins & BIT(NPM1300_EVENT_VBUS_DETECTED)) {
printk("Vbus connected\n");
vbus_connected = true;
}
if (pins & BIT(NPM1300_EVENT_VBUS_REMOVED)) {
printk("Vbus removed\n");
vbus_connected = false;
}
}
int npm1300_configure_set(void) {
int err;
if (!device_is_ready(pmic)) {
LOG_INF("Pmic device not ready.\n");
return 0;
}
if (!device_is_ready(charger)) {
LOG_INF("Charger device not ready.\n");
return 0;
}
if (fuel_gauge_init(charger) < 0) {
LOG_INF("Could not initialise fuel gauge.\n");
return 0;
}
if (!device_is_ready(leds)) {
printk("Error: led device is not ready\n");
return 0;
}
if (!device_is_ready(gpios)) {
printk("Error: gpios device is not ready\n");
return 0;
}
static struct gpio_callback event_cb;
// gpio_init_callback(&event_cb, pmic_event_callback, BIT(0));
gpio_init_callback(&event_cb, pmic_event_callback,
BIT(NPM1300_EVENT_VBUS_DETECTED) |
BIT(NPM1300_EVENT_VBUS_REMOVED));
err = mfd_npm1300_add_callback(pmic, &event_cb);
if (err) {
LOG_INF("Failed to add pmic callback.\n");
return 0;
}
/* ✅ 초기 설정 */
disable_ntc_check(); // NTC 체크 비활성화
//err = mfd_npm1300_reg_write(pmic, 0x01, 0x0C, 0x00);
err = mfd_npm1300_reg_write(pmic, 0x09, 0x00, 0x00);
if (err != 0) {
return err; // 읽기 실패 시 오류 코드 반환
}
/* Initialise vbus detection status. */
struct sensor_value val;
int ret = sensor_attr_get(charger, SENSOR_CHAN_CURRENT, SENSOR_ATTR_UPPER_THRESH, &val);
if (ret < 0) {
return false;
}
vbus_connected = (val.val1 != 0) || (val.val2 != 0);
printk("PMIC device ok\n");
gpio_pin_configure(gpios, 0, GPIO_OUTPUT_ACTIVE);
gpio_pin_configure(gpios, 1, GPIO_OUTPUT_ACTIVE);
gpio_pin_configure(gpios, 2, GPIO_OUTPUT_ACTIVE);
}
int main(void)
{
LOG_INF("SC50 device ok");
LOG_INF("App Core FW version: %s", APPCORE_FW_VER);
npm1300_configure_set();
/* npm1300 gpio led 관련 부분 1:off, 0:on */
gpio_pin_set(gpios, 0, 0); // Blue <- 저항값 내려야 함함
gpio_pin_set(gpios, 1, 0); // Green <- 저항값 적절
gpio_pin_set(gpios, 2, 0); // Red <- 저항값 올려야 함
while (1) {
if(powerMode == Power_On)
{
// LOG_INF("Power On");
poweroff_initialized = false;
if(poweron_initialized == false)
{
LOG_INF("Power On Init");
poweron_initialized = true;
// system_powering_off= false;
Task_Wifi_Socket_Init();
Task_ADC_Init();
}
/* 주기적으로 pmic 상태 확인 */
check_vbus_status();
fuel_gauge_update(charger, vbus_connected);
}
else if(powerMode == Power_Off)
{
}
else if(powerMode == Power_DeepSleep)
{
if(!powerdeeosleep_initialized)
{
powerdeeosleep_initialized = true;
enter_ship_mode();
}
}
else if(powerMode == Power_LightSleep)
{
}
k_msleep(SLEEP_TIME_MS);
}
k_sleep( K_FOREVER );
}
Additionally, I have confirmed that the npm1300 works correctly when using the ble_coex example with the above configuration as-is.
However, the system stops working after adding the settings required for FOTA.