You are on page 1of 41

BỘ CÔNG THƯƠNG

TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
KHOA CÔNG NGHỆ THÔNG TIN
 

BAO
́   CAO BAI
́ ̀ 
TÂP
̣   LƠN
́
Lập trình nhúng cơ bản
Đê tai: Tìm hi
̀ ̀ ểu giao diện SPI

Giảng viên hướng dẫn:  T.S Phạm Văn Hà

Sinh viên thực hiên:      Nhóm 21
̣

Tăng Quang Khaỉ

Nguyễn Tuấn Anh

̀ ̣
Ha Nôi 2014
MỤC LỤC

2
DANH MỤC HÌNH

3
DANH MỤC BẢNG

4
LỜI NÓI ĐẦU

Hiện nay, các vi xử lý hay vi điều khiển đang được sử dụng rộng rãi trong 
nhiều lĩnh vực như: điều khiển, tự động hóa, đo đạc, truyền thông... So với các 
phương pháp điều khiển, đo đạc truyền thống (cơ khí, điện tử tương tự... ) thì sử 
dụng vi xử lý có các ưu điểm như: nhỏ gọn, ít tốn năng lượng, thời gian đáp ứng 
nhanh, có thể lập trình được... 

Cùng với đó giao diện SPI ngày càng được sử dụng rộng rãi trong ngành công 
nghiệp cơ điện tử. Nhận thức được tầm quan trọng của giao diện SPI trong việc 
ứng dụng vào lập trình vi điều khiển là cơ sở để chúng em chọn đề tài bài tập lớn 
“Tìm hiểu giao diện SPI”.

Dưới sự hướng dẫn, chỉ bảo nhiệt tình của thầy Phạm Văn Hà cùng với sự cố 
gắng nỗ lực của các thành viên trong nhóm chúng em đã hoàn thành đề tài đúng thời 
gian cho phép. Tuy nhiên do thời gian hạn chế, cũng như với tầm hiểu biết có hạn 
nên chúng em không tránh khỏi sai sót. Vì vậy chúng em rất mong nhận được nhiều 
ý kiến đánh giá, góp ý của thầy giáo và các bạn để chúng em có thể hoàn thiện 
thêm đề tài này.

Chúng em xin chân thành cảm ơn!

5
PHẦN 1: MỞ ĐẦU

1. Tên đề tài

Tìm hiểu giao diện SPI

2. Lý do chọn đề tài

Ngày nay, khoa học kỹ  thuật phát triển như  vũ bão. Hệ  thống thiết bị 


điện tử, mạch điện tử, điện tử kỹ thuật số đã làm thay đổi sâu sắc toàn bộ 
hoạt động sản xuất của con người. Kỹ thuật điện tử số đã và đang thay thế 
dần các kỹ  thuật tương tự  và còn đóng vai trò then chốt trong cuộc cách  
mạng kỹ thuật và công nghệ. Song song với sự phát triển thần kì của cuộc  
cách mạng khoa học – công nghệ, kỹ thuật số đã dần dần có mặt trong hầu 
hết tất cả  các thiết bị  từ  dân dụng đến thiết bị  công nghiệp đặc biệt là  
trong  lĩnh  vực  thông  tin  liên lạc,   phát thanh  truyền  hình,   điều  khiển  tự 
động... Nó giải quyết khối lượng công việc lớn, giảm kích thước của các  
mạch điện tử  đồng thời chúng có nhiều tính năng và độ  chính xác cao. Có  
thể  nói rằng kỹ  thuật số  ra đời là cuộc cách mạng trong ngành kỹ  thuật  
điện tử.

Thế kỷ 21 chứng kiến sự phát triển với tốc độ chóng mặt của khoa học  
công nghệ, nó đóng vai trò then chốt trên tất cả các lĩnh vực của cuộc sống  
vì vậy trong mỗi chúng ta, đặc biệt là thế hệ trẻ, sinh viên ngành kỹ thuật 
cần phải hiểu rõ và nắm bắt được các kiến thức về công nghệ kỹ thuật số. 
Do đó chúng em quyết định chọn đề  tài “Tìm hiểu giao diện SPI” làm đề 
bài tập lớn.

3. Mục tiêu nghiên cứu

­ Sinh viên bước đầu tìm hiểu về nghiên cứu khoa học.

­ Hiểu được chuẩn nối tiếp truyền thông.

­ Nắm được kiến thức về chuẩn giao tiếp SPI.

­ Phân tích được ưu, được điểm của giao tiếp SPI.

4. Bố cục đề tài

Nội dung chính của đề tài gồm ba chương:

6
 Chương I: Giới thiệu giao diện SPI

 Chương II: Ứng dụng giao diện SPI trên vi điều khiển AVR

 Chương III: Nhận xét về giao diện SPI

7
PHẦN 2: NỘI DUNG

CHƯƠNG I: GIỚI THIỆU GIAO DIỆN SPI

1.1. Giới thiệu

SPI (Serial Peripheral Interface – Giao diện Ngoại vi N ối ti ếp) là một  


chuẩn đồng bộ  nối tiếp để  truyền dữ  liệu  ở  chế  độ  song công toàn phần  
(full­duplex), do công ty Motorola thiết kế nhắm đảm bảo sự liên hợp giữa  
các vi điều khiền và thiết bị ngoại vi một cách đơn giản.

Đây là kiểu truyền thông Master­Slave, trong đó có 1 chip Master điều 
phối quá trình truyề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 cung cấp một giao diện nối tiếp đơn giản giữa vi xử  lý và thiết bị 
ngoại vi. Giống với các Bus nối tiếp khác như I2C, CAN hoặc USB. Chuẩn  
giao tiếp SPI ngày càng được sử dụng rộng rãi trong lĩnh vực điện tử, đặc 
biệt là trong giao tiếp trao đổi dữ liệu với các thiết bị ngoại vi.

