Reputation: 9
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