Việc truyền thông nối tiếp không đồng bộ (UART) đƣợc khởi tạo bằng cách ghi dữ liệu vào thanh ghi dữ liệu I/O UART [UDR].
Bộ truyền UART 2.7.4.1.
Sơ đồ khối:
Hình 2.27. Sơ đồ khối bộ truyền UART [12]
Quá trình truyền dữ liệu đƣợc khởi động bằng cách viết dữ liệu cần truyền đến thanh ghi dữ liệu I/O của bộ UART, gọi là thanh ghi UDR. Dữ liệu đƣợc truyền từ thanh ghi UDR đến thanh ghi dịch phát khi:
Một kí tự mới đƣợc viết đến UDR sau khi bit stop của kí tự trƣớc đó đã đƣợc dịch ra ngoài. Thanh ghi dịch sẽ đƣợc nạp giá trị mới ngay lập tức.
Một kí tự mới đƣợc viết đến UDR trƣớc khi bit stop từ kí tự trƣớc đó đƣợc dịch ra ngoài. Thanh ghi dịch sẽ đƣợc nạp khi bit stop của kí tự hiện đang truyền đƣợc dịch ra ngoài.
Nếu thanh ghi dịch phát 10 (11) bit là rỗng, dữ liệu đƣợc truyền từ thanh ghi
UDR đến thanh ghi dịch. Khi đó Bit cờ thanh ghi dữ liệu rỗng UDRE (UART Data Register Empty) trong thanh ghi trạng thái UART, USR (UART Status Register) đƣợc set. Khi bit này đƣợc set ( bằng 1) thì UART sẵn sàng nhận kí tự tiếp theo. Vào cùng thời điểm dữ liệu đƣợc truyền từ UDR đến thanh ghi dịch 10 (11)- bit, bit 0 của thanh ghi dịch đƣợc xóa (bit start) và bit 9 hoặc 10 đƣợc set (bit stop). Nếu ta muốn truyền dữ liệu 9 bit ( bit dữ liệu 9 có thể là bit kiểm tra chẵn - lẻ), thì bit CHR9 trong thanh ghi điều khiển UART: UCR (UART control register) phải đƣợc set. Và bit TXB8
trong thanh ghi UCR đƣợc truyền đến bit 9 trong thanh ghi dịch phát. Nhƣ vậy bit dữ liệu 9 phải đƣợc chứa trong bit TXB8 trong thanh ghi UCR.
Theo nhịp đồng hồ tốc độ baud cung cấp cho thanh ghi dịch phát, bit start đƣợc dịch ra ngoài đầu tiên trên chân TXD. Theo sau là các bit dữ liệu, trong đó bit có trọng số thấp sẽ đƣợc dịch ra trƣớc. Và cuối cùng là bit stop đƣợc dịch ra. Khi bit stop đƣợc dịch ra ngoài, thanh ghi dịch sẽ đƣợc nạp giá trị mới nếu nhƣ có bất kì dữ liệu nào đƣợc viết đến thanh ghi UDR trong suốt thời gian truyền. Trong thời gian nạp giá trị (load), bit UDRE đƣợc set (lên 1). Nếu không có dữ liệu mới trong thanh ghi UDR để truyền đi khi bit stop đƣợc dịch ra ngoài, cờ UDRE sẽ duy trì trạng thái set cho đến khi thanh ghi UDR đƣợc viết giá trị một lần nữa. Khi không có dữ liệu mới đƣợc ghi và bit stop đã ở trên chân TXD đúng một chiều dài bit, cờ phát hoàn thành TXC (TX Complete) trong thanh ghi USR đƣợc set.
Bit TXEN trong thanh ghi UCR khi set (bằng 1) thì bộ phát UART mới đƣợc cho phép. Khi bit này bị xóa (trạng thái mặc định) thì bộ phát UART không đƣợc cho phép và chân TXD chỉ có thể sử dụng nhƣ mục đích I/O thông thƣờng. Khi bit TXEN
đƣợc set, bộ phát UART sẽ đƣợc kết nối đến chân TXD (PD1) và chân TXD trở thành chân ngõ ra, bất kể sự thiết lập hƣớng của bit DDD1 trong thanh ghi DDRD.
Bộ nhận UART 2.7.4.2.
Hình 2.28. Sơ đồ khối bộ nhận UART [12]
Bộ nhận dữ liệu chứa khối logic Front - end có nhiệm vụ lấy mẫu tín hiệu trên chân RXD với tần số lấy mẫu bằng 16 lần tốc độ baud. Khi đƣờng truyền ở trạng thái nghỉ (mức 1), nếu có sự chuyển về "0" thì nó đƣợc xem là cạnh xuống của một bit start và tuần tự phát hiện bit start đƣợc khởi động.
Vì bộ nhận chứa khối logic front- end lấy mẫu ở tần số bằng 16 lần tốc độ baud nên một bit sẽ đƣợc lấy mẫu 16 lần. Trong trƣờng hợp này, khi có sự chuyển mức từ trạng thái nghỉ của đƣờng truyền xuống mức "0", thì tuần tự phát hiện bit start sẽ là: Nếu trong ba lần lấy mẫu 8, 9 và 10 của bit start mà hai (hoặc ba) lần là mức logic "1", thì bit start này bị loại bỏ và đƣợc xem nhƣ một tín hiệu nhiễu, bộ nhận bắt đầu tìm sự chuyển trạng thái từ 1-đến-0 ( 1 là trạng thái sau của bit stop chứ không phải là bit dữ liệu) tiếp theo.
Hình 2.29. Kiểm tra bit start
Tuy nhiên, khi bit start đƣợc xem là hợp lệ, việc lấy mẫu của các bit dữ liệu theo sau bit start sẽ đƣợc thực hiện. Và các bit này cũng đƣợc lấy mẫu tại ba mẫu 8, 9 và 10. Nếu 2 hoặc ba lần giá trị logic là giống nhau thì giá trị đó đƣợc xem là giá trị hợp lý. Tất cả các bit đƣợc dịch vào thanh ghi dịch của bộ truyền giống nhƣ chúng đã đƣợc lấy mẫu.
Hình 2.30. Kiểm tra các bit dữ liệu
Khi bit stop đƣợc đƣa vào bộ nhận, thì hai hoặc ba trong 3 lần lấy mẫu phải là 1 để nhận bit stop hợp lệ. Nếu trong ba lần lấy mẫu, mà nhiều hơn hai lần là mức logic "0", thì cờ lỗi khung truyền FE (Framing Error) trong thanh ghi trạng thái UART(
USR) đƣợc set (bằng 1). Trƣớc khi đọc dữ liệu từ thanh ghi dữ liệu UART (UDR), ngƣời sử dụng nên kiểm tra bit FE để phát hiện lỗi khung truyền.
Có hoặc không có giá trị bit stop đƣợc phát hiện là hợp lệ thì dữ liệu cũng sẽ đƣợc truyền đến UDR và cờ nhận hoàn thành RXC đƣợc set. Thanh ghi UDR thực chất là hai thanh ghi tách biệt về mặt vật lý, một cho dữ liệu truyền và một cho dữ liệu nhận. Khi thanh ghi UDR đƣợc đọc thì thanh ghi dữ liệu nhận (the Receive Data register) đƣợc truy cập, ngƣợc lại, khi thanh ghi UDR đƣợc ghi thì thanh ghi dữ liệu phát (The transmit data register) đƣợc truy cập.
Nếu ta muốn truyền dữ liệu 9 bit, thì bit CHR9 trong thanh ghi điều khiển
UART (UCR) phải đƣợc set và bit RXB8 trong thanh ghi USR sẽ đƣợc nạp vào bit 9 trong thanh ghi dịch phát khi dữ liệu đƣợc truyền đến thanh ghi UDR. Bit dữ liệu thứ 9 này sẽ đƣợc nhận tại bit RXB8 trong thanh ghi USC.
Điều khiển UART 2.7.4.3.
Thanh ghi dữ liệu UDR(I/O UART):
Hình 2.31. Thanh ghi dữ liệu UDR
Thanh ghi UDR thực chất là hai thanh ghi riêng lẻ về mặt vật lý nhƣng cùng chia sẽ địa chỉ I/O giống nhau. Khi ghi đến thanh ghi này thì thanh ghi dữ liệu truyền UART đƣợc truy cập. Còn khi đọc thanh ghi này thì thanh ghi dữ liệu nhận UART đƣợc truy cập.
Thanh ghi trạng thái USR (UART Status Register):
Hình 2.32. Thanh ghi trạng thái USR
Đây là thanh ghi chỉ cho phép đọc, cung cấp thông tin về trạng thái UART. Thanh ghi điều khiển UCR (UART Control Register):
Hình 2.33. Thanh ghi điều khiển UCR Thanh ghi tạo tốc độ baud UBRR:
Hình 2.34. Thanh ghi tạo tốc độ baud UBRR
Đây là thanh ghi 8 bit có thể đọc/ viết và đƣợc sử dụng để tạo ra tốc độ baud cho UART nhƣ miêu tả trƣớc đó.