STM32F103CBT6_Thermograph/Core/Src/one_wire.c

124 lines
2.5 KiB
C

#include "one_wire.h"
#define OW_SLOT_A 6
#define OW_SLOT_B 64
#define OW_SLOT_C 60
#define OW_SLOT_D 10
#define OW_SLOT_E 9
#define OW_SLOT_F 55
#define OW_SLOT_G 10
#define OW_SLOT_H 480
#define OW_SLOT_I 70
#define OW_SLOT_J 410
#define DRIVE_DQ(x) ow->cb.drive_dq(ow->user_data, x)
#define DELAY_US(x) ow->cb.delay_usec(ow->user_data, x)
#define READ_DQ() ow->cb.read_dq(ow->user_data)
static inline uint8_t onewire_op_reset(onewire_t *ow) {
uint8_t sample_result;
// Delay G
DRIVE_DQ(1);
DELAY_US(OW_SLOT_G);
// Drive bus low, delay H
DRIVE_DQ(0);
DELAY_US(OW_SLOT_H);
// Release bus, delay I
DRIVE_DQ(1);
DELAY_US(OW_SLOT_I);
// Sample bus, delay J
sample_result = READ_DQ();
DELAY_US(OW_SLOT_J);
return sample_result;
}
static inline onewire_ret_t onewire_op_write_one_bit(onewire_t *ow) {
// Drive bus low, delay A
DRIVE_DQ(0);
DELAY_US(OW_SLOT_A);
// Release bus, delay B
DRIVE_DQ(1);
DELAY_US(OW_SLOT_B);
return OW_OK;
}
static inline onewire_ret_t onewire_op_write_zero_bit(onewire_t *ow) {
// Drive bus low, delay C
DRIVE_DQ(0);
DELAY_US(OW_SLOT_C);
// Release bus, delay D
DRIVE_DQ(1);
DELAY_US(OW_SLOT_D);
return OW_OK;
}
static inline uint8_t onewire_op_read_bit(onewire_t *ow) {
uint8_t sample_value;
// Drive bus low, delay A
DRIVE_DQ(0);
DELAY_US(OW_SLOT_A);
// Release bus, delay E
DRIVE_DQ(1);
DELAY_US(OW_SLOT_E);
// Sample bus to read bit from slave, delay F
sample_value = READ_DQ();
DELAY_US(OW_SLOT_F);
return sample_value;
}
uint8_t onewire_bus_reset(onewire_t *ow) {
uint8_t device_response = onewire_op_reset(ow);
return device_response ? 0 : 1;
}
onewire_ret_t onewire_bus_write_byte(onewire_t *ow, uint8_t byte) {
for(uint8_t i = 0; i < 8; i++) {
if(byte & 0x01) {
onewire_op_write_one_bit(ow);
}
else {
onewire_op_write_zero_bit(ow);
}
byte >>= 1U;
}
return OW_OK;
}
uint8_t onewire_bus_read_byte(onewire_t *ow) {
uint8_t result = 0x00;
for(uint8_t i = 0; i < 8; i++) {
result >>= 1U;
if(onewire_op_read_bit(ow)) {
result |= 0x80U;
}
}
return result;
}
onewire_ret_t onewire_bus_search_devices(onewire_t *ow) {
onewire_bus_write_byte(ow, 0xF0); // Search ROM command.
// Perform a binary search on the bus
return OW_OK;
}