Tải bản đầy đủ (.doc) (10 trang)

MẠCH THU PHÁT dị bộ vạn NĂNG UART

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (100.77 KB, 10 trang )

MẠCH THU PHÁT DỊ BỘ VẠN NĂNG UART

I. Thế nào là bộ thu phát không đồng bộ vạn năng (UART) ?
- UART trong tiếng anh là viết tắt của cụm từ Universal
Asynchronous Receiver and Transmitter , nghĩa là bộ truyền nhận
nối tiếp không đồng bộ .
Giả sử bạn đang xây dựng 1 ứng dụng phức tạp cần dung nhiều vi điều
khiến ( hoặc nhiều điều khiển và máy tính ) kết nối với nhau . Trong quá trình
làm việc các vi điều khiển trao đổi dữ liệu qua nhau , ví dụ Master truyền lệnh
cho Slaver hoặc Slaver nhận được dữ liệu gửi về cho Master xử lí …giả sử tín
hiệu truyền là 1 dãy dài 8 bit và cách nối đơn giản nhất sẽ là kết nối 1 PORT
(8 bit) mỗi vi điều khiển với nhau , mỗi line trên PORT nhận trách nhiệm
truyền 1 bit dữ liệu , đây là cách giao tiếp song song .
Cách này đơn giản nhất vì dữ liệu được nhận trực tiếp không thông qua 1
giải thuật biến đổi nào vì thế tốc độ truyền cũng sẽ nhanh
Tuy nhiên nhược điểm là đường truyền quá nhiều , số lượng đường truyền tỉ
lệ thuận với dữ liệu truyền , hệ thống đường truyền sẽ cồng kềnh và kém hiệu
quả

Hình 1 : chuyền dữ liệu song song (1a) ; nối tiếp (1b)


Truyền thông nối tiếp sẽ giải quyết vấn đề này , trong truyền thông nối tiếp
dữ liệu được truyền từng bit 1 ( hoặc 1 ít ) trên đường truyền vì lí do này nên
dù bạn có chuyển dữ liệu lớn đến đâu cũng chỉ dung rất ít đường truyền .
Khi truyền / nhận dữ liệu sẽ bị chia nhỏ thành từng bit nên tốc độ truyền sẽ
bị giảm
Máy tính sẽ xử lí dữ liệu dưới dạng song song và biến đổi dữ liệu truyền đi
dưới dạng nối tiếp
II. Nguyên lý , cấu trúc bản tin


Ví dụ thiết bị 1 kết hợp với thiết bị 2 bởi 2 đường , 1 đường dữ
liệu và 1 đường xung nhịp , cứ mỗi lần tb1 muốn send 1 bit dữ liệu
,tb1 điều khiển đường xung nhịp truyền từ mức thấp lên mức cao
báo cho tb2 sẵn sàng nhận 1 bit .
Xung nhịp của UART để truyền và nhận dữ liệu
Bộ tạo xung nhịp cho UART có thể là một phần của UART nhưng cũng
có một số vi mạch sử dụng một bộ tạo xung nhịp riêng. Trong trường
hợp bộ tạo xung là một phần của UART, thì tần số của xung có thể
được lập trình để thay đổi thông qua một thanh ghi nội của UART. Khi
mạch tạo xung nhịp là một bộ phận tách biệt với UART thì tần số của
xung nhịp có thể được xác định bằng một vài phương pháp sau:
- Tần số cố định: Ðược sử dụng ở những nơi có tốc độ thông tin
không cần thay đổi. Mạch tạo xung nhịp ở đây rất đơn giản, chỉ gồm
một bộ tạo dao động thạch anh cùng vài cổng logic. Trong một số
trường hợp có thể sử dụng luôn xung nhịp của bộ vi xử lý.
- Tần số có thể thay đổi bằng phần mềm: Gồm một bộ tạo xung
nhịp riêng, tần số dao động có thể lập trình để điều chỉnh thông qua
một thanh ghi nội của UART tương tự như khi bộ tạo xung nhịp là một
phần của UART.
- Tần số có thể điều chỉnh bằng phần cứng: Bộ tạo xung trong
các máy vi tính thường cho phép thay đổi tần số dao động bằng cách
thay đổi vị trí các jumper trên bảng mạch mẹ của máy tính. Có hai
cách thường được áp dụng để thực hiện thay đổi tần số: Thay đổi tàn
số bằng cách chuyển đổi vị trí các jumper; Cách thứ hai là bộ tạo xung
sẽ nạp giá trị tương ứng với các jumper khi khởi động, sự thay đổi vị