Giao diện SPI được sử dụng tích hợp trong một số loại thiết bị như:

Các bộ chuyển đổi (ADC và DAC)

Các loại bộ nhớ (EEPROM và FLASH)

Các loại IC thời gian thực

Các loại cảm biến (nhiệt độ, áp suất...)

Và   một   số   loại   thiết   bị   khác   như:   bộ   trộn   tín   hiệu   analog,   LCD,  
Graphic LCD...

1.2. Chuẩn truyền thông SPI

1.2.1. Cấu trúc SPI
Giao diện SPI được thực hiện thông qua Bus 4 dây MISO, MOSI, SCK  
và SS nên đôi khi SPI còn được gọi là “giao diện 4 dây”.

a. MISO – Master Input/ Slave Output

8
Chân MISO dùng để  truyền dữ  liệu ra khỏi SPI khi đặt cấu hình là  
Slave và nhận dữ  liệu khi đặt cấu hình là Master. MISO của Master và  
các Slaves được nối trực tiếp với nhau.

b. MOSI – Master Output/ Slave Input

Chân MOSI dùng để  truyền dữ  liệu ra khỏi SPI khi đặt cấu hình là  


Master và nhận dữ  liệu khi đặt cấu hình là Slave. MISO của Master và  
các Slaves được nối trực tiếp với nhau.

c. SCK – Serial Clock

Xung giữ  nhịp cho giao tiếp SPI, vì SPI là chuẩn truyền thông đồng 
bộ  nên cần một đường giữ  nhịp, mỗi nhịp trên chân SCK báo 1 bit dữ 
liệu đến hoặc đi. Sự tồn tại của chân SCK giúp quá trình truyền ít bị lỗi  
và vì thế tốc độ truyền của SPI có thể đạt hiệu quả cao.

Xung nhịp chỉ được tạo ra bởi chip Master.

d. SS – Slave Select

SS là đường chọn Slave cần giao 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ó một đường SS trên mỗi Slave nhưng có thể  có nhiều đường 


điều khiển trên Master tùy thuộc vào thiết kế của người dùng.

9
Hình 1: Giao diện SPI

Có thể mô tả tóm tắt các tín hiệu của giao diện SPI bằng bảng  
sau:

Tên tín hiệu Chiều Mô tả

Clock   đồng   bộ   truyền/nhận   dữ 


Master: đầu ra
SCK liệu   luôn   được   cung   cấp   bởi 
Slave: đầu vào
Master

Tín   hiệu   kết   nối   với   Slave.  


Master: đầu ra Master kích hoạt tín hiệu này nếu 
SS
Slave: đầu vào muốn   truyền/nhận   dữ   liệu   với 
Slave.

10
Đầu ra dữ liệu nối tiếp
­   Với   Master   tín   hiệu   có   tên 
Master: MOSI
Đầu ra Master Out Slave In
Slave: SDO hoặc SO
­ Với Slave tín hiệu có tên Slave 
Data Out

Đầu vào dữ liệu nối tiếp
­   Với   Master   tín   hiệu   có   tên 
Master: MISO
Đầu vào Master In Slave Out
Slave: SDI hoặc SI
­ Với Slave tín hiệu có tên Slave 
Data In

B ả ng 1: Các tín hi ệ u c ủ a giao di ệ n SPI

1.2.2. SPI truyền thông như thế nào?

Mô tả cơ chế

Hình dưới đây mô tả  quá trình truyền một gói dữ  liệu thực hiện bởi  


module SPI trong AVR, bên trái là chip Master và bên phải là Slave.

Hình 2: Truyền dữ liệu SPI
Giản đồ định thời giao tiếp SPI – Motorola

Khi   Master  muốn   truyền/nhận  dữ   liệu,   nó   kéo  tín   hiệu   chọn   chip   SS  
xuống   mức   thấp.   Sau   đó,   Master   cung   cấp   Clock   đồng   bộ   việc  
truyền/nhận dữ liệu trên đường SCK.

11
Vị trí lấy mẫu dữ  liệu và dịch dữ  liệu theo xung SCK phụ thuộc vào hai  
thông số cấu hình được quy định bởi chuẩn SPI là pha của Clock (CPHS – 
Clock Phase) và cực của Clock (CPOL – Clock Polarity)

Hình 3: Giản đồ timing của giao tiếp SPI theo Motorola
Cực của Clock quyết định trạng thái rảnh (idle) của tín hiệu SCK. Nếu  
CPOL = 0 thì mức logic khi idle của SCK là mức 0. Nếu CPOL = 1 thì 
ngược lại.

Dựa vào pha của Clock chúng ta sẽ biết lấy điểm mẫu ở đâu:

Nếu pha Clock bằng 0 thì dữ  liệu được lấy mẫu khi SCK chuyển từ 
trạng thái idle sang active, có thể  là cạnh lên hoặc cạnh xuống tùy vào 
giá trị CPOL.

Nếu pha Clock bằng 1 thì dữ  liệu được lấy mẫu khi SCK chuyển từ 
trạng thái active sang idle.

1.2.3. SPI là giao thức đồng bộ
Module SPI cho phép giao tiếp nối tiếp đồng bộ  kép giữa vi xử  lý với  
thiết bị ngoại vi:

­ Tín hiệu SCK được cung cấp bởi Master nhằm tạo xung đồng bộ cho  
phép dữ liệu được truyền đi hoặc khi đọc dữ liệu nhận được.

