Есть проблема с датчиками DS18b20
Заказал пару штук этих датчиков во влагозащищенном исполнении.
Подключил один из них по 2-проводной схеме - т.е. красный и черный провод объединил и посадил на "землю". Желтый провод сделал PullUP (к 3,3В через 3,3кОм) посадил на передатчик USART4.
МК - STM32F103RE (отладочная плата - Махаон).
Для упрощения жизни запустил CubeMX последней версии, настроил USART4 на HalfDuplex.
И ситуация следующая: на F0 датчик отвечает E0, а вот на остальные команды не отвечает вообще никак. Ни на 0хсс 0хBE (чтение памяти 9 байт) ни на 0x33.
Собственно, результаты смотрел в отладчике Keil и осциллографом. Скорость UART меняется адекватно, оценивал длительность импульсов согласно скорости.
Код ниже:
Код
uint8_t TxCmdReset=0xF0;
uint8_t RxAnswReset1;
uint8_t RxData[100];
uint8_t ow_buf[8];
HAL_HalfDuplex_EnableReceiver(&huart4);
MX_UART4_Init_wBoudRate(9600); //Reset
HAL_UART_Receive_IT(&huart4,&RxAnswReset1,1);
HAL_UART_Transmit(&huart4, &TxCmdReset, sizeof(TxCmdReset), 2);
for(i=0;i<1000;i++) {__NOP();}
MX_UART4_Init_wBoudRate(115200);
HAL_UART_Receive_IT(&huart4, RxData, sizeof(RxData));
OW_toBits(0xCC, ow_buf);
HAL_UART_Transmit(&huart4, (uint8_t *)ow_buf, 8, 3);
OW_toBits(0xB4, ow_buf);
HAL_UART_Transmit(&huart4, (uint8_t *)ow_buf, 8, 3);
HAL_Delay(2);
while(1);
Код
void MX_UART4_Init_wBoudRate(uint32_t BoudRate)
{
huart4.Instance = UART4;
huart4.Init.BaudRate = BoudRate;
huart4.Init.WordLength = UART_WORDLENGTH_8B;
huart4.Init.StopBits = UART_STOPBITS_1;
huart4.Init.Parity = UART_PARITY_NONE;
huart4.Init.Mode = UART_MODE_TX_RX;
huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart4.Init.OverSampling = UART_OVERSAMPLING_16;
HAL_HalfDuplex_Init(&huart4);
}
{
huart4.Instance = UART4;
huart4.Init.BaudRate = BoudRate;
huart4.Init.WordLength = UART_WORDLENGTH_8B;
huart4.Init.StopBits = UART_STOPBITS_1;
huart4.Init.Parity = UART_PARITY_NONE;
huart4.Init.Mode = UART_MODE_TX_RX;
huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart4.Init.OverSampling = UART_OVERSAMPLING_16;
HAL_HalfDuplex_Init(&huart4);
}
Функция преобразования байта в 8 байт для отправки заимствован. Тем не менее его в отладчике проверял - замечаний нет.
Код
void OW_toBits(uint8_t ow_byte, uint8_t *ow_bits) {
uint8_t i;
for (i = 0; i < 8; i++) {
if (ow_byte & 0x01) {
*ow_bits = OW_1;
} else {
*ow_bits = OW_0;
}
ow_bits++;
ow_byte = ow_byte >> 1;
}
}
uint8_t i;
for (i = 0; i < 8; i++) {
if (ow_byte & 0x01) {
*ow_bits = OW_1;
} else {
*ow_bits = OW_0;
}
ow_bits++;
ow_byte = ow_byte >> 1;
}
}
Пробовал оба датчика - ведут себя одинаково. Значит есть надежда что ошибка в коде.
Может кто прояснит в чем я не прав?