124 lines
2.5 KiB
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;
|
|
} |