­ Khi tín hiệu SCK được phát ra thì tín hiệu này có thể thay đổi nhưng 
không làm hỏng dữ liệu. Lí do là trong giao thức SPI, tốc độ của dữ liệu  
truyền đi sẽ thay đổi theo sự thay đổi của SCK. Điều này rất có lợi nếu  

12
như  vi xử  lý bị  cấp xung đồng hồ  không chính xác (VD: bộ  dao động  
RC).

1.2.4. SPI là giao thức trao đổi dữ liệu
Dữ liệu lúc nào cũng được truyền qua lại giữa các thiết bị SPI. Thật ra,  
không có khái niệm thiết bị phát hay thiết bị  nhận trong giao thức SPI mà  
mỗi thiết bị có 2 đường dữ  liệu, một đường dữ liệu vào và một đường dữ 
liệu ra.

Dữ liệu truyền đi được điều khiển bởi xung SCK từ Master.

Khi được truyền đi, dữ liệu vào cần phải được đọc ngay nếu không sẽ 
bị mất đi và khi đó, giao thức SPI có thể sẽ ngưng hoạt động. Để tránh tình  
trạng này, lúc nào ta cũng phải đọc dữ liệu về ngay sau khi truyền đi cho dù 
dữ liệu đó không thực sự cần thiết.

Thường thì một tín hiệu chọn Slave sẽ  tác động mức thấp để  chỉ  ra 


Slave nào được truy cập. Tín hiệu này phải được sử dụng khi có nhiều hơn  
một Slave trong cùng hệ  thống và thường không sử  dụng đến khi trong 
mạch chỉ  có một Slave. Tuy nhiên, theo nguyên tắc thì ta nên sử  dụng tín  
hiệu này trong cả hai trường hợp trên.

Tín hiệu SS sẽ chỉ ra Slave nào mà Master muốn bắt đầu một quá trình  
trao đổi dữ liệu bằng giao thức SPI giữa thiết bị Slave đó và chính nó. Nếu 
tín hiệu trên đường SS là 0 thì chứng tỏ  giao thức SPI đang hoạt động. 
Ngược lại là mức 1 thì giao thức SPI sẽ không hoạt động.

Một đặc điểm khá quan trọng của tín hiệu SS là nó có tác dụng làm tăng  
cường khả  năng miễn nhiễm cho hệ  thống. Lí do là SS sẽ  Reset Slave để 
nó có thể nhận Byte dữ liệu tiếp theo.

SPI có 4 mode hoạt động, phụ thuộc vào cực tính và pha của xung đồng  
hồ. Trong trường hợp cực âm của xung đồng hồ, tín hiệu SCK sẽ   ở  mức  
thấp trong quá trình nghỉ và chuyển sang mức cao trong quá trình truyền dữ 
liệu. Ngược lại, đối với trường hợp cực dương của xung đồng hồ, tín hiệu 
SCK  ở  mức cao trong quá trình nghỉ  và chuyển sang mức thấp khi truyền  
dữ liệu:

13
SPI Mode CPOL CPHS

0 0 0

1 0 1

2 1 0

3 1 1

B ả ng 2: Các ch ế  đ ộ  truy ề n thông trong giao th ứ c SPI

SPI Mode 0:

Mô tả: Xung dương, dữ liệu được chốt trước khi dịch

Giản đồ thời gian:

14
Hình 4: Giản đồ thời gian của SPI ở Mode 0
SPI Mode 1:

Mô tả: Xung dương, dữ liệu được dịch đi trước khi chốt

Giản đồ thời gian

Hình 5: Giản đồ thời gian của SPI ở Mode 1
SPI Mode 2:

Mô tả: Xung âm, dữ liệu được chốt lại trước khi dịch

Giản đồ thời gian

15
Hình 6: Giản đồ thời gian của SPI ở Mode 2
SPI Mode 3:

Mô tả: Xung âm, dữ liệu bị dịch đi trước khi chốt lại

Giản đồ thời gian

Hình 7: Giản đồ thời gian của SPI ở Mode 3
1.3. Các kiểu kết nối SPI

1.3.1. Kết nối điểm – điểm ( point­to­point )
Đây là kiểu kết nối cơ bản nhất của giao thức SPI là một master kết nối 
với một slave.

16
Hình 8: Kết nối point­to­point, m ột master n ối v ới m ột  
slave
Cả  Master và Slave đều có thanh ghi dịch nối tiếp (thanh ghi dữ liệu 8  
bits)  ở  bên trong. Thiết bị  Master bắt đầu việc trao đổi dữ  liệu bằng cách 
truyền đi một bit vào thanh ghi dịch của nó, sau đó bit dữ liệu sẽ được đưa  
sang Slave theo đường tín hiệu MOSI (SDI), Slave sẽ truyền dữ liệu nằm  
trong thanh ghi dịch của chính nó ngược trở về Master thông qua đường tín  
hiệu MISO (SDO). Bằng cách này, dữ  liệu của hai thanh ghi sẽ được trao 
đổi với nhau. Việc đọc và ghi dữ  liệu vào Slave diễn ra cùng một lúc nên  
tốc độ trao đổi dữ liệu diễn ra rất nhanh. Do đó, giao thức SPI là một giao 
thức rất có hiệu quả.

Trong kiểu kết nối này, chỉ  có thiết bị  Master mới có thể  điều khiển 


(phát  ra) xung SCK.  Dữ   liệu sẽ   không  được  truyền  đi nếu như  Master  
không cung cấp xung SCK và tất cả các thiết bị Slave đều được điều khiển 
bởi xung nhịp phát ra từ  Master trong khi đó, Slave lại không có khả  năng  
phát xung.

