DS18B20 Match Rom command fail

Thread Starter

milad.norouzi

Joined Dec 23, 2021
36
Hi. I'm using STM32F030C8T6 MCU to communicate with multiple DS18B20. I'm using Timers to make 1us delay. I set my prescaler to 48-1. and I'm running on 48MHz clock. when i connect two sensors to my MCU, i can't read temperature, so for testing i disconnected one of the sensors and connect only one sensor to MCU. when i run skip command and convert temperature and read scratchpad its ok. so i decided to instead of ROM skip command use ROM match command to see what happened. when i use Search command thee output is always 255 or 0xff. i think timing is correct because 0xCC and 0xBE and reading data is ok. here is the code:

C:
void delay (ds18Config* _ds18b20, uint16_t time)
{
    /* change your code here for the delay in microseconds */
    //test = HAL_GetTick();
    __HAL_TIM_SET_COUNTER(_ds18b20->hTIMx, 0);
    while ((__HAL_TIM_GET_COUNTER(_ds18b20->hTIMx))<time);
}

void DS18B20_Write_Command (ds18Config* _ds18b20, uint8_t data)
{
    uint8_t bitMask;
    Set_Pin_Output(_ds18b20->sensorPort, _ds18b20->sensorPin);  // set as output
    for (bitMask = 0x01; bitMask; bitMask <<= 1){
        if ((data & bitMask)!=0){
            Set_Pin_Output(_ds18b20->sensorPort, _ds18b20->sensorPin);  // set as output
            HAL_GPIO_WritePin (_ds18b20->sensorPort, _ds18b20->sensorPin, 0);  // pull the pin LOW
            delay (_ds18b20, 10);  // wait for 1 us
            Set_Pin_Input(_ds18b20->sensorPort, _ds18b20->sensorPin);  // set as input
            delay (_ds18b20, 55);  // wait for 60 us
        }else{
            Set_Pin_Output(_ds18b20->sensorPort, _ds18b20->sensorPin);
            HAL_GPIO_WritePin (_ds18b20->sensorPort, _ds18b20->sensorPin, 0);  // pull the pin LOW
            delay (_ds18b20, 65);  // wait for 60 us
            Set_Pin_Input(_ds18b20->sensorPort, _ds18b20->sensorPin);
            delay (_ds18b20, 5);
        }
    }
}

uint8_t DS18B20_Read (ds18Config* _ds18b20)
{
    uint8_t value=0;
    Set_Pin_Input(_ds18b20->sensorPort, _ds18b20->sensorPin);
    for (int i=0;i<8;i++){
        Set_Pin_Output(_ds18b20->sensorPort, _ds18b20->sensorPin);   // set as output
        HAL_GPIO_WritePin (_ds18b20->sensorPort, _ds18b20->sensorPin, 0);  // pull the data pin LOW
        delay (_ds18b20, 3);  // wait for > 1us
        Set_Pin_Input(_ds18b20->sensorPort, _ds18b20->sensorPin);  // set as input
        if (HAL_GPIO_ReadPin (_ds18b20->sensorPort, _ds18b20->sensorPin)){
            value |= 1<<i;  // read = 1
        }
        delay (_ds18b20, 53);  // wait for 60 us
    }
    return value;
}

void DS18B20_getTemperature(ds18Config *_ds18b20, ds18Data *_sensors) {
    uint8_t Temp_byte1, Temp_byte2;
    uint16_t TEMP;
    uint8_t data[1];
    uint8_t address0[8] = {0x28, 0xFF, 0x64, 0x1E, 0x85, 0xF5, 0xFD, 0xD3};
    DS18B20_Start(_ds18b20);
    HAL_Delay (1);
    DS18B20_Write_Command (_ds18b20, 0xcc);  // skip ROM
    DS18B20_Write_Command (_ds18b20, 0x44);  // convert t
    HAL_Delay (800);
    DS18B20_Start(_ds18b20);
    HAL_Delay (1);
    DS18B20_Write_Command (_ds18b20, 0x55);
    for (int i = 0; i <8; i++){
        DS18B20_Write_Command (_ds18b20, address0[i]);
    }
    DS18B20_Write_Command (_ds18b20, 0xBE);
    Temp_byte1 = DS18B20_Read(_ds18b20);
    Temp_byte2 = DS18B20_Read(_ds18b20);
    TEMP = (Temp_byte2<<8)|Temp_byte1;
    data[0] = (int)TEMP/16;
}
 
Top