RaghRoog
RaghRoog

Reputation: 9

STM32 using ds18b20 in half duplex usart mode with interrupts

I got problem with my project. I have to use ds18b20 via usart in half duplex mode with interrupts. I have some code, which is working, but it is not what I am looking for. Can someone help me with that? Below I pasted the code I have now.

void setBaudrate (uint32_t baud)
{
      huart1.Instance = USART1;
      huart1.Init.BaudRate = baud;
      huart1.Init.WordLength = UART_WORDLENGTH_8B;
      huart1.Init.StopBits = UART_STOPBITS_1;
      huart1.Init.Parity = UART_PARITY_NONE;
      huart1.Init.Mode = UART_MODE_TX_RX;
      huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
      huart1.Init.OverSampling = UART_OVERSAMPLING_16;
      if (HAL_HalfDuplex_Init(&huart1) != HAL_OK)
      {
        Error_Handler();
      }
}

int DS18B20_start()
{
    uint8_t data = 0xF0;
    setBaudrate(9600);
    HAL_UART_Transmit(&huart1, &data, 1, 100);
    if (HAL_UART_Receive(&huart1, &data, 1, 1000) != HAL_OK) return -1;
    setBaudrate(115200);
    if (data == 0xf0) return -2;
    return 1;
}

void DS18B20_write (uint8_t data)
{
    uint8_t buffer[8];
    for (int i=0; i<8; i++)
    {
        if ((data & (1<<i)) != 0)
        {
            buffer[i] = 0xFF;
        }
        else
        {
            buffer[i] = 0x00;
        }
    }

    HAL_UART_Transmit(&huart1, buffer, 8, 1000);
}

uint8_t DS18B20_read (void)
{
    uint8_t buffer[8];
    uint8_t value = 0;
    for (int i=0; i<8; i++)
    {
        buffer[i] = 0xFF;
    }

    HAL_UART_Transmit_DMA(&huart1, buffer, 8);
    HAL_UART_Receive_DMA(&huart1, RxData, 8);

    while (isRxed == 0);

    for (int i=0; i<8; i++)
    {
        if (RxData[i] == 0xFF)
        {
            value |= 1<<i;
        }
    }

    isRxed = 0;
    return value;
}

void measureTemp(){
    static uint32_t lastMeasurementTime = 0;
    uint32_t currentTime = HAL_GetTick();

    if((currentTime - lastMeasurementTime >= measurementInterval) || currentTime == 0){
        presence = DS18B20_start();
        DS18B20_Write(0xCC);  //skip ROM
        DS18B20_Write(0x44);  //convert t

        presence = DS18B20_start();
        DS18B20_Write(0xCC);  //skip ROM
        DS18B20_Write(0xBE);  //read Scratchpad

        Temp_LSB = DS18B20_read();
        Temp_MSB = DS18B20_read();
        Temp = (Temp_MSB<<8) | Temp_LSB;
        Temperature = (float)Temp/16.0;

        lastMeasurementTime = currentTime;//aktualizowanie ostatniego czasu pomiaru
    }

}

I tried the code I pasted and it is working, but there are no interrupts. I heard that I have to make some state machine, but I need help with that.

Upvotes: 0

Views: 40

Answers (0)

Related Questions