trí của các jumper sau đó sẽ không ảnh hưởng đến tần số của bộ tạo
xung nhịp.
Dữ liệu truyền đi và nhận vào không bắt buộc phải có cùng một tốc

độ, hơn nữa, trong các giao thức của modem cho truyền song công,
các tín hiệu điều khiển thường được truyền ở một kênh phụ có tốc độ
thấp hơn nhiều tốc độ dữ liệu ở kênh chính. Trong nhiều vi mạch
UART, xung nhịp dùng cho truyền dữ liệu đi và xung nhịp dùng cho
nhận dữ liệu được cung cấp độc lập nhau. Việc dùng xung nhịp khác
nhau cho phần truyền và phần nhận hay là dùng chung được quyết
định bởi người thiết kế hệ thống.
Phần truyền dữ liệu của UART
Một byte dữ liệu cần truyền sau khi được ghi vào địa chỉ truyền của
vi mạch UART sẽ được đem vào phần truyền của vi mạch. Phần truyền
của UART bao gồm một thanh ghi dịch, khối logic điều khiển để nạp
byte vào thanh ghi dịch truyền và một bộ đệm truyền.
Trong phần truyền có một lối vào song song và một thanh ghi dịch
truyền để tạo dữ liệu ra nối tiếp. Các bits cần truyền sẽ được nạp vào
thanh ghi dịch và dịch ra tại sườn xuống của xung nhịp. Khi tất cả các
bits đã được dịch ra khỏi thanh ghi dịch truyền, SDU (Serial Data
Unit) tiếp theo sẽ được tạo và quá trình trên được lặp lại. Nếu không
tính bit START thì thanh ghi dịch truyền phải có độ rộng đủ lớn để có
thể chứa được từ 7 bits đến 11 bits.
Các bits dữ liệu có thể được nạp trực tiếp từ BUS dữ liệu của hệ
thống, nhưng trong nhiều vi mạch UART đều có một bộ đệm truyền
(Còn gọi là thanh ghi đệm truyền: Transmitter Holding Register) tạo
thành một hàng đợi nhỏ cho dữ liệu trước khi truyền. Vì thế một byte
dữ liệu có thể được ghi vào bộ đệm truyền của UART trong khi byte
trước đó đang được dịch ra khỏi thanh ghi dịch. Bộ đệm này không
những thuận tiện mà còn làm cho phần truyền hoạt động hiệu quả
hơn. Có thể có một vài bộ đệm truyền, nhưng phần lớn các UART chỉ
chứa duy nhất một bộ đệm
Trong truyền tin không đồng bộ, các kí tự trước khi truyền cần phải
thêm các bit START, STOP, bit chẵn lẻ... (Kí tự có thêm các bit này gọi

là SDU) thì phía nhận mới có thể nhận được kí tự. Việc tạo ra một SDU
được thực hiện trong phần truyền của UART như sau:
Tạo dạng SDU (Serial data unit)
Một SDU được bắt đầu bằng bit "0" do đó 0 sẽ được nạp một cách
tự động vào bit đầu tiên của bộ tạo SDU (Nằm xen giữa thanh ghi dịch


truyền và bộ đệm truyền). Ba thành phần của SDU có thể thay đổi đó
là số lượng bit STOP, bit chẵn lẻ và số lượng các bit dữ liệu, bộ tạo
dạng SDU sẽ sử dụng các tín hiệu giải mã từ thanh ghi "Dạng dữ liệu"
(Data format), thanh ghi này có thể lập trình để thay đổi giá trị. Ví dụ,
nếu thanh ghi "Dạng dữ liệu" của UART được lập trình là 7E2h thì SDU
nó tạo ra cho kí tự 'E' sẽ là
Chú ý rằng, các bit không sử dụng ở phía trái của bộ tạo dạng SDU
sẽ được điền 0. Trong quá trình dịch, các bits 0 được dịch vào các vị
trí bỏ trống ở phía trái vì thế các bits không sử dụng luôn luôn bằng
0. Thanh ghi dịch truyền sẽ chứa giá trị 1 khi mà tất cả các bits đã
được dịch ra ngoài, trừ bit STOP . Trạng thái này được dùng để thông
báo rằng bộ đệm truyền sẽ rỗng ở chu kì xung nhịp tiếp theo. Khi bộ
dệm truyền rỗng, cờ hiệu TxE (Transmitter Empty) được bật, lúc đó
chân TxD của UART luôn ở mức "1" cho đến khi byte dữ liệu khác được
truyền.
Trạng thái đường truyền
Viết các chương trình để truyền dữ liệu chỉ cần biết hai thông tin cơ
bản đó là bộ đệm truyền (Transmitter Bufer) và thanh ghi dịch truyền
(Transmitter Shìt Register) rỗng. Mỗi một điều kiện trên được ghi lại
trong thanh ghi trạng thái đường truyền nối tiếp (Serialization Status
Register). Khi dữ liệu từ bộ đệm truyền được nạp vào thanh ghi dịch
truyền, cờ TBE được dựng để báo rằng UART đã có thể nhận thêm một
byte dữ liệu khác. Nếu cờ TBE đã dựng rồi thì sau khi bit cuối cùng

