Попросили тут разобраться со старой железкой у которой в качестве температурного датчика использовался DS1821 (тот который термостат ещё) в режиме 1-Wire сенсора.
Исходников железки не сохранилось, а датчики сгорают, ломаются, теряются. И вот человек купил новые, а они не работают.
Сел я посмотреть что с ними не так и не могу понять. Неужто паленые какие-то?
Что имею:
1. STM32F103 проц
2. DS1821 из старых запасов, рабочая, 2 шт.
3. DS1821 из новой закупки (много)
Написал примитивную прогу для опроса регистров DS1821 и вывода результатов в UART.
Так вот старые отлично читаются и температуру кажут. А новые не очень. Вроде как на 1Wire Reset отвечает Presence ом. Но дальше сплошной FF FF FF.
Немного практики:
Спойлер
Код: Выделить всё
uint8_t ow_buf[9];
#define OW_0 0x00
#define OW_1 0xff
#define OW_R_1 0xff
/* USER CODE END PFP */
/* USER CODE BEGIN 0 */
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 OW_toByte(uint8_t *ow_bits) {
uint8_t ow_byte, i;
ow_byte = 0;
for (i = 0; i < 8; i++) {
ow_byte = ow_byte >> 1;
if (*ow_bits == OW_R_1) {
ow_byte |= 0x80;
}
ow_bits++;
}
return ow_byte;
}
void OW_SetRegister(uint8_t reg)
{
uint8_t ow_buf[8];
MX_USART3_UART_Init(115200);
OW_toBits(reg,ow_buf);
HAL_UART_Transmit(&huart3, ow_buf, 8, 1);
}
uint8_t OW_ReadRegister(uint8_t reg)
{
uint8_t ow_buf[8];
OW_SetRegister(reg);
memset(ow_buf, 0xFF, 8);
HAL_UART_Receive_DMA(&huart3, ow_buf, 8);
HAL_UART_Transmit(&huart3, ow_buf, 8, 2);
return OW_toByte(ow_buf);
}
void OW_WriteRegister(uint8_t reg, uint8_t value)
{
uint8_t ow_buf[8];
OW_SetRegister(reg);
OW_toBits(value, ow_buf);
HAL_UART_Transmit(&huart3, ow_buf, 8, 2);
}
//OneWire Reset
uint8_t OW_Reset(void)
{
uint8_t data = 0xF0;
MX_USART3_UART_Init(9600);
HAL_UART_Transmit(&huart3, &data, 1, 2);
if (HAL_UART_Receive(&huart3, &data, 1, 2)==HAL_OK)
return data;
return 0xF0;
}
Код: Выделить всё
OW_Reset();
reg = OW_ReadRegister(0xAC);Код: Выделить всё
OW_Reset();
uint8_t reg = OW_ReadRegister(0xAA);