1.3.2. Kết nối Multi­slave

Kết nối nhiều slave độc lập (Independent slaves) hay kết nối song 
song:

Trong cách kết nối này, tín hiệu SCK và SDO từ Master được cung cấp 
đến từng Slave. Đường tín hiệu SDO của các Slave nối chung lại với nhau  
và truyền về Master. Lúc này, Master sẽ lựa chọn Slave nào để trao đổi dữ 
liệu thông qua các chân SS riêng lẻ.

17
Hình 9: Kết nối nhiều slave song song
Kết nối nối tiếp hay kết nối Daisy­Chained

Trong kết nối này, chân SS và SCK của master nối song song đến tất cả 
các   slave.   Chân  SDO   của   slave   trước   nối  đến  SDI   của  slave   sau.   Chân 
MOSI của master nối  đến SDI của slave đầu tiên trong chuỗi và MISO 
được nối đến SDO của slave cuối cùng trong chuỗi.

Việc truyền dữ liệu từ master đến các slave và dữ  liệu master nhận từ 
slave cuối cùng được minh họa với các slave như sau:

Hình 10: Kết nối nối ti ếp (Daisy­Chained)

1.3.3. Kết nối Multi­master
Kết nối nhiều master độc lập (Independent masters hay Multi­master).  
Đối với kiểu kết nối này có nhiều cách kết nối và nhiều vấn đề hơn.

Kết nối nhiều master song song đến một slave

18
Với cách kết nối này, phần cứng ngoại vi phải hỗ trợ thêm các tín hiệu 
điều khiển khác để tránh xung đột khi hai master cùng truy xuất đến slave.  
Ví dụ một trong các cách hỗ trợ multi­master như trong hình sau: 

Hình 11: Kết nối hai master song song đến một slave
Giải pháp ở đây là ngoài các tín hiệu SPI thông thường, phần cứng của  
hai master SPI hỗ trợ thêm tín hiệu SS_IN để master này biết master kia có  
đang chọn slave hay không. Đồng thời tín hiệu SS nối đến slave được mắc 
qua một cổng XNOR để nếu hai master cùng chọn thì tín hiệu SS của slave  
vẫn không tích cực. Bên cạnh đó, trong mạch trên, ngoài txd (chính là tín  
hiệu MOSI) thì đường SCK cũng phải Hi­Z khi master không chọn slave.

Kết nối hai master với nhau

Đây là một dạng khác của multi­master. Trong đó hai master nối trực  
tiếp với nhau, giao tiếp qua 5 đường.

19
Hình 12: Kết nối hai master v ới nhau

20
CHƯƠNG II: GIAO DIỆN SPI TRÊN VI ĐIỀU KHIỂN 
STM32F4 VỚI LÕI ARM CORTEX­M4

1.1. Tổng quan về ARM và Cortex­M

Kiến trúc ARM là một tập hợp các chỉ  thị  thiết lập kiến trúc (ISA) vi  


xử   lý   máy   tính   32­bit   kiểu   RISC,   được   phát   triển   bởi   công   ty   ARM  
Holdings.

ST Bit  Cores designed by ARM 
Architecture Cortex profile
T width Holdings
1 ARM1 32/26 ARM1

2 ARM2 32/26 ARM2, ARM3

3 ARM3 32/26 ARM6, ARM7

4 ARM4 32/26 ARM8

5 ARM4T 32 ARM7TDMI, ARM9TDMI
ARM7EJ, ARM9E, 
6 ARM5 32
ARM10E
7 ARM6 32 ARM11
ARM Cortex­M0, ARM 
8 ARM6­M 32 Cortex­M0+, ARM Cortex­ Microcontroller
M1
9 ARM7­M 32 ARM Cortex­M3 Microcontroller
ARM Cortex­M4, ARM 
10 ARM7E­M 32 Microcontroller
Cortex­M7
ARM Cortex­R4, ARM 
11 ARM7­R 32 Real time
Cortex­R5, ARM Cortex­R7
ARM Cortex­A5, ARM 
Cortex­A7, ARM Cortex­
12 ARM7­A 32 A8, ARM Cortex­A9, ARM  Application
Cortex­A12, ARM Cortex­
A15, ARM Cortex­A17
ARM Cortex­A53, ARM 
13 ARM8­A 64/32 Application
Cortex­A57

21
14 ARM8­R 32 No announcements yet Real time

B ả ng 3: Danh sách các ki ế n trúc và lõi vi x ử  lý mà ARM đã  


thi ế t k ế

Vi xử  lý (Processor hay Microprocessor) là một linh kiện điện tử được 
chế tạo từ các tranzito thu nhỏ tích hợp lên trên một vi mạch cùng với một 
số thiết bị giao tiếp cơ bản. CPU chính là một vi xử lý.

Vi điều khiển (Microcontrller) là một vi mạch tích hợp bao gồm bộ  vi  
xử lý kết hợp cùng các thiết bị ngoại vi (RAM, Timer, cổng I/O, bộ chuyển 
đổi, …). Vi điều khiển có thể  hoạt động chỉ  với vài vi mạch hỗ  trợ  bên 
ngoài.

Hình 13: Vi mạch tích hợp của một vi điều khiển
Cortex là một thế  hệ  lõi vi xử  lý thuộc kiến trúc ARM, được thiết kế 
theo kiến trúc Harvard. Nó là một lõi hoàn chỉnh bao gồm bộ vi xử lý Cortex  
và một hệ thống các thiết bị ngoại vi được thiết kế theo giải pháp SoC.

 Cortex có nhiều bus, cho phép truy cập dữ  liệu không thẳng hàng, hỗ 
