1. Giới thiệu chuẩn giao tiếp 1 wire:
Chuẩn giao tiếp 1 dây (1 wire) do hãng Dallas giới thiệu. Trong chuẩn giao tiếp này chỉ cần 1 dây để truyền tín hiệu và làm nguồn nuôi (Nếu không tín dây mass). Là chuẩn giao tiếp không đồng bộ và bán song công (half-duplex). Trong giao tiếp này tuân theo mối liên hệ chủ tớ một cách chặt chẽ. Trên một bus có thể gắn 1 hoặc nhiều thiết bị slave. Nhưng chỉ có một master có thể kết nối đến bus này.
Bus dữ liệu khi ở trạng thái rãnh (khi không có dữ liệu trên đường truyền) phải ở mức cao do vậy bus dữ liệu phải được kéo lên nguồn thông qua một điện trở. Giá trị điện trở này có thể tham khảo trong datasheet của thiết bị / các thiết bị slave.
Các thiết bị tớ (slave) kết nối với cùng một bus được phân biệt với nhau nhờ 64 bit địa chỉ duy nhất (64-bit serial number). 8 byte (64 bit) này và được chia làm ba phần chính:
+ Bắt đầu với LSB, là byte đầu tiên là mã họ thiết bị có độ lớn 8 bit (8-bit family codes) xác định kiểu thiết bị. 6 byte tiếp theo lưu trữ địa chỉ riêng của thiết bị. Byte cuối cùng (MSB) là byte kiểm tra tính toàn vẹn dữ liệu cyclic redundancy check (CRC) có giá trị tương ứng với giá trị của 7 byte đầu tiên. Nhờ byte CRC giúp cho master xác định có địa chỉ được đọc có bị lỗi hay không. Với 224 địa chỉ khác nhau tạo ra một số lượng rất lớn các địa chỉ.Do vậy vấn đề về địa chỉ không phải là vấn đề chính trong chuẩn giao tiếp này.
2. Cách thức hoạt động:
Tín hiệu trên bus 1 wire chia thành các khe thời gian 60 µs. 1 bit dữ liệu được truyền trên bus dựa trên khe thời gian (time slots). Các thiết bị slave cho phép có thời gian nền có một chúc khác biệt từ thời gian nền danh nghĩa. Tuy nhiên đối với thiết bị master cần có bộ định thời với độ chính xác cao, để đảm bảo giao tiếp đúng với các thiết bị salve có thời gian nền khác biệt. Do đó rất quan trọng để tuân theo giới hạn thời gian mô tả trong các phần sau.
Bốn thao tác hoạt động cơ bản của bus 1 wire là Reset/Presence, gửi bit 1, gửi bit 0, và đọc bit . Thao tác byte như gửi byte và đọc byte dựa trên thao tác từng bít.
Gửi bit 1 (“Write 1” signal)
Thiết bị master kéo bus xuống mức thấp trong khoảng 1 đến 15µs. Sau đó nhả bus (releases the bus) cho đến hết phần còn lại của khe thời gian.
Gửi bit 0 ("Write 0" signal)
Kéo bus xuống mức thấp trong ít nhất 60µs, với chiều dài tối đa là 120 µs
Lưu ý: giữa các lần gửi bit (0 hoặc 1), phải có khoảng thời gian phục hồi bus (recovery time) tối thiểu 1 µs
Đọc bit:
Thiết bị master kéo bus xuống mức thấp từ 0 -15µs. Khi đó thiết bị tớ khi đó sẻ giữ bus ở mức thấp nếu muốn gửi bit 0, Nếu muốn gửi bit 1 đơn giản là nhả bus. Bus nên lấy mẫu 15 µs sau khi bus kéo xuống mức thấp.
"Reset/Presence":
Tín hiệu reset và Presence(Báo hiện diện) được trình bày như hình bên dưới. Thiết bị master kéo bus xuống thấp ít nhất 8 khe thời gian (tức là 480 µs) và sau đó nhả bus. Khoảng thời gian bus ở mức thấp đó gọi là tín hiệu reset. Nếu có thiết bị slave gắn trên bus nó sẻ trả lời bằng tín hiệu Presence tức là thiết bị tớ sẻ kéo bus xuống mức thấp trong khoảng thời gian 60µs. Nếu không có tín hiệu Presence, thiết bị master sẻ hiểu rằng không có thiết bị slave nào trên bus, và các giao tiếp tiếp theo sẻ không thể diễn ra.
Tổng hợp:
Bảng dưới đây mô tả cách hoạt động cách thức gửi và nhận dữ liệu của 1 wire là
Thao tác reset
#define ONE_WIRE_PIN PIN_A5 void onewire_reset() { output_low(ONE_WIRE_PIN); // pull the bus low for reset delay_us(500); output_float(ONE_WIRE_PIN); // float the bus high delay_us(500); // wait-out remaining initialisation window output_float(ONE_WIRE_PIN); } |
Gửi 1 byte
void onewire_write(int8 data) { int8 count; for(count = 0; count < 8; ++count) { output_low(ONE_WIRE_PIN); delay_us(2); // pull 1-wire low to initiate write time-slot. output_bit(ONE_WIRE_PIN, shift_right(&data, 1, 0)); // set output bit on 1-wire delay_us(60); // wait until end of write slot. output_float(ONE_WIRE_PIN); // set 1-wire high again, delay_us(2); // for more than 1us minimum. } } |
Đọc 1 byte
int onewire_read() { int count, data; for(count = 0; count < 8; ++count) { output_low(ONE_WIRE_PIN); delay_us(2); // pull 1-wire low to initiate read time-slot. output_float(ONE_WIRE_PIN); // now let 1-wire float high, delay_us(8); // let device state stabilise, shift_right(&data, 1, input(ONE_WIRE_PIN)); // and load result. delay_us(120); // wait until end of read slot. } return data; } |
Không có nhận xét nào:
Đăng nhận xét