OneWire là gì? Công dụng của công nghệ giao tiếp 1-Wire
OneWire là một công nghệ truyền thông đơn giản, thường dùng để kết nối các mạch xử lý với cảm biến trong các dự án điện tử. Phương pháp kết nối này tiêu tốn khá ít điện năng nên chúng thường được khá nhiều người quan tâm. Trong bài viết này, mình sẽ giới thiệu đến bạn khái niệm OneWire là gì, cách hoạt động cũng như các tính năng và lợi ích của công nghệ này nhé!
OneWire là gì?
OneWire là một giao thức nối tiếp, sử dụng 1 đường dây duy nhất để truyền dữ liệu. Trong đó, thiết bị chính (Master) sẽ khởi tạo và điều khiển một hoặc nhiều thiết bị phụ (Client) trên bus 1-Wire như hình dưới. Master sẽ phân biệt các thiết bị Slave thông qua ID, mỗi một Slave sẽ có một địa chỉ ID riêng biệt và không thể thay đổi.
Khi sử dụng 1-Wire, chúng ta có thể kết nối tối đa 63 thiết bị Slave với 1 Master. Tất cả quy trình truyền tải dữ liệu đều được điều khiển và quản lý bởi Master. Việc giao tiếp 1-Wire được diễn ra theo 3 giai đoạn:
- Reset bus: Đưa tất cả các thiết bị về trạng thái sẵn sàng để kết nối
- Chọn thiết bị: Thiết bị Master ra lệnh để tìm kiếm một thiết bị Slave cụ thể nào đó trong hệ thống, dựa trên địa chỉ ID
- Bắt đầu truyền tải dữ liệu: Thiết bị Master yêu cầu gửi hoặc nhận dữ liệu từ Slave đã được tìm thấy ở bước 2
Sau khi kết thúc 3 bước trên, nếu thiết bị Master cần liên lạc với một thiết bị Slave khác thì chúng sẽ reset bus và lặp lại các bước trên.
Đặc điểm của công nghệ 1-Wire
OneWire là một hệ thống kỹ thuật số dựa trên Volt, hoạt động với 2 tiếp điểm là dữ liệu và kết nối mặt đất để liên lạc 2 chiều bán song công. Cùng là giao tiếp nối tiếp, nhưng khác với I2C hay SPI, công nghệ 1-Wire là lựa chọn lý tưởng cho các môi trường cần sự tiếp xúc nhất thời. Khi bạn ngắt kết nối khỏi bus 1-Wire (hoặc khi mất liên lạc), các thiết bị Slave sẽ trở lại trạng thái sẵn sàng kết nối ban đầu, tương tự như khi reset bus. Khi có điện áp trở lại, các Slave sẽ hiện diện trở lại.
Với cấu trúc có 2 tiếp điểm như vậy, công nghệ giao tiếp OneWire là lựa chọn tiết kiệm nhất để bổ sung các tính năng điện tử nhằm nhận dạng, xác thực và phân phối các dữ liệu. Chúng thường được dùng để giao tiếp giữa các thiết bị nhỏ, không cần phải có tốc độ quá cao, ví dụ như truyền dữ liệu về nhiệt độ, độ ẩm, ánh sáng,… trong các dự án ESP32.
OneWire và UART
Tốc độ baud 9600 và 115.200 của UART cung cấp khoảng thời gian lý tưởng để OneWire đọc và ghi dữ liệu, thông qua quá trình reset và trao đổi dữ liệu theo 3 bước mình đã trình bày ở chế độ trên. Ngoài ra, UART truyền tải dữ liệu gồm 8 bit, không phân biệt chẵn lẻ và có 1 bit stop để thông báo.
Vì giao tiếp OneWire không sử dụng bất kỳ tín hiệu xung đồng hồ nào nên việc giao tiếp giữa các bit 0 và bit 1 sẽ diễn ra bằng cách đặt trạng thái của dữ liệu trong một khoảng thời gian cụ thể. Bình thường thì khoảng thời gian này sẽ kéo dài khoảng 60us, cho phép truyền 1 bit giữa thiết bị Master và Slave. Tuy nhiên, sẽ có khoảng thời gian nhỏ là 1us giữa mỗi 60us để dữ liệu được trở về trạng thái HIGH khi điện trở kéo lên.
Cách hoạt động của giao thức 1-Wire
Công nghệ OneWire thường được sử dụng bằng hệ thống phần mềm có kỹ thuật bit-bang hoặc dùng trong UART.
Việc truyền tải dữ liệu qua 1-Wire được hoạt động thông qua cơ chế reset:
- Ban đầu, chúng kéo đường dữ liệu 480 us xuống rồi thả ra, cho phép điện trở kéo lên để đưa dữ liệu về trạng thái HIGH.
- Sau đó, nếu thiết bị Slave được kết nối với bus, chúng sẽ trả về tín hiệu bằng việc kéo dữ liệu về trạng thái LOW ở mức 60 đến 240 us.
- Khi đó, thiết bị Master sẽ xác nhận sự hiện diện của Slave đó trong hệ thống. Sau đó, các thiết bị Slave sẽ bắt đầu truyền tải dữ liệu để thiết bị Master nhận được và ghi.
Bạn có thể theo dõi sơ đồ sau để hiểu hơn:
Sau khi reset, thiết bị Master có thể ghi và đọc dữ liệu từ các thiết bị Slave. Ban đầu, chúng gửi các lệnh ROM (chẳng hạn như lệnh tìm kiếm 0xF0) để truy cập vào địa chỉ của các Slave. Sau khi biết được địa chỉ của tất cả các thiết bị Slave trong hệ thống, chúng có thể truy cập vào địa chỉ chúng muốn bằng cách gửi lệnh Match ROM (0x55). Lưu ý rằng, các lệnh ROM này đều được theo sau các lệnh chức năng.
Để mình lấy ví dụ cụ thể cho bạn dễ hiểu nhé: Nếu cảm biến nhiệt độ OneWire được kết nối với bus, mạch xử lý có thể gửi các lệnh ROM để bắt đầu đọc nhiệt độ từ cảm biến. Những lệnh ROM này có độ dài là 8 bit.
Trong trường hợp Master cần ghi các bit lên dòng dữ liệu, chúng sẽ điều chỉnh trạng thái dòng dữ liệu thành LOW:
- Để ghi bit 0, Master sẽ kéo dòng dữ liệu xuống trong suốt khoảng thời gian 60us, sau đó thả trong 1us (khoảng thời gian nghỉ giữa mỗi lần 60us)
- Để ghi bit 1, Master sẽ kéo dòng dữ liệu xuống trong khoảng thời gian nhỏ hơn 15us, sau đó thả trong 1us (khoảng thời gian nghỉ giữa mỗi lần 60us)
Lời kết
Trên đây là các kiến thức cơ bản về công nghệ giao tiếp OneWire, đặc điểm và cách hoạt động của chúng trong UART. Hy vọng bài viết hữu ích với bạn. Sắp tới, mình sẽ bổ sung thêm hướng dẫn code cụ thể để bạn triển khai dễ dàng hơn nhé!