DS18B20 with nRF9160

Dear Community;

I am trying to port this code that was made for an nrf52 to an nRF9160. I have a 4.99K pull-up resistor between the data line and VCC. 

This is my ds18b20.c library file after modifications made for nRF9160:

/**
 * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA
 * 
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 * 
 * 1. Redistributions of source code must retain the above copyright notice, this
 *    list of conditions and the following disclaimer.
 * 
 * 2. Redistributions in binary form, except as embedded into a Nordic
 *    Semiconductor ASA integrated circuit in a product or a software update for
 *    such product, must reproduce the above copyright notice, this list of
 *    conditions and the following disclaimer in the documentation and/or other
 *    materials provided with the distribution.
 * 
 * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
 *    contributors may be used to endorse or promote products derived from this
 *    software without specific prior written permission.
 * 
 * 4. This software, with or without modification, must only be used with a
 *    Nordic Semiconductor ASA integrated circuit.
 * 
 * 5. Any software provided in binary form under this license must not be reverse
 *    engineered, decompiled, modified and/or disassembled.
 * 
 * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * 
 */

#include <drivers/gpio.h>

#include "ds18b20.h"

#define DS_PIN 1

// Commands
#define STARTCONVO      0x44
#define READSCRATCH     0xBE
#define WRITESCRATCH    0x4E

// Scratchpad locations
#define TEMP_LSB        0
#define TEMP_MSB        1

// Device resolution
#define TEMP_9_BIT  0x1F //  9 bit
#define TEMP_10_BIT 0x3F // 10 bit
#define TEMP_11_BIT 0x5F // 11 bit
#define TEMP_12_BIT 0x7F // 12 bit

typedef uint8_t ScratchPad[9];
static const struct device *gpio_dev;

/**@brief Function for sending one bit to bus.
 */
void ds18b20_send(char bit)
{
    //nrf_gpio_cfg_output(DS_PIN);
    //nrf_gpio_pin_clear(DS_PIN);
    //nrf_delay_us(5);

    gpio_pin_configure(gpio_dev, DS_PIN, GPIO_OUTPUT_LOW);
    gpio_pin_set(gpio_dev, DS_PIN, 0);
    k_sleep(K_USEC(5));

    if(bit==1)
    {
        //nrf_gpio_pin_set(DS_PIN);
        gpio_pin_set(gpio_dev, DS_PIN, 1);
    }
    //nrf_delay_us(80);
    //nrf_gpio_pin_set(DS_PIN);

    k_sleep(K_USEC(80));
    gpio_pin_set(gpio_dev, DS_PIN, 1);
    
}


/**@brief Function for reading one bit from bus.
 */
unsigned char ds18b20_read(void)
{
    unsigned char presence=0;
    
    //nrf_gpio_cfg_output(DS_PIN);
    //nrf_gpio_pin_clear(DS_PIN);
    //nrf_delay_us(2);

    //nrf_gpio_pin_set(DS_PIN);;
    //nrf_delay_us(15);

    //nrf_gpio_cfg_input(DS_PIN,NRF_GPIO_PIN_NOPULL);

    gpio_pin_configure(gpio_dev, DS_PIN, GPIO_OUTPUT_LOW);
    gpio_pin_set(gpio_dev, DS_PIN, 0);
    k_sleep(K_USEC(2));

    gpio_pin_set(gpio_dev, DS_PIN, 1);
    k_sleep(K_USEC(15));

    gpio_pin_configure(gpio_dev, DS_PIN, GPIO_INPUT);

    //if(nrf_gpio_pin_read(DS_PIN))
    if (gpio_pin_get_raw(gpio_dev, DS_PIN))
    {
        presence = 1;
    }
    else
    {
        presence = 0;
    }

    printk("\npresence = %d", presence);
    
    return presence;
}


/**@brief Function for sending one byte to bus.
 */
void ds18b20_send_byte(char data)
{
    unsigned char i;
    unsigned char x;
    for(i=0;i<8;i++)
    {
      x = data>>i;
      x &= 0x01;
      ds18b20_send(x);
    }
    //nrf_delay_us(100);
    k_sleep(K_USEC(100));
}


/**@brief Function for reading one byte from bus.
 */
unsigned char ds18b20_read_byte(void)
{
    unsigned char i;
    unsigned char data = 0;
    for (i=0;i<8;i++)
    {
        if(ds18b20_read()) data|=0x01<<i;
        //nrf_delay_us(15);
        k_sleep(K_USEC(15));
    }
    return(data);
}


/**@brief Function for sending reset pulse.
 */
unsigned char ds18b20_reset(void)
{
  unsigned char presence;

  //nrf_gpio_cfg_output(DS_PIN);
  //nrf_gpio_pin_clear(DS_PIN);

  //nrf_delay_us(500);
  //nrf_gpio_pin_set(DS_PIN);

  //nrf_gpio_cfg_input(DS_PIN,NRF_GPIO_PIN_NOPULL); // usikkert p� pull her. m� sjekkes
  //nrf_delay_us(30);

    gpio_pin_configure(gpio_dev, DS_PIN, GPIO_OUTPUT_LOW);
    gpio_pin_set(gpio_dev, DS_PIN, 0);

    k_sleep(K_USEC(500));
    gpio_pin_set(gpio_dev, DS_PIN, 1);

    gpio_pin_configure(gpio_dev, DS_PIN, GPIO_INPUT);
    k_sleep(K_USEC(30));

    if(gpio_pin_get_raw(gpio_dev, DS_PIN) == 0)
    {
        presence = 1;
    }
    else
    {
        presence = 0;
    }

    //nrf_delay_us(470);
    k_sleep(K_USEC(470));

    if(gpio_pin_get_raw(gpio_dev, DS_PIN) == 1)
    {
        presence = 1;
    }
    else
    {
        presence = 0;
    }

  return presence;
}