trợ đặt xóa các bit bên trong hai vùng 1Mbyte của bộ nhớ mà không cần xử 
lý luận lý (Boolean processor). Cortex gồm 3 dòng:

22
 ARM Cortex ­ A: bộ vi xử lý dành cho hệ điều hành và các ứng 
dụng của người dùng phức hợp. Cortex­A hỗ trợ các tập lệnh ARM, 
Thumb và Thumb­2. Cortex­A là sự cải tiến của ARM11.

 ARM Cortex ­ R: bộ vi xử lý dành cho hệ thống đòi hỏi về tính  
thời   gian   thực   (Real   Time   Control).   Cortex­R   hỗ   trợ   các   tập   lệnh 
ARM, Thumb và Thumb­2. Cortex­R là sự cải tiến của ARM9.

 ARM Cortex  ­  M: bộ  vi xử  lý được tối  ưu dành cho các  ứng 


dụng vi điều khiển (Microcontroller) với chi phí thấp mà vẫn đạt hiệu 
xuất cao. Dòng này chỉ hỗ  trợ  tập lệnh Thumb­2. Cortex­M là sự  cải 
tiến của ARM7.

Hình 14: Các sản phẩm trong dòng vi xử lý Cortex
Dòng Cortex­M từ  khi được giới thiệu đã cho ra đời 5 thế  hệ  vi xử  lý 
được thế kế trên 2 kiến trúc là ARMv6­M và ARMv7­M (xem hình).

23
Hình 15: Các thế hệ dòng vi xử lý Cortex­M
1.2. Tổng quan về bộ vi xử lý Cortex­M4

Bộ vi xử lý ARM Cortex­M4 là thế hệ vi xử lý thứ 2 của dòng Cortex­M 
dựa trên kiến trúc ARMv7­M, được giới thiệu vào năm 2010. Nó được mở 
rộng them về tập lệnh và kiến trúc mới.

Corex­M4 gồm một lõi CPU 32­bit, các thanh ghi 32­bit, đường dẫn dữ 
liệu nội bộ  32­bit và giao diện bus 32­bit, cùng một số  thành phần khác.  
Ngoài ra, Cortex­M4 cũng đã hỗ trợ một số hoạt động liên quan đến dữ liệu 
64­bit.

24
Hình 16: Kiến trúc bộ vi xử lý ARM Cortex­M4
1.3. Lõi Cortex­M4 (CPU Cortex)

Lõi của Cortex­M4 là một CPU RISC 32­bit được thiết kế dựa trên kiến  
trúc Harvard (đặc trưng bằng sự  tách biệt giữa vùng nhớ  chứa dữ  liệu và  
chương  trình).  Nó  là  phiên  bản  đơn  giản  hóa  từ  mô  hình lập trình  của  
ARM7/9 nhưng có một tập lệnh phong phú và tối  ưu hơn, hỗ  trợ  tốt cho  
các phép toán số nguyên, khả năng thao tác với bit và đáp ứng thời gian thực  
tốt hơn.

25
Hình 17: Lõi ARM7TDMI của Cortex­M4
CPU Cortex­M4 có cấu trúc đường  ống 3 đoạn (three­stage pipeline). 
Với kiến trúc này thời giản rỗi của một chu kỳ sẽ được hạn chế tối đa nên  
hiệu xuất tổng thể của nó được cải thiện rõ rệt.

Hình 18: Kiến trúc đường ống của ARM Cortex­M4

26
Bình thường Cortex­M4 có thể thực thi hầu hết lệnh trong một chu trình  
đơn, nhưng với cấu trúc pipeline này Cortex­M4 có thêm khả năng dự đoán 
rẽ  nhánh nên lệnh có thể  được thực thi nhanh hơn. Tức là nếu với một 
lệnh thường A đang được thực thi thì một lệnh B khác sẽ được giải mã và 
một lệnh C khác nữa sẽ được lấy về bộ nhớ. Còn đối với lệnh rẽ nhánh (if 
… else chẳng hạn), trong khi lệnh điều kiện được giải mã  ở  tầng decode 
thì bộ xử lý sẽ nạp lệnh dự định rẽ nhánh trong else, khi lệnh rẽ được thực 
thi, bộ  xử  lý sẽ  phân tích xem đâu là lệnh tiếp theo. Nếu lệnh rẽ  nhánh 
được chọn thì nó sẽ được thực thi ngay (vì nó đang ở tầng decode), còn nếu  
không thì bộ vi xử lý sẽ thực hiện tiếp lệnh tiếp theo (đã được lấy ở tầng  
fetch).

Lõi Cortex­M4 chỉ  hỗ  trợ  tập lệnh  Thumb­2. So với kiến trúc tập lệnh 


ARM hoặc Thumb thì Thumb­2 tối ưu hơn về hiệu suất và kích thước mã,  
bao gồm cả  bộ  phận phần cứng, nhân chu trình đơn, và thao tác bit­lĩnh  
vực.

Ngoài ra, Cortex­M4 còn được tích hợp chế độ  ngủ  (sleep mode) và tùy  


chọn khả  năng duy trì trạng thái   (optional state retention capabilities) cho 
phép đạt hiệu suất cao với mức tiêu thụ điện năng thấp.

1.4  SPI trên STM32

