You are on page 1of 25

Trần Văn Hòa – DT2A - DT020120

I. Câu hỏi ôn tập chương 4.3


Câu 1: Hãy mô tả cách thức hoạt động, ưu nhược điểm và ứng dụng của
giao tiếp UART?

 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.


2. UART truyền thêm bit start, bit chẵn lẻ và bit dừng vào khung 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.
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.

 Giao tiếp SPI là gì?


SPI (Serial Peripheral Bus) là một chuẩn truyền thông nối tiếp tốc độ cao do hãng
Motorola đề xuất. Đây là kiểu truyền thông Master-Slave, trong đó có 1 chip
Master điều phối quá trình tuyền thông và các chip Slaves được điều khiển bởi
Master vì thế truyền thông chỉ xảy ra giữa Master và Slave. SPI là một cách truyền
song công (full duplex) nghĩa là tại cùng một thời điểm quá trình truyền và nhận có
thể xảy ra đồng thời. SPI đôi khi được gọi là chuẩn truyền thông “4 dây” vì có 4
đường giao tiếp trong chuẩn này đó là SCK (Serial Clock), MISO (Master Input
Slave Output), MOSI (Master Ouput Slave Input) và SS (Slave Select). Hình 1 thể
hiện một kết SPI giữa một chip Master và 3 chip Slave thông qua 4 đường.
 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 .

 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.

 Nói 1 cách vắn tắt và dễ hiểu:


 MISO - Mang  các dữ liệu từ các thiết bị SPI về arduino
 MOSI - Mang các dữ liệu từ Arduino đến các thiết bị SPI
 SS - Chọn thiết bị SPI cần làm việc
 SCK - dòng đồng bộ

 Đố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);

Kích hoạt giao tiếp SPI


SPI.begin();

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)

I. ĐỊNH NGHĨA GIAO THỨC I2C (Inter-Integrated Circuit)


I2C là một giao thức giao tiếp được phát triển bởi Philips Semiconductors để
truyền, nhận dữ liệu giữa một hoặc có thể nhiều Master – được xem như là các
thiết bị điều khiển trung tâm với một hoặc nhiều Slave – được xem như là các
ngoại vi trên cùng một hệ thống thông qua hai đường truyền tín hiệu.

Hình 1: Minh hoạ kết nối sử dụng giao tiếp I2C


Các thiết bị kết nối với bus I2C được phân thành hai loại: master và slave. Trong
đó, master sở hữu quyền kiểm soát để thực hiện đưa ra yêu cầu đến các slave, còn
slave là một thiết bị đáp ứng các yêu cầu từ master. Như hình minh họa ở trên,
master thông thường là các vi điều khiển, slave sẽ là các ngoại vi như cảm biến
nhiệt độ, LCD driver, EEPROM,…
Tại một thời điểm chỉ có duy nhất một thiết bị master ở trạng thái hoạt động trên
bus I2C. master điều khiển bus clock SCL và quyết định hoạt động nào sẽ được
thực hiện trên bus dữ liệu SDA. Tất cả các thiết bị đáp ứng các yêu cầu từ thiết bị
master này đều là slave. Để phân biệt giữa nhiều thiết bị slave khi được kết nối với
cùng một hệ thống bus I2C thì mỗi thiết bị slave sẽ có một địa chỉ vật lý 7-bit cố
định.
Khi một thiết bị master muốn truyền hoặc nhận dữ liệu từ một thiết bị slave, master
sẽ xác định địa chỉ thiết bị slave cụ thể trên đường SDA và sau đó tiến hành truyền
dữ liệu. Tất cả các thiết bị slave khác không gửi tín hiệu phản hồi về, trừ khi địa
chỉ của chúng được chỉ định bởi thiết bị master trên đường SDA.
II.PHƯƠNG THỨC HOẠT ĐỘNG – TRƯỜNG HỢP SỬ DỤNG
Trường hợp 1: Thiết bị master muốn gửi dữ liệu cho một thiết bị slave
 Master thực hiện một điều kiện bắt đầu (START)
 Master gửi địa chỉ của slave (Device Address) cần nhận dữ liệu và Bit cấu
hình đọc ghi dữ liệu (R/W) được gửi kèm có giá trị bằng 0 thể hiện hoạt động gửi
dữ liệu. 
 Slave phản hồi bằng bit xác nhận (ACK), xác nhận có slave hoạt động trên
hệ thống bus
 Master gửi địa chỉ thanh ghi của slave – địa chỉ mà master muốn ghi/bắt đầu
ghi dữ liệu.
 Slave phản hồi bằng bit xác nhận (ACK), xác nhận có địa chỉ thanh thi, sẵn
sàng nhận dữ liệu
 Master gửi các dữ liệu (Data) cần ghi vào thanh ghi cho slave, có thể một
hoặc nhiều byte.
 Master thực hiện kết thúc việc truyền dữ liệu bằng một điều kiện kết thúc
(STOP).
Hình 2: Khung truyền dữ liệu khi thiết bị master muốn gửi dữ liệu cho thiết bị
slave
Trường hợp 2: Thiết bị master muốn đọc dữ liệu từ một thiết bị slave
 Master thực hiện một điều kiện bắt đầu (START)
 Master gửi địa chỉ của slave (Device Address) cần nhận dữ liệu, theo kèm là
bit cấu hình đọc ghi dữ liệu (R/W) có giá trị bằng 0 thể hiện hoạt động gửi dữ
liệu (bằng 0 để gửi tiếp địa chỉ thanh ghi)
 Slave phản hồi bằng bit xác nhận (ACK), xác nhận có slave hoạt động trên
hệ thống bus
 Master gửi địa chỉ thanh ghi của Slave – địa chỉ mà master muốn ghi /bắt
đầu ghi dữ liệu.
 Slave phản hồi bằng bit xác nhận (ACK), xác nhận có địa chỉ thanh ghi trên
thiết bị slave. 
 Master gửi lại điều kiện bắt đầu cùng với địa chỉ của thiết bị slave, theo sau
đó là giá trị 1 của bit R/W thể hiện hoạt động đọc dữ liệu.
 Slave phản hồi bằng bit xác nhận (ACK) 
 Master nhận dữ liệu từ slave, có thể một hoặc nhiều byte.
 Master kết thúc việc nhận dữ liệu bằng cách thực hiện bit xác nhận (NACK)
và theo sau đó là một điều kiện kết thúc (STOP).
Hình 3: Khung truyền dữ liệu khi thiết bị master muốn đọc dữ liệu từ thiết bị slave
Phân tích các thành phần trong khung truyền: 
1. Điều kiện bắt đầu và điều kiện kết thúc (STAT, STOP)

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ả:
-

You might also like