của SDU được dịch ra, cờ TxE sẽ được dựng để báo rằng thanh ghi
dịch truyền cũng rỗng.
Trong truyền thông song công, phần mềm chỉ cần kiểm tra cờ TBE
để đảm bảo rằng bộ đệm truyền rỗng trước khi ghi một byte vào
UART. Nhưng trong khi truyền bán song công, phần mềm không
những phải kiểm tra cờ TBE mà còn phải kiểm tra cả cờ TxE trước khi
đổi chiều truyền từ phát sang thu để tránh gây mất dữ liệu.
Phần nhận dữ liệu của UART
Việc nhận một byte dữ liệu đòi hỏi phải đọc từ địa chỉ thanh ghi
đệm nhận của UART. Phần nhận dữ liệu của UART có nhiệm vụ tạo lại
một byte dữ liệu bằng cách đọc các bits dữ liệu nối tiếp từ đường
truyền sau đó gỡ bỏ các bits thông tin bao phía ngoài.
Khi một byte dữ liệu đã được chuyển vào bộ đệm nhận, cờ RxRDY
được bật và giữ nguyên giá trị đến khi bộ đệm này rỗng.


Trong khi truyền và nhận dữ liệu không thể tránh khỏi xẩy ra lỗi,
các lỗi này thường được UART xử lý như sau:
* Các lỗi thường xẩy ra khi truyền
Nói chung, các lỗi ít khi xẩy ra trong khi truyền. Một trong các lỗi
có thể xẩy ra ở đây là do ghi vào bộ đệm truyền trong khi nó đang
chứa dữ liệu, kết quả là dữ liệu ở trong bộ đệm truyền bị mất, lỗi này
gọi là lỗi transmitter overrun. Với giả thiết là các lỗi rất ít khi xẩy ra
trong khi truyền, nếu có thì cũng rất dễ tránh nên nhiều UART thậm
chí còn không ghi nhận chúng.
* Các lỗi thường xẩy ra khi nhận
Không như trong khi truyền, khi nhận dữ liệu có thể gặp rất nhiều
lỗi xuất hiện:
- Khi byte dữ liệu đến nhanh quá mà phí nhận chưa kịp đọc, nó sẽ
được đặt vào bộ đệm nhận của UART. Khi bộ đệm này đầy, các byte

đến sau sẽ đè lên các byte đến trước dẫn đến mất dữ liệu, lỗi này gọi
là lỗi receiver overrun. Ðây là lỗi thường xuất hiện khi nhận dữ liệu.
- Nếu giá trị của bit chẵn lẻ của byte nhận được không nhất quán
với giá trị đặt trong thanh ghi dạng dữ liệu (Data Format register) thì
một lỗi chẵn lẻ (Parity error) được ghi nhận.
- Nếu bit STOP nhận được không hợp lệ và nếu tất cả các bit dữ
liệu và bit chẵn lẻ là 0 tức là đường truyền đã ở trạng thái "0" trong
thời gian tương đương một SDU, lúc đó cờ BREAK được bật.
- Nếu bit STOP nhận được không hợp lệ và các bits dữ liệu ở phía
sau lại có một bit là 1 thì bit START nhận được cũng không đúng, lỗi
framing được ghi nhận.
Các lỗi ở trên xẩy ra với giả thiết là phía truyền và phía nhận có
cùng một tốc độ, nếu chúng khác nhau về tốc độ truyền và nhận thì
sẽ có thêm rất nhiều lỗi xẩy ra.
* Ghi nhận các lỗi
Các lỗi xẩy ra trong quá trình trao đổi dữ liệu được UART ghi vào
thanh ghi tình trạng đường truyền nối tiếp (Serialization Status
Register) của nó. Ngoài ra thanh ghi này còn có một số bits được sử
dụng để làm các cờ như TxE (Transmitter Shift Register Empty), TBE
(Transmitter Buffer Empty), RxRDY (Receiver Ready).


* Ðọc các lỗi
Việc đọc các lỗi ở thanh ghi trạng thái thường reset lại tất cả
các cờ lỗi. Việc đặt các cờ lỗi và cờ RxRDY, TBE, TxE trong cùng một
thanh ghi là nhằm mục đích giảm nhỏ các thao tác cho chương trình.
Khi viết một thủ tục nhận dữ liệu, thường thì chương trình phải hỏi
vòng cho đến khi các bit trạng thái ở thanh ghi trạng thái này là 1, khi
đó byte dữ liệu được đọc vào và kiểm tra lỗi. Việc hỏi vòng này sẽ
reset các lỗi trong mỗi lần đọc thanh ghi trạng thái. Với thủ tục

truyền dữ liệu cũng phải làm các công việc tương tự.

III Thiết kế mạch vào 8 bit

Trong chế độ truyền bất đồng bộ thông
tin được truyền đi dưới dạng từng ký tự

khoảng cách các ký tự là ngẫu nhiên. Tuy
nhiên để tạo sựđồng bộ giữa máy phát và
thu, giao
thức tầng 2 (Data link protocol) có qui
định
cụ thể về mẫu tín hiệu trong
hệ thống truyền bất đồng bộ như sau :
- Mỗi ký tự gồm một số bit gọi
là ký tự dữ liệu, số này có thể là 5 đối
với mã Baudot,


7 nếu là mã ASCII (American Standard
Code for Information Interchange) và 8
nếu là mã
EBCDIC (Extended Binary-Coded Decimal
Information Code, mã BCD mở rộng)
- Ngoài ra, để tạo sự đồng bộ,
kèm theo các bit mã ký tự còn có các bit
Start ở trước
mỗi
ký tự và các bit Stop ở sau mỗi ký
tự. . Các bit Start là các bit 0 và các

bit Stop là bit 1.
Số bit Start luôn luôn là 1 bit còn số
bit Stop có thể là 1, 1,5 hoặc 2 bit.
- Nếu có thêm bit kiểm soát
chẵn lẻ (parity bit) thì bit này nằm
trước bit Stop.
- Ở trạng thái nghỉ máy phát
luôn phát đi bit 1 gọi là bit nghỉ (idle
bit), như vậy máy
thu dò ra bit Start khi có sự biến đổi
từ 1 xuống 0, sau đó là một chuỗi bit có
số lượng theo qui
định của giao thức.
Lưu ý là trong truyền dữ liệu,
bit LSB của ký tự luôn được truyền đi
trước và có
hai cách viết (và đọc) một bản tin: theo
chiều mũi tên hướng về bên phải và theo
chiều hướng


về bên trái
- Viết theo chiều mũi tên hướng
về bên phải : bit LSB của ký tựđầu tiên
sẽ nằm bên
phải của bản tin. Thí dụ bản tin dùng mã
ASCII gồm 3 ký tự ABC có mã lần lượt là
41H
(1000001), 42H (1000010) và 43H
(1000011), bit LSB của ký tựđầu tiên (A)

được phát đi
trước và phải nằm bên phải của bản tin
nên chuỗi dữ liệu được phát đi có dạng:
C
B
1000011

A
1000010

1000001.

Với
cách
viết
này,
mỗi
mẫu

hóa
của
mỗi

tựđược
giữ
nguyên
chiều
của

nhưng thứ tự các ký tự trong bản tin đã

bịđảo.
- Viết theo chiều mũi tên hướng
về bên trái : bit LSB của ký tựđầu tiên
sẽ nằm bên


trái của bản tin. Với thí dụ trên, bit
LSB của ký tựđầu tiên (A) được phát đi
trước và phải
nằm bên trái của bản tin nên chuỗi dữ
liệu được phát đi có dạng:

A
1000001

B
0100001

C
1100001.

Với cách viết này, thứ tự các ký tự
trong bản tin được giữ nguyên nhưng các
bit trong
mỗi ký tự đã bịđảo chiều.
Sơ Đồ Khối





×