STM32 hỗ trợ 5 loại giao tiếp ngoại vi khác nhau. STM32 có giao diện  
SPI và I2C để giao tiếp với các mạch tích hợp khác. Hỗ trợ giao tiếp CAN 
cho các module, USB cho giao tiếp với các mạch tích hợp khác, STM cung 
cấp 2 khối điều khiển SPI có khả  năng chạy  ở  chế  độ  song công (full  
duplex) với tốc độ truyền dữ liệu lên tới 18MHz. Khối SPI tốc độ cao nằm 
trên APB2, khối SPI tốc độ thấp nằm trên APB1. Mỗi khối SPI có hệ thống 
thanh ghi cấu hình độc lập, dữ liệu truyền có thể dưới dạng 8­bit hoặc 16­
bit, thứ  tự  hỗ  trợ  MSB hay LSB. Chúng ta có thể  cấu hình mỗi khối SPI  
đóng vai trò master hay slave.

27
Hình 19: Sơ đồ khối SPI
Để hỗ trợ truyền dữ liệu tốc độ cao, mỗi khối SPI có 2 kênh DMA dành  
cho gửi và nhận dữ  liệu. Thêm vào đó là khối CRC dành cho cả truyền và  
nhận dữ liệu. Khối CRC đều có thể hỗ trợ kiểm tra CRC8 và CRC16. Các 
đặc tính này rất cần thiết khi sử dụng SPI để giao tiếp với MMC/SD card.

Hình 20: Kết nối giữa SPI và MMC/SD card

28
1.5 Thiết lập SPI trên STM32

Đầu tiên các module SPI được khởi tạo bằng cách xác định một kiểu 
biến “HardwareSPI” được sử  dụng để  điều khiển cách cổng SPI. Để  làm 
được điều này hãy bổ sung dãy mã sau:

Song song với đó, xác định một biến toàn cục với tên SRM là một con  
trỏ đến cấu trúc spi_reg_map trong đó với các giá trị của nó để thiết lập địa  
chỉ  bắt đầu của module SPI trong các bản đồ  bộ  nhớ  chụp màn hình từ 
trước.

Trong Reference Manual ta có thể thấy rằng SPI_CR1 đăng ký tại địa chỉ 
offset 0x00, đăng ký SPI_CR2 tại offset 0x04, SPI_SR tại offset 0x08 và như 
vậy, mộ cái khác sau đó.

Điều này phù hợp với cấu trúc và sau khi xác định các SRM biến toàn  
cầu trong đoạn code ta có thể truy cập vào đăng ký SPI như thế này: srm­> 
SR, srm­> CR1...

Dưới đây là cách bố trí của các thanh ghi:

29
bit 15 – BIDIMODE: cho phép chế độ dữ liệu hai chiều

o 0 : 2 – dòng chế độ dữ liệu theo một hướng lựa chọn

o 1 : 1 – chế độ dòng dữ liệu hai chiều được chọn

bit 14 – BIDIOE: Output cho phép trong chế độ hai chiều (bit này kết hợp  
với các bit BIDImode chọn hướng chuyển trong chế độ hai chiều)

o 0 : Output được vô hiệu hóa (chế độ chỉ nhận)

o 1 : Output được kích hoạt (chế độ chỉ truyền)

bit 13 – CRCEN: Phần cứng CRC cho phép việc tính toán (bit này chỉ  nên 
được viết khi SPI không hoạt động, SPE = 0 cho sự vận hành chính xác)

o 0 : vô hiệu hóa việc tính toán CRC

o 1 : kích hoạt việc tính toán CRC

bit 12 – CRCNEXT: CRC chuyển tiếp (khi SPI được cấu hình trong chế độ 
Full duplex CRCNEXT phải được viết ngay sau khi dữ liệu cuối cùng được 
ghi vào SPI_DR đăng ký)

o 0 : pha dữ liệu (không phải pha CRC)

o 1 : chuyển tiếp là CRC (pha CRC)

bit 11 – DFF: định dạng khung dữ liệu

o 0 : 8 bit khung dữ liệu

o 1 : 16 bit khung dữ liệu

bit 10 – RXONLY: chỉ nhận

o 0 : Full duplex

o 1 : Output được vô hiệu hóa

bit 9 – SSM: phần mềm quản lý Slave

o 0 : vô hiệu hóa phần mềm quản lý Slave

o 1 : kích hoạt phần mềm quản lý Slave

30
bit 8 –  SSI: chọn Slave nội bộ  (bit này có hiệu lực chỉ  khi bit SSM được  
thiết lập. Giá trị  của bit này được gắn lên chân NSS và giá trị  IO của chân 
NSS bị từ chối)

bit 7 – LSBFIRST: địng dạng khung (không nên thay đổi bit này khi việc  
truyền thông đang được diễn ra)

o 0 : MSB truyền đầu tiên

o 1 : LSB truyền đầu tiên

bit 6 – SPE: kích hoạt SPI

o 0 : vô hiệu hóa thiết bị ngoại vi

o 1 : kích hoạt thiết bị ngoại vi

bit 5, 4, 3 – BR[2:0]: kiểm soát tốc độ Baud (không nên thay đổi các bit này 
khi việc truyền thông đang được diễn ra)

o 000 : Fpclk/2

o 001 : Fpclk/4

o 010 : Fpclk/8

o 011 : Fpclk/16

o 100 : Fpclk/32

o 101 : Fpclk/64

o 110 : Fpclk/128

o 111 : Fpclk/256

bit 2 –  MSTR: lựa chọn Master (những bit không nên thay đổi khi việc 
truyền thông đang diễn ra )

o 0 : cấu hình Slave

o 1 : cấu hình Master

bit 1 –  CPOL: cực Clock (những bit không nên thay đổi khi việc truyền 
thông đang diễn ra )

