UART (Universal Asynchronous Receiver-Transmitter – Bộ truyền nhận dữ liệu nối tiếp bất đồng bộ) là một trong những giao thức truyền thông giữa thiết bị với thiết bị được sử dụng nhiều nhất. Bạn có thể thấy giao tiếp UART được sử dụng nhiều trong các ứng dụng để giao tiếp với các module như: Wifi, Bluetooth, Xbee, module đầu đọc thẻ RFID với Raspberry Pi, Arduino hoặc vi điều khiển khác. Đây cũng là chuẩn giao tiếp thông dụng và phổ biến trong công nghiệp từ trước đến nay.
Khi được cấu hình đúng cách, UART có thể hoạt động với nhiều loại giao thức nối tiếp khác nhau liên quan đến việc truyền và nhận dữ liệu nối tiếp. Trong giao tiếp nối tiếp, dữ liệu được truyền từng bit bằng cách sử dụng một đường dây. Trong giao tiếp hai chiều, chúng ta sử dụng hai dây để truyền dữ liệu nối tiếp thành công. Tùy thuộc vào ứng dụng và yêu cầu hệ thống, truyền thông nối tiếp cần ít mạch và dây hơn, điều này làm giảm chi phí thực hiện.
Trong bài viết này, tôi sẽ trình bày về cách thức hoạt động của giao tiếp UART, nhằm giúp người đọc hiểu rõ hơn và tuân thủ các tiêu chuẩn của UART để tối đa hóa khả năng và ứng dụng, đặc biệt là khi phát triển các sản phẩm mới.
Xem thêm bài viết: Giới thiệu chuẩn giao tiếp I2C
Giới thiệu về giao tiếp UART
Giao thức truyền thông đóng một vai trò quan trọng trong việc tổ chức giao tiếp giữa các thiết bị. Nó được thiết kế theo nhiều cách khác nhau dựa trên các yêu cầu của hệ thống và các giao thức này có một quy tắc cụ thể được thống nhất giữa các thiết bị để việc truyền dữ liệu được thực hiện thành công.
Các hệ thống nhúng, vi điều khiển và máy tính hầu hết sử dụng UART như một dạng giao thức giao tiếp phần cứng giữa thiết bị và thiết bị. Trong số các giao thức truyền thông hiện có, UART chỉ sử dụng hai dây cho bên truyền và bên nhận.
Mặc dù là một phương pháp giao thức truyền thông phần cứng được sử dụng rộng rãi, nhưng nó không phải lúc nào cũng được tối ưu hóa hoàn toàn. Việc thực hiện đúng giao thức khung truyền thường bị bỏ qua khi sử dụng module UART bên trong bộ vi điều khiển.
Theo định nghĩa, UART là một giao thức truyền thông phần cứng sử dụng giao tiếp nối tiếp không đồng bộ với tốc độ có thể định cấu hình. Không đồng bộ có nghĩa là không có tín hiệu đồng hồ để đồng bộ hóa các bit đầu ra từ thiết bị truyền đi đến bên nhận.
Trong giao tiếp UART, hai UART giao tiếp trực tiếp với nhau. UART truyền chuyển đổi dữ liệu song song từ một thiết bị điều khiển như CPU thành dạng nối tiếp, truyền nó nối tiếp đến UART nhận, sau đó chuyển đổi dữ liệu nối tiếp trở lại thành dữ liệu song song cho thiết bị nhận.
Hai đường dây mà mỗi thiết bị UART sử dụng để truyền dữ liệu đó là:
- Transmitter (Tx)
- Receiver (Rx)
UART truyền dữ liệu không đồng bộ, có nghĩa là không có tín hiệu đồng hồ để đồng bộ hóa đầu ra của các bit từ UART truyền đến việc lấy mẫu các bit bởi UART nhận. Thay vì tín hiệu đồng hồ, UART truyền thêm các bit start và stop vào gói dữ liệu được chuyển. Các bit này xác định điểm bắt đầu và điểm kết thúc của gói dữ liệu để UART nhận biết khi nào bắt đầu đọc các bit.
Khi UART nhận phát hiện một bit start, nó bắt đầu đọc các bit đến ở một tần số cụ thể được gọi là tốc độ truyền (baud rate). Tốc độ truyền là thước đo tốc độ truyền dữ liệu, được biểu thị bằng bit trên giây (bps – bit per second). Cả hai UART đều phải hoạt động ở cùng một tốc độ truyền. Tốc độ truyền giữa UART truyền và nhận chỉ có thể chênh lệch khoảng 10% trước khi thời gian của các bit bị lệch quá xa.
Cả hai UART cũng phải được cấu hình để truyền và nhận cùng một cấu trúc gói dữ liệu.
Số lượng dây sử dụng | 2 |
Tốc độ truyền | 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600, 1000000, 1500000 |
Phương pháp truyền | Bất đồng bộ |
Truyền nối tiếp hay song song? | Nối tiếp |
Số lượng thiết bị chủ tối đa | 1 |
Số lượng thiết bị tớ tối đa | 1 |
Cách thức hoạt động của giao tiếp UART
UART sẽ truyền dữ liệu nhận được từ một bus dữ liệu (Data Bus). Bus dữ liệu được sử dụng để gửi dữ liệu đến UART bởi một thiết bị khác như CPU, bộ nhớ hoặc vi điều khiển. Dữ liệu được chuyển từ bus dữ liệu đến UART truyền ở dạng song song. Sau khi UART truyền nhận dữ liệu song song từ bus dữ liệu, nó sẽ thêm một bit start, một bit chẵn lẻ và một bit stop, tạo ra gói dữ liệu. Tiếp theo, gói dữ liệu được xuất ra nối tiếp từng bit tại chân Tx. UART nhận đọc gói dữ liệu từng bit tại chân Rx của nó. UART nhận sau đó chuyển đổi dữ liệu trở lại dạng song song và loại bỏ bit start, bit chẵn lẻ và bit stop. Cuối cùng, UART nhận chuyển gói dữ liệu song song với bus dữ liệu ở đầu nhận.
Dữ liệu truyền qua UART được tập hợp thành gói (packet). Mỗi gói chứa 1 bit start, 5 đến 9 bit dữ liệu (tùy thuộc vào UART), một bit chẵn lẻ (parity bit) tùy chọn và 1 hoặc 2 bit stop.
Start bit (Bit bắt đầu)
Đường truyền dữ liệu UART thường được giữ ở mức điện áp cao khi nó không truyền dữ liệu. Để bắt đầu truyền dữ liệu, UART truyền sẽ kéo đường truyền từ mức cao xuống mức thấp trong một chu kỳ đồng hồ. Khi UART nhận phát hiện sự chuyển đổi điện áp cao xuống thấp, nó bắt đầu đọc các bit trong khung dữ liệu ở tần số của tốc độ truyền.
Data Frame (Khung dữ liệu)
Khung dữ liệu chứa dữ liệu thực tế đang được truyền. Nó có thể dài từ 5 bit đến 8 bit nếu sử dụng bit chẵn lẻ. Nếu không sử dụng bit chẵn lẻ, khung dữ liệu có thể dài 9 bit. Trong hầu hết các trường hợp, dữ liệu được truyền với bit có trọng số bé nhất (LSB – Least Significant Bit) trước tiên.
Parity Bit (Bit chẵn lẻ)
Tính chẵn lẻ mô tả tính chẵn hoặc lẻ của một số. Bit chẵn lẻ là một cách để UART nhận cho biết liệu có bất kỳ dữ liệu nào đã thay đổi trong quá trình truyền hay không. Bit có thể bị thay đổi bởi bức xạ điện từ, tốc độ truyền không khớp hoặc truyền dữ liệu đường dài.
Sau khi UART nhận đọc khung dữ liệu, nó sẽ đếm số bit có giá trị là 1 và kiểm tra xem tổng số là số chẵn hay lẻ. Nếu bit parity là 0 (even parity – parity chẵn), thì tổng số bit 1 trong khung dữ liệu phải luôn là một số chẵn. Nếu bit parity là 1 (odd parity – parity lẻ) thì số tổng bit 1 trong khung dữ liệu là một số lẻ.
Khi bit chẵn lẻ khớp với dữ liệu, UART biết rằng quá trình truyền không có lỗi. Nhưng nếu bit chẵn lẻ là 0 và tổng là số lẻ, hoặc bit chẵn lẻ là 1 và tổng số là chẵn, thì UART biết rằng các bit trong khung dữ liệu đã thay đổi.
Stop Bit (Bit kết thúc)
Để báo hiệu sự kết thúc của gói dữ liệu, UART gửi sẽ điều khiển đường truyền dữ liệu từ điện áp thấp đến điện áp cao trong ít nhất hai khoảng thời gian bit.
Các bước truyền UART
1. UART truyền nhận dữ liệu song song từ bus dữ liệu.
3. Toàn bộ gói được gửi nối tiếp từ UART truyền đến UART nhận. UART nhận lấy mẫu đường dữ liệu ở tốc độ truyền được định cấu hình trước.
4. UART nhận loại bỏ bit start, bit chẵn lẻ và bit stop khỏi khung dữ liệu.
5. UART nhận chuyển đổi dữ liệu nối tiếp trở lại thành song song và chuyển nó đến bus dữ liệu ở đầu nhận.
Ưu và nhược điểm của UART
Không có giao thức truyền thông nào là hoàn hảo, nhưng UART thực hiện khá tốt những gì chúng làm. Dưới đây là một số ưu và nhược điểm để giúp bạn quyết định xem chúng có phù hợp với nhu cầu của bạn hay không.
Ưu điểm
- Chỉ sử dụng hai dây để truyền dữ liệu
- Không cần tín hiệu đồng hồ
- Có một bit chẵn lẻ để cho phép kiểm tra lỗi
- Cấu trúc của gói dữ liệu có thể được thay đổi miễn là cả hai bên được thiết lập cho nó
- Phương pháp truyền đơn giản, giá thành thấp
Nhược điểm
- Kích thước của khung dữ liệu được giới hạn tối đa là 9 bit
- Không phù hợp với các hệ thống đòi hỏi nhiều thiết bị chủ và tớ
- Tốc độ truyền của mỗi UART phải nằm trong khoảng 10%
Các ứng dụng của giao tiếp UART
Giao tiếp UART thường được sử dụng trong các bộ vi điều khiển cho các yêu cầu chính xác và chúng cũng có sẵn trong các thiết bị truyền thông khác nhau như giao tiếp không dây, thiết bị GPS, module Bluetooth và nhiều ứng dụng khác.
Các tiêu chuẩn truyền thông như RS422 & TIA được sử dụng trong UART ngoại trừ RS232. Thông thường, UART là một IC riêng được sử dụng trong giao tiếp nối tiếp UART.
Bài viết giản dị, dễ hiểu. Cảm ơn tác giả.
Cảm ơn bạn đã xem và bình luận bài viết của tôi. Chúc bạn học được nhiều kiến thức mới.
bài giải thích hay quá thầy ơi
Cảm ơn bạn đã xem và bình luận bài viết của tôi. Chúc bạn học thêm nhiều kiến thức mới.