/**@brief Function for reading temperature.
 */
float ds18b20_get_temp(void)
{
    unsigned char check;
    char temp1=0, temp2=0;

    check=ds18b20_reset();
    if(check)
    {
        ds18b20_send_byte(0xCC); //Skip ROM.
        ds18b20_send_byte(0x44); //Start temp conversion.
        //nrf_delay_ms(600UL);
        k_sleep(K_MSEC(600UL));
        check=ds18b20_reset();
        ds18b20_send_byte(0xCC); //Skip ROM.
        ds18b20_send_byte(0xBE); //Read temp from Scratchpad.
        temp1=ds18b20_read_byte();
        temp2=ds18b20_read_byte();
        check=ds18b20_reset();
        float temp=0;
        temp=(float)(temp1+(temp2*256))/16;
        return temp;
    }
      return 0;
}


/**@brief Function for reading bit.
 */
uint8_t OneWire_read_bit(void)
{
    uint8_t r;

    //nrf_gpio_cfg_output(DS_PIN);
    //nrf_gpio_pin_clear(DS_PIN);
    //nrf_delay_us(3);
    //nrf_gpio_cfg_input(DS_PIN,NRF_GPIO_PIN_NOPULL);
    //nrf_delay_us(10);
    //r =nrf_gpio_pin_read(DS_PIN);
    //nrf_delay_us(53);

    gpio_pin_configure(gpio_dev, DS_PIN, GPIO_OUTPUT_LOW);
    gpio_pin_set(gpio_dev, DS_PIN, 0);
    k_sleep(K_USEC(3));
    gpio_pin_configure(gpio_dev, DS_PIN, GPIO_INPUT);
    k_sleep(K_USEC(10));
    r = gpio_pin_get_raw(gpio_dev, DS_PIN);
    printk("\nr = %d", r);
    k_sleep(K_USEC(53));
    return r;
}


/**@brief Function for reading.
 */
uint8_t OneWire_read()
{
    uint8_t bitMask;
    uint8_t r = 0;

    for (bitMask = 0x01; bitMask; bitMask <<= 1) {
	if ( OneWire_read_bit()) r |= bitMask;
    }
    return r;
}


/**@brief Function for reading scratchpad value
 */
void ds18b20_readScratchPad(uint8_t *scratchPad, uint8_t fields)
{
    ds18b20_reset();
    ds18b20_send_byte(0xCC);
    ds18b20_send_byte(READSCRATCH);

    for(uint8_t i=0; i < fields; i++)
    {
        scratchPad[i] = OneWire_read();

    }
    ds18b20_reset();
}


/**@brief Function for request temperature reading
 */
void ds18b20_requestTemperatures(void)
{
    ds18b20_reset();
    ds18b20_send_byte(0xCC);
    ds18b20_send_byte(STARTCONVO);
}


/**@brief Function for reading temperature method 2
 */
float ds18b20_get_temp_method_2(void)
{
    ds18b20_requestTemperatures();
    unsigned char check;

    ScratchPad scratchPad;
    ds18b20_readScratchPad(scratchPad, 2);
    int16_t rawTemperature = (((int16_t)scratchPad[TEMP_MSB]) << 8) | scratchPad[TEMP_LSB];
    float temp = 0.0625 * rawTemperature;

    return temp;
}


/**@brief Function for setting temperature resolution
 */
void ds18b20_setResolution(uint8_t resolution)
{
    ds18b20_reset();
    ds18b20_send_byte(0xCC);
    ds18b20_send_byte(WRITESCRATCH);
    // two dummy values for LOW & HIGH ALARM
    ds18b20_send_byte(0);
    ds18b20_send_byte(100);
    switch (resolution)
    {
        case 12:
            ds18b20_send_byte(TEMP_12_BIT);
            break;

        case 11:
            ds18b20_send_byte(TEMP_11_BIT);
            break;

        case 10:
            ds18b20_send_byte(TEMP_10_BIT);
            break;

        case 9:
        default:
            ds18b20_send_byte(TEMP_9_BIT);
            break;
    }
    ds18b20_reset();
}

/*Funcion para inicializar GPIO*/

void Init_GPIO(){

    gpio_dev = device_get_binding("GPIO_0");
    if (!gpio_dev) {
	    printk("Error getting GPIO_0: failed.\n");
    }

}

When I run the code I am always getting -0.062 ºC, which means that all 16 data bits are "1". 1111 1111 1111 1111 --> -0.062 ºC. 

If I print every receive bit I can confirm that they are "1", but they shouldn't be all "1". I think it has to do with how I configure the GPIOs as input, I don't know if 

nrf_gpio_cfg_input(DS_PIN,NRF_GPIO_PIN_NOPULL); and
gpio_pin_configure(gpio_dev, DS_PIN, GPIO_INPUT); are equivalent.

I have also tried to change sensor, but I get same -0.062 ºC. I have seen other people getting the -0.062 ºC value in this forum, but I can not found a solution, maybe someone can help.

Thanks in advance.

Related