I'm running into an issue in which I cannot initialized the I2C drivers on an Arduino Nano 33 BLE (nrf52840). The output from error logging is
00> [00:00:00.500,122] <err> i2c_nrfx_twi: Error on I2C line occurred for message 0 00> [00:00:00.500,640] <err> HTS221: Failed to read chip ID. 00> [00:00:00.508,392] <err> i2c_nrfx_twi: Error 0x0BAD0001 occurred for message 0
I have this prj.conf file:
CONFIG_BOARD_ARDUINO_NANO_33_BLE=y CONFIG_BOOTLOADER_MCUBOOT=y CONFIG_BOARD_ARDUINO_NANO_33_BLE_INIT_SENSORS=y CONFIG_LOG=y CONFIG_LOG_MODE_IMMEDIATE=y CONFIG_LOG_BACKEND_RTT=y CONFIG_I2C_LOG_LEVEL_DBG=y CONFIG_USE_SEGGER_RTT=y CONFIG_RTT_CONSOLE=y CONFIG_UART_CONSOLE=n CONFIG_SPI=n CONFIG_I2C=y CONFIG_SENSOR=y CONFIG_HTS221=y CONFIG_HTS221_TRIGGER_NONE=y CONFIG_LPS22HB=y ~ ~
I have also modified the arduino_nano_33_ble.dts to enable mcu_boot and added the sensors into the &i2c1 device tree.
Additionally, I changed zephyr/boards/arm/arduino_nano_33_ble/src/init_sensors.c such that initializing function is called at APPLICATION instead of PRE_KERNEL_1. Not sure why but initializing GPIO devices will cause the device to go fault at Pre_KERNEL_1.
/*
* Copyright (c) 2020 Jefferson Lee.
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <init.h>
#include <arduino_nano_33_ble.h>
/*
* this method roughly follows the steps here:
* https://github.com/arduino/ArduinoCore-nRF528x-mbedos/blob/6216632cc70271619ad43547c804dabb4afa4a00/variants/ARDUINO_NANO33BLE/variant.cpp#L136
*/
static int board_internal_sensors_init(const struct device *dev)
{
ARG_UNUSED(dev);
struct arduino_gpio_t gpios;
arduino_gpio_init(&gpios);
arduino_gpio_pinMode(&gpios, ARDUINO_LEDPWR, GPIO_OUTPUT);
arduino_gpio_digitalWrite(&gpios, ARDUINO_LEDPWR, 1);
CoreDebug->DEMCR = 0;
NRF_CLOCK->TRACECONFIG = 0;
/*
* Arduino uses software to disable RTC1,
* but I disabled it using DeviceTree
*/
/* nrf_rtc_event_disable(NRF_RTC1, NRF_RTC_INT_COMPARE0_MASK); */
/* nrf_rtc_int_disable(NRF_RTC1, NRF_RTC_INT_COMPARE0_MASK); */
NRF_PWM_Type * PWM[] = {
NRF_PWM0, NRF_PWM1, NRF_PWM2, NRF_PWM3
};
for (unsigned int i = 0; i < (ARRAY_SIZE(PWM)); i++) {
PWM[i]->ENABLE = 0;
PWM[i]->PSEL.OUT[0] = 0xFFFFFFFFUL;
}
/*
* the PCB designers decided to use GPIO's
* as power pins for the internal sensors
*/
arduino_gpio_pinMode(&gpios, ARDUINO_INTERNAL_VDD_ENV_ENABLE, GPIO_OUTPUT);
arduino_gpio_pinMode(&gpios, ARDUINO_INTERNAL_I2C_PULLUP, GPIO_OUTPUT);
arduino_gpio_digitalWrite(&gpios, ARDUINO_INTERNAL_VDD_ENV_ENABLE, 1);
arduino_gpio_digitalWrite(&gpios, ARDUINO_INTERNAL_I2C_PULLUP, 1);
return 0;
}
SYS_INIT(board_internal_sensors_init, APPLICATION, 32);
Here's my main.c file.
#include <zephyr.h>
#include <device.h>
#include <drivers/sensor.h>
#include <sys/util.h>
#include <stdio.h>
void main(void)
{
const struct device *dev = device_get_binding(DT_LABEL(DT_INST(0, st_hts221)));
const struct device *dev2 = device_get_binding(DT_LABEL(DT_INST(0, st_lps22hb_press)));
if (dev == NULL && dev2 == NULL) {
printf("Could not get devices\n");
return;
}
k_sleep(K_FOREVER);
}
Let me know if you want me to provide any other information about my setup. I'm currently flashing the board with a NRF52840dk with a JLink cable. I have been stuck on this problem for a few days now and I'm not sure what's the problem is.