Hello,
I am working on a custom pcb with nrf9160-SICA. I have UART SPI and GPIOs running fine but I am having a very difficult time with I2c (TWI).
Pins 8 and 9 are occupied by switch1 and switch 2 on the nrf9160DK so even simple pin toggle (GPIO low high every second) is not possible.
On my board pins 8 and 9 are clear and can do simple GPIO toggle. because of this I assume my issue is software.
When I use my logic analyzer I don't see any output except for some odd low bits every few seconds or no activity (pins 8 and 9 are HIGH).
I am using this example: https://github.com/sigurdnev/fw-nrfconnect-nrf/tree/i2c/samples/nrf9160/i2c_scanner
CMakeLists:
cmake_minimum_required(VERSION 3.13.1) include($ENV{ZEPHYR_BASE}/cmake/app/boilerplate.cmake NO_POLICY_SCOPE) project(i2c_scanner) FILE(GLOB app_sources src/*.c) target_sources(app PRIVATE ${app_sources})
nrf9160_pca10090.overlay
&i2c2 { status = "ok"; sda-pin = <9>; scl-pin = <8>; clock-frequency = <I2C_BITRATE_STANDARD>; };
nrf9160_pca10090.dts
/* * Copyright (c) 2017 Linaro Limited * Copyright (c) 2018 Nordic Semiconductor ASA * * SPDX-License-Identifier: Apache-2.0 */ /dts-v1/; #include <nordic/nrf9160_xxaa.dtsi> / { model = "Nordic PCA10090 Dev Kit"; compatible = "nordic,pca10090-dk", "nordic,nrf9160-xxaa"; chosen { zephyr,console = &uart0; zephyr,i2c-accel = &i2c2; zephyr,sram = &sram0; zephyr,flash = &flash0; }; aliases { // led0 = &led0; // led1 = &led1; // led2 = &led2; // led3 = &led3; // sw0 = &button2; // sw1 = &button3; sw2 = &button0; sw3 = &button1; }; leds { compatible = "gpio-leds"; // led0: led_0 { // gpios = <&gpio0 2 GPIO_INT_ACTIVE_LOW>; // label = "Green LED 0"; // }; // led1: led_1 { // gpios = <&gpio0 3 GPIO_INT_ACTIVE_LOW>; // label = "Green LED 1"; // }; // led2: led_2 { // gpios = <&gpio0 4 GPIO_INT_ACTIVE_LOW>; // label = "Green LED 2"; // }; // led3: led_3 { // gpios = <&gpio0 5 GPIO_INT_ACTIVE_LOW>; // label = "Green LED 3"; // }; }; buttons { compatible = "gpio-keys"; button0: button_0 { gpios = <&gpio0 6 GPIO_PUD_PULL_UP>; //gpios = <&gpio0 8 GPIO_PUD_PULL_UP>; label = "Push button 1"; //label = "Switch 1"; }; button1: button_1 { gpios = <&gpio0 7 GPIO_PUD_PULL_UP>; //gpios = <&gpio0 9 GPIO_PUD_PULL_UP>; label = "Push button 2"; //label = "Switch 2"; }; // button2: button_2 { // gpios = <&gpio0 6 GPIO_PUD_PULL_UP>; // label = "Push button 1"; // }; // button3: button_3 { // gpios = <&gpio0 7 GPIO_PUD_PULL_UP>; // label = "Push button 2"; // }; }; sram0_bsd: memory@20010000 { device_type = "memory"; compatible = "mmio-sram"; }; }; &uart0 { status = "ok"; current-speed = <115200>; tx-pin = <23>; //29 rx-pin = <24>; //28 //rts-pin = <27>; //cts-pin = <26>; }; &uart1 { status = "ok"; current-speed = <9600>; //<115200>; tx-pin = <11>; //1 rx-pin = <10>; //0 //rts-pin = <15>; //cts-pin = <18>; }; &spi3 { status = "ok"; sck-pin = <0>; mosi-pin = <30>; miso-pin = <2>; //ss-pin = <14>; spi-max-frequency = <4000000>; }; &gpiote { status = "ok"; }; &gpio0 { status = "ok"; }; //&i2c2 { // status = "ok"; // sda-pin = <9>; // scl-pin = <8>; // clock-frequency = <I2C_BITRATE_STANDARD>; //}; &timer0 { status = "ok"; }; &flash0 { /* * For more information, see: * http://docs.zephyrproject.org/devices/dts/flash_partitions.html */ partitions { compatible = "fixed-partitions"; #address-cells = <1>; #size-cells = <1>; boot_partition: partition@0 { label = "mcuboot"; reg = <0x00000000 0x10000>; }; slot0_partition: partition@10000 { label = "image-0"; }; #if defined(CONFIG_ARM_TRUSTZONE_M) slot0_ns_partition: partition@40000 { label = "image-0-nonsecure"; }; #endif slot1_partition: partition@80000 { label = "image-1"; }; #if defined(CONFIG_ARM_TRUSTZONE_M) slot1_ns_partition: partition@b0000 { label = "image-1-nonsecure"; }; #endif scratch_partition: partition@f0000 { label = "image-scratch"; reg = <0x000f0000 0xa000>; }; storage_partition: partition@fa000 { label = "storage"; reg = <0x000fa000 0x00006000>; }; }; }; #if defined(CONFIG_ARM_TRUSTZONE_M) / { sram0_ns: memory@20020000 { device_type = "memory"; compatible = "mmio-sram"; }; }; #endif /* Include partition configuration file */ #include "nrf9160_pca10090_partition_conf.dts"
main.c
#include <nrf9160.h> #include <zephyr.h> #include <misc/printk.h> #include <i2c.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <gpio.h> #define I2C_ACCEL_WRITE_ADDR 0x32 #define I2C_ACCEL_READ_ADDR 0xAA //0x33 struct device * i2c_accel; uint8_t WhoAmI = 0xaa; //0u; uint8_t init_accelerometer(){ const char* const i2cName = "I2C_2"; i2c_accel = device_get_binding(i2cName); // i2c_accel = device_get_binding("I2C_2"); if (!i2c_accel) { printk("error\r\n"); return -1; } else { i2c_configure(i2c_accel, I2C_SPEED_SET(I2C_SPEED_STANDARD)); return 0; } } struct device *dev; void main(void) { dev = device_get_binding("GPIO_0"); /* Set LED pin as output */ gpio_pin_configure(dev, 16, GPIO_DIR_OUT); gpio_pin_configure(dev, 17, GPIO_DIR_OUT); gpio_pin_write(dev, 16, 1); gpio_pin_write(dev, 17, 1); printk("Hello, World!\r\n"); init_accelerometer(); while (1) { printk("loop head\r\n"); if (i2c_reg_read_byte(i2c_accel, I2C_ACCEL_READ_ADDR, 0x0F, WhoAmI) != 0) { printk("Error on i2c_read()\n"); } //i2c_reg_read_byte(i2c_accel, X, 0x0F, WhoAmI); printk("WhoAmI = %x\r\n", WhoAmI); printk("enter sleep\r\n"); k_sleep(1000); } }