o 0 : CLK chuyển thành 0 khi ở trạng thái rảnh

31
o 1 : CLK chuyển thành 1 khi ở trạng thái rảnh

bit 0 –  CPHA: pha Clock (những bit không nên thay đổi khi việc truyền  
thông đang diễn ra )

o 0 : tín hiệu clock đầu tiên là điểm lấy dữ liệu lần đầu

o 1 : tín hiệu clock thứ hai là điểm lấy dữ liệu lần đầu

bit 7 – TXEIE: Tx vùng đệm trống cho phép ngắt

o 0 : TXE gắn mặt nạ ngắt

o 1 : TXE không gắn mặt nạ ngắt; sử dụng để tạo ra một yêu cầu ngắt  
khi bước TXE được thiết lập

bit 6 – RXNEIE: Rx vùng đệm không trống cho phép ngắt

o 0 : RXNE gắn mặt nạ ngắt

o 1 : TXE không gắn mặt nạ ngắt; sử dụng để tạo ra một yêu cầu ngắt  
khi bước RXNE được thiết lập

bit 5 – ERRIE: lỗi cho phép ngắt (bit này điều khiển hệ  ngắt khi có điều 
kiện lỗi xảy ra [CRCERR, OVR, MODF])

o 0 : Lỗi được gắn mặt nạ ngắt

o 1 : Lỗi ngắt được kích hoạt

bit 2 – SSOE: kích hoạt đầu ra SS

32
o 0 : vô hiệu hoá đầu ra SS trong chế  độ  Master và các pin có thể  làm 
việc trong cấu hình đa Master

o 1 : kích hoạt đầu ra SS trong chế độ Master và các pin bị vô hiệu hóa; 
các pin không thể làm việc trong môi trường đa master

bit 1 – TXDMAEN: Tx vùng đệm DMA được kích hoạt

o 0 : Tx vùng đệm DMA được vô hiệu hóa

o 1 : Tx vùng đệm DMA được kích hoạt

bit 0 – RXDMAEN: Rx vùng đệm DMA được kích hoạt

o 0 : Rx vùng đệm DMA được vô hiệu hóa

o 1 : Rx vùng đệm DMA được kích hoạt

bit 7 – BSY: bước Busy (bước này được thiết lập và xóa bởi phần cứng)

o 0 : SPI không hoạt động

o 1 : SPI đang truyền thông hoặc vùng đệm Tx là rỗng

bit 6 –  OVR: bước Overrun (bước này được thiết lập bởi phần cứng và 
được thiết lập lại bởi chuỗi các phần mềm)

o 0 : không xảy ra Overrun

o 1 : xảy ra Overrun

bit 5 –  MODF: chế  độ  lỗi (bước này được thiết lập bởi phần cứng và 


được thiết lập lại bởi chuỗi các phần mềm)

o 0 : không xảy ra chế độ lỗi

33
o 1 : xảy ra chế độ lỗi

bit 4 – CRCERR: bước CRC lỗi (bước này được thiết lập bởi phần cứng  
và được xóa bởi phần mềm bằng cách viết 0)

o 0 : giá trị CRC nhận được phù hợp với giá trị SPI_RXCRCR

o 1 : giá trị CRC nhận được không khớp với giá trị SPI_RXCRCR

bit 3 – URD: bước Underrun (bước này được thiết lập bởi phần cứng và  
được thiết lập lại bởi chuỗi các phần mềm)

o 0 : không xảy ra Underrun

o 1 : xảy ra Underrun

bit 1 – TXE: truyền vùng đệm rỗng

o 0 : Tx vùng đệm khác rỗng

o 1 : Tx vùng đệm rỗng

bit 0 – RXNE: nhận vùng đệm khác rỗng

o 0 : Rx vùng đệm rỗng

o 1 : Rx vùng đệm khác rỗng

Tiếp đó ta có module SPI đã được khởi tạo trong các code và đó cũng là  
một phương pháp tiếp cận của các thanh ghi cấu hình. Bây giờ  ta chỉ việc 
cấu hình module được sử dụng với bộ điều khiển ethernet ENC28J60. 

34
 Trong ENC28J60 thông số kỹ thuật được đề  cập rằng nó có một giao 
diện   SPI   với   tốc   độ   clock   lên   tới   20MHz   vì   thế   với   khởi   tạo   giá   trị 
SPI_18MHz có thể cung cấp hiệu suất tối đa.

Tham số thứ hai của phương thức begin() là bitOder. Nó có thể lấy một 
trong hai giá trị sau:

LSBFIRST : little­endian

MSBFIRST : big­endian

Hai giá trị này được xác định trong “wirish.h” như sau:

Từ  sơ  đồ  trong datasheet ENC28J60 ta có thể  nhìn thấy dữ  liệu phải 


được gửi ra từ MSB trước để lựa chọn đây là MSBFIRST.

Tham số  thứ  3 của phương thức begin() là Mode. Điều này được định 


nghĩa trong “spi.h”:

Các   chip   chỉ   hỗ   trợ   chế   độ   0,0   nên   các   thông   số   của   phương   thức 
begin() chỉ có thể ở SPI_MODE_0

Tiếp sau là dòng khởi động cho module SPI:

CSS là viết tắt của “Chip Slave Select” và trên ENC28J60 được dùng để 
định tuyến chân số 7 của kết nối UEXT của các module điều khiển ethernet  

35
mà sau đó được chuyển đến chân kỹ thuật số D4 trên bảng Leaf là STM32  
chân #57

Sử  dụng cùng một phương pháp, ta có thể  dẫn đường cho tất cả  các  


chân SPI:

CSS ­> D4 ­­­> Pin 57 = PB5 ­ I2C1_SMBAI
SCK ­> D13 ­­­> Pin 21 = PA5 ­ SPI1_SCK / ADC12_IN5
MISO ­> D12 ­­­> Pin 22 = PA6 ­ SPI1_MISO / ADC12_IN6 / TIM3_CH1
MOSI ­> D11 ­­­> Pin 23 = PA7 ­ SPI1_MOSI / ADC12_IN7 / TIM3_CH2

Vấn đề ở đây là thư viện Maple SPI yêu cầu (và sử dung) pin D10 giống 
như chip chọn. Chúng ta có thể kiểm tra điều này bằng cách đọc các giá trị 
sử dụng các phương pháp như thế này "nssPin ()" :

Vì Olimex này đã đặt một jumper trên bảng phát triển để  chuyển tín 
hiệu đến D10 nhưng ta cũng có thể thiết lập pin bằng cách chuyển nó từ vị 
trí mặc định của D4:

Để  kiểm tra xem các chân đã được thiết lập một cách chính xác bằng 
cách khởi tạo của cổng SPI ta phải đọc hai thanh ghi: GPIOA_CRL (cho 
SCK, MISO và MOSI) và GPIOB_CRL (CSS).

Các giá trị là:

Px7  Px6  Px5  Px4  Px3  Px2  Px1  Px0
       ­­­­ ­­­­ ­­­­ ­­­­ ­­­­ ­­­­ ­­­­ ­­­­
CRLA ­ 1011 0100 1011 1011 0100 0100 0100 0100 ===> 0xB4BB4444
CRLB ­ 0100 0100 0011 1000 0100 0100 0100 0100 ===> 0x44384444

Ta cũng phải liên kết các bit trong nhóm 4­bit để phù hợp với các chân 7  
đến 0. Hai bit đầu tiên của nhóm thiết lập phần CNF và hai bit cuối cùng  
của nhóm thiết lập MODE được thiết lập giá trị dịch theo thiết lập sau:

36
SCK: PA5: 1011: chức năng thay thế Push­pull
MOSI: PA7: 1011: chức năng thay thế Push­pull
MISO: PA6: 0100: Input nổi / Input Pull­up
CSS: PB5: 0011: Mục đích chung đầu ra Push­pull

37
CHƯƠNG III: NHẬN XÉT VỀ GIAO DIỆN SPI

3.1.   Những ưu điểm của SPI

­ Truyền thông song công.

­ Lượng dữ liệu đưa vào cao hơn giao thức I2C.

­ Không giới hạn ở 8­bit word trong trường hợp truyền bit.

­ Tùy ý lựa chọn size thông tin nội dung và mục đích.

­ Giao tiếp phần cứng đơn giản.

­ Yêu cầu nguồn tiêu chuẩn thấp hơn I2C mạch ít cồng kềnh.

­ Không có sự điều chỉnh hay các chế độ truyền thất bại liên quan.

­ Slave sử  dụng clock của master và không cần độ  chính xác của bộ  dạo 


động (oscillator).

­ Không cần thiết bộ truyền nhận.

­ Nhiều nhất là một dây tín hiệu bus duy nhất trên thiết bị (CS), tất cả dây 
khác được chia sẻ.

3.2.  Những nhược điểm của SPI

­ Yêu cầu nhiều dây trên IC hơn I2C.

­ Không  ấn định địa chỉ, tín hiệu chip select được yêu cầu trên bus được  
chia sẻ.

­ Không có luồng điều khiển phần cứng.

­ Không có chế độ nhận biết slave.

­ Các bus multi­master thì ít và bất tiện, thường sử  dụng giới hạn slave  
đơn.

­ Không có một tiêu chuẩn chính thức, không có sự phê duyệt phù hợp.

­ Chỉ làm việc ở khoảng cách ngắn hơn so với Rs232, Rs485 hay CAN.

38
39
KẾT LUẬN

Qua việc hoàn thành bài tập lớn này đã giúp nhóm chúng em hiểu rõ thêm về:
 Thế nào là chuẩn giao tiếp SPI
 Cấu trúc, các chức năng và hoạt động của giao tiếp SPI
 Ứng dụng giao tiếp SPI để giải quyết các vấn đề mắc phải trong 
Lập trình nhúng
 Phân tích ưu, nhược điểm của giao tiếp SPI

Vận dụng kiến thức đồ họa cơ sở được học ở trường, kết hợp với những tài 
liệu tham khảo trên mạng và sự  hướng dẫn tận tình của thầy giáo TS. Phạm 
Văn Hà nhóm chúng em đã hoàn thành bài tập được giao. Với tầm hiểu biết có  
hạn nên trong quá trình hoàn thiện không tránh khỏi thiếu sót nên nhóm chúng  
em rất mong nhận được sự chỉ dẫn, bổ sung, góp ý và sự cảm thông sâu sắc của  
thầy để bài tập của chúng em được hoàn thiện hơn.

Chúng em xin chân thành cảm ơn.!!
Hà Nội, ngày 12 tháng 12 năm 2014

40
TÀI LIỆU THAM KHẢO

Giáo trình Lập trình nhúng cơ bản – TS. Phạm Văn Hà

Các tài liệu tổng hợp trên Internet:

o  http://vi.wikipedia.org/ 

o  http://www.hocavr.com/ 

o  http://icdesignvn.com/forum/ 

o  http://codientu.org/ 

o  http://eproblogviet.blogspot.com/ 

o  http://vozforums.com/ 

o  http://vn­zoom.com/ 

1.3.1.

41

You might also like