Professional Documents
Culture Documents
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.
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.
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.
Để 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.
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
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.
Câu 2: Giao tiếp SPI là gì? Hãy mô tả cách đấu nối giữa board Arduino
với thiết bị khác sử dụng giao tiếp SPI và cách lập trình trên Arduino để
gửi dữ liệu đến các SPI Slave.
SCK: Xung giữ nhịp cho giao tiếp SPI, vì SPI là chuẩn truyền đồng bộ nên
cần 1 đường giữ nhịp, mỗi nhịp trên chân SCK báo 1 bit dữ liệu đến hoặc đi.
Đây là điểm khác biệt với truyền thông không đồng bộ mà chúng ta đã biết
trong chuẩn UART. Sự tồn tại của chân SCK giúp quá trình tuyền ít bị lỗi và
vì thế tốc độ truyền của SPI có thể đạt rất cao. Xung nhịp chỉ được tạo ra bởi
chip Master.
MISO– Master Input / Slave Output: nếu là chip Master thì đây là đường
Input còn nếu là chip Slave thì MISO lại là Output. MISO của Master và các
Slaves được nối trực tiếp với nhau.. MOSI – Master Output / Slave
Input: nếu là chip Master thì đây là đường Output còn nếu là chip Slave thì
MOSI là Input. MOSI của Master và các Slaves được nối trực tiếp với nhau.
SS – Slave Select: SS là đường chọn Slave cần giap tiếp, trên các chip Slave
đường SS sẽ ở mức cao khi không làm việc. Nếu chip Master kéo đường SS
của một Slave nào đó xuống mức thấp thì việc giao tiếp sẽ xảy ra giữa
Master và Slave đó. Chỉ có 1 đường SS trên mỗi Slave nhưng có thể có
nhiều đường điều khiển SS trên Master, tùy thuộc vào thiết kế của người
dùng.
Đối với Arduino Uno các chân giao tiếp SPI Lần lượt là SS-10; MOSI-11; MISO-
12; SCK-13. Đối với Arduino Mega MISO là 50, MOSI là 51, SCK là 52 và SS
thường là 53
Bạn có thể kiểm soát 1 hoặc nhiều thiết bị sử dụng SPI. Ví dụ dưới đây là 1 thiết bị
Dữ liệu được truyền qua lại dữa 2 đường MISO và MOSI. Điều này chỉ thực hiện
được khi Dòng SS được thiết lập ở mức thấp LOW. Nói cách khác, để giao tiếp với
một thiết bị SPI chúng ta cần thiết lập các dòng SS với thiết bị ở mức thấp LOW,
sau đó giao tiếp với nó, sau đó thiết lập các dòng SS trở lại mức cao HIGH. Nếu
chúng ta có hai hoặc nhiều thiết bị SPI trên cùng 1 bus, chúng sẽ được kết nối như
sau:
Ở đây có hai dòng SS - với mỗi 1 thiết bị chỉ sử dụng 1 dòng SS. Có thể sử dụng
bất kỳ chân digital nào trên Arduino của bạn cho dòng SS. Chỉ cần nhớ là để tất cả
các dòng SS ở mức cao HIGH , "ngoại trừ" dòng SS mà muốn kết nối với các thiết
bị SPI vào thời điểm đó.
Cách lập trình trên Arduino để gửi dữ liệu đến các SPI Slave.
Trước hết, chúng ta cần phải sử dụng thư viện SPI. Nó được đính kèm mặc định
khi bạn cài đặt Arduino IDE,bạn chỉ việc #include nó vào code của mình
#include "SPI.h"
Tiếp theo, trong void.setup () khai báo pin (s) để sử dụng cho dòng SS và cài đặt
chúng ở dạng OUTPUT. Ví dụ:
pinMode(ss, OUTPUT);
và cuối cùng chúng ta cần phải xác định cách để gửi dữ liệu, MSB hay LSB trước
bằng cách sử dụng:
SPI.setBitOrder(MSBFIRST);
Hoặc là
SPI.setBitOrder(LSBFIRST);
Và cuối dùng là đưa dòng SS về mức thấp, gửi dữ liệu và đưa về mức cao
digitalWrite(SS, LOW);
SPI.transfer(value);
digitalWrite(ss, HIGH);
Việc gửi dữ liệu là khá đơn giản, còn việc nhận tất nhiên là do thiết bị slave SPI
giải quyết. Trong bài viết tới mình sẽ đề cập đến vấn đề giao tiếp SPI giữa các
boad arduino với nhau.
Câu 3: Định nghĩa giao tiếp I2C. Trình bày phương thức
gửi/nhận dữ liệu trong giao tiếp I2C và phân tích các thành
hpanaf trong một I2C frame (khung truyền I2C)
H
ình 4: Tín hiệu của điều kiện bắt đầu và điều kiện kết thúc
Giao tiếp I2C được khởi tạo bằng cách master thực hiện điều kiện bắt đầu và
kết thúc bằng cách master thực hiện điều kiện kết thúc. Một sự chuyển đổi logic
từ mức HIGH sang mức LOW trên đường truyền SDA trong khi đường truyền
SCL ở mức HIGH được định nghĩa là một điều kiện bắt đầu. Một sự chuyển đổi
mức logic từ mức LOW sang mức HIGH trên đường truyền SDA trong khi
đường SCL ở mức HIGH được định nghĩa là điều kiện kết thúc.
2. Các bit địa chỉ
Các bit địa chỉ giúp xác định, phân biệt các slave khác nhau trên hệ thống
bus I2C, các master phải có/ được cài đặt các địa chỉ khác nhau. Thông thường
có 7 bit địa chỉ.
Bit địa chỉ được gửi kèm với bit cầu hình đọc/ghi dữ liệu.
3. Bit cấu hình đọc/ghi dữ liệu (R/W)
Bit này xác định hướng truyền dữ liệu hay có thể hiểu là thiết bị nào sẽ điều
khiển đường SDA: Nếu Master cần truyền dữ liệu đến Slave, bit Read / Write
được thiết lập mức logic LOW. Ngược lại, nếu Master cần nhận dữ liệu từ Slave,
bit này được thiết lập mức logic HIGH.
4. Bit xác nhận (ACK/NACK)
Mỗi byte dữ liệu đều được xác nhận bởi một bit ACK từ phía nhận dữ liệu
gửi cho phía gửi dữ liệu để báo rằng byte đã được nhận thành công và có thể tiếp
tục gửi byte dữ liệu tiếp theo. Bit ACK có giá trị LOW. Khi nó có giá trị HIGH
thì được gọi là bit NACK, bit NACK được gửi đi trong một số trường hợp như:
o Phía nhận đang bận và không thể nhận hay truyền dữ liệu vì đang thực
hiện một tính năng khác.
o Trong quá trình truyền nhận, dữ liệu/địa chỉ không hợp lệ, không tồn
tại.
o Trong quá trình truyền, phía nhận không thể nhận thêm các byte dữ
liệu nữa.
o Trong trường hợp master yêu cầu dữ liệu từ slave, master đã nhận đủ
và không nhận thêm dữ liệu.
5. Các bit dữ liệu (Data)
Dữ liệu được truyền tới các thiết bị slave hoặc được đọc từ các thiết bị slave,
bản chất của việc này chính là thực hiện đọc/ghi các thanh ghi trong thiết bị
slave. Các thanh ghi này nằm trong bộ nhớ của slave và được xác định, phân biệt
bởi các địa chỉ, các thanh ghi sẽ chứa thông tin, có thể là thông tin cấu hình hoạt
động của thiết bị slave, có thể thông tin dữ liệu mà slave có được trong quá trình
hoạt động như dữ liệu lấy mẫu từ cảm biến. Để điều khiển thiết bị slave thực hiện
một nhiệm vụ chức nào đó, master cũng sẽ thực hiện việc ghi vào thanh ghi của
thiết bị slave.
6. Lặp lại điều kiện bắt đầu (Repeated Start)
Việc thiết bị master thực hiện lặp lại điều kiện bắt đầu cũng tương tự như
việc master thực hiện điều kiện bắt đầu (START), lặp lại điều kiện bắt đầu được
sử dụng để thay thế cho việc thực hiện điều kiện STOP rồi thực hiện điều kiện
START.
Lặp lại điều kiện bắt đầu được sử dụng trong trường hợp thiết bị master
muốn đọc dữ liệu từ thiết bị slave sau khi đã nhận các phản hồi về địa chỉ thiết bị
slave và địa chỉ thanh ghi muốn đọc dữ liệu.
II. Bài tập thực hành TH10
1. TH10.1: Lập trình giao tiếp UART giữa 2 KIT Arduino Uno truyền
nhiều byte dữ liệu:
CODE:
Mô phỏng trên Proteus
Mô tả:
Mô tả chương trình: Master gửi 123 và 234 qua Slave rồi hiển thị lên Lcd.
TH10.2: Lập trình giao tiếp SPI giữa 2 KIT Arduino Uno
CODE:
Mô phỏng trên Proteus:
Mô tả:
- Mô tả chương trình: Sau khi bấm nút Master gửi dữ liệu về Slave và ngược
lại.
TH10.3: Lập trình giao tiếp I2C giữa 2 KIT Arduino Uno
CODE:
Mô phỏng trên Proteus:
Mô tả:
-