1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Bài giảng môn vi xử lý chương 6

33 3 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Chương 6 Cổng Nối Tiếp (SPI - Serial Port Interface)
Tác giả Lưu Phú
Trường học Trường Đại Học Bách Khoa Hà Nội
Chuyên ngành Vi Xử Lý
Thể loại Bài giảng
Năm xuất bản 2024
Thành phố Hà Nội
Định dạng
Số trang 33
Dung lượng 0,95 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

 MCU8051 có cổng nối tiếp SPIonchip,cấu hình như sau: Ngõ TXD=P3.1: ngõ phát data nối tiếp Ngõ RXD=P3.0: ngõ thu data nối tiếp  Cổng nối tiếp chuyển data từ song song sang nối tiếp kh

Trang 1

CHƯƠNG 6 CỔNG NỐI TIẾP(SPI-SERIAL PORT INTERFACE)

Trang 2

6.1 Giới thiệu

6.2 Các thanh ghi SBUF và SCON

6.3 Các mode làm việc của SPI

6.4 Khởi động ,truy xuất các thanh ghi SPI

6.5 Truyền thông đa xử lý(Multiprocessor)

6.6 Tạo baud rate cho SPI

6.7 Các ví dụ ứng dụng SPI

Trang 3

 MCU8051 có cổng nối tiếp (SPI)onchip,cấu hình như sau:

Ngõ TXD=P3.1: ngõ phát data nối tiếp

Ngõ RXD=P3.0: ngõ thu data nối tiếp

 Cổng nối tiếp chuyển data từ song song sang nối tiếp khi phát và từ nối tiếp sang song song khi thu

 Cổng nối tiếp làm việc được mode đồng bộ(data-clock) tần số cố định và bất

đồng bộ(UART) baud rate thay đổi được qua lập trình Timer1 và/hoặc Timer2 MCU8052.

 Cấu hình cổng nối tiếp làm việc song công(full duplex)(phát và thu đồng thời) và

có mạch đệm thu(lưu ký tự thu trước đó trong khi đang thu ký tự hiện tại),CPU

có thể đọc ký tự thu trong bộ đệm thu bất kỳ lúc nào miễn là trước khi thu xong

ký tự hiện tại

 Hai SFR quản lý hoạt động của cổng nối tiếp là SCON và SBUF

Trang 4

Giáo Trình Vi Xử Lý Lưu Phú 4

Hình 6.1: Sơ đồ khối cổng nối tiếp

Trang 5

6.2.1 Thanh ghi SBUF

 Địa chỉ 99H,không truy xuất bit được

 SBUF phát và thu độc lập: SBUF phát chỉ ghi,SBUF thu chỉ đọc

 Trường hợp thu,xung CK (baudrate)thu dịch đủ 8 bit data thu được vào thanh ghi mới chuyển sang SBUF thu.Điều này đảm bảo bộ đệm thu lưu ký tự thu trước đó trong lúc thu

ký tự hiện tại

 Truy xuất cổng nối tiếp

- Phát data: ghi data ra SBUF

- Thu data: đọc data từ SBUF

 Thông thường nên dùng thanh ghi A truy xuất cổng nối tiếp vì xét được parity!

 SBUF thu và SBUF phát riêng mặc dù cùng ký hiệu!

Trang 6

6.2.2 Thanh ghi SCON

 Địa chỉ 98H,truy xuất bit được

 Chứa các bit trạng thái và điều khiển SPI

Ví dụ 6.1: Khởi động SPI làm việc mode

UART 8 bit,baud rate thay đổi,có thu data

Giải:

SPI làm việc mode 1 UART 8 bit

SM0SM1=01,cho phép thu REN=1,

đặt TI=1 từ đầu vì SBUF phát rỗng

đa xử lý ở mode 2&3;RI không kích hoạt nếu bit thu thứ 9=0 SCON.4 REN 9CH Đặt/xóa=Cho phép /cấm thu SPI SCON.3 TB8 9BH Bit phát D8≡bit phát thứ 9 ở

mode 2&3;đặt/xóa bằng mềm SCON.2 RB8 9AH Bit thu D8≡bit thu thứ 9 ở mode

2&3 SCON.1 TI 99H Cờ ngắt phát.Đặt=1 bằng cứng

khi phát xong ký tự;xóa bằng mềm

SCON.0 RI 98H Cờ ngắt thu.Đặt=1 bằng cứng khi

thu xong ký tự;xóa bằng mềm

SM0 SM1 Mode Mô tả Baud rate

0 0 0 Ghi dịch Cố định=Fosc/12

0 1 1 8 bit UART Thay đổi(đặt bằng timer)

1 0 2 9 bit UART Cố định=Fosc/32 hay Fosc/64

1 1 3 9 bit UART Thay đổi(đặt bằng timer)

Bảng B6.1: Tóm tắt thanh ghi SCON Bảng B6.2: Các mode SPI

Trang 7

6.3 Các mode làm việc của SPI

6.3.1 Mode 0- Ghi dịch 8 bit : SM0SM1=00

 Mode ghi dịch hay truyền đồng bộ:

RXD≡data in/out,TXD≡xuất xung CK

tần số cố định=Fosc/12

 Phát data-shift out

- Bắt đầu phát:bất kỳ lệnh ghi data

ra SBUF

- Từng bit data xuất ra trên RXD

ổn định trong 1MC,xuất LSB trước

- Xung CK xuất ra trên TXD cạnh xuống

tại S3P1 và cạnh lên tại S6P1

- Ngay sau khi xuất xong bit data thứ 8 D7,

TI=1 báo xuất xong 1 ký tự,TXD=1 ngưng

phát xung CK

→xóa TI bằng mềm để nhận dạng lần phát kế tiếp

Hình 6.2: Định thì phát data mode 0

Trang 8

6.3.1 Mode 0- Ghi dịch 8 bit : SM0SM1=00

 Thu data-shift in:

- Bắt đầu thu cho REN=1(thường ở đầu chương trình) và RI=0

- Xung CK xuất ra trên TXD và dịch data vào ngõ RXD ở cạnh lên,thu LSB trước

- Ngay sau khi dịch xong bit data thứ 8 D7,RI=1 báo thu xong ký tự,TXD=1 ngưng phát xung

CK

 Mode 0 thích hợp giao tiếp với các ngoại vi

dạng thanh ghi dịch để mở rộng ngoại vi(hình 6.4)

Hình 6.3: Định thì thu data mode 0

Hình 6.4: SPI mode 0 giao tiếp thanh ghi dịch

Trang 9

6.3.1 Mode 0- Ghi dịch 8 bit : SM0SM1=00

Ví dụ 6.2: Viết chương trình nhập data từ P1 xuất ra SPI mode 0 và nhập data từ SPI mode 0 xuất ra P2 Giải:

SHIFT_OUT:

JNB TI,$ ;chờ phát xong ký tự trước đó CLR TI ;đã phát xong,xóa cờ ngắt phát MOV SBUF,A ;bắt đầu shift out

RET SHIFT_IN:

JNB RI,$ ;chờ shift in xong ký tự MOV A,SBUF ;lấy ký tự

RET END

Trang 10

6.3.2 Mode 1- UART 8 bit: SM0SM1=01

 Mode 1 SPI làm việc bất đồng bộ UART 8 bit(Universal Asynchronous Receiver

Transmitter)

 Cấu hình UART 8 bit: chuỗi data nối tiếp gồm 10 bit: bit START=0,8 bit data LSB truyền trước,bit STOP=1

 Baud rate thay đổi được bằng cách cài đặt Timer1 và/hoặc Timer2 MCU8052

 Xung nhịp đồng bộ các thanh ghi dịch SPI tạo từ bộ đếm 4 bit chia 16,ngõ ra là baud

rate.Xung CK ngõ vào bộ đếm lập trình từ Timer1 và/hoặc Timer2(sẽ phân tích sau)

Trang 11

6.3.2 Mode 1- UART 8 bit: SM0SM1=01

 Phát data: Bất kỳ một lệnh ghi data ra SBUF sẽ bắt đầu phát data,tuy nhiên phải chờ đến khi bộ đếm tràn qua 0 bắt đầu chu kỳ đếm mới,data mới thực sự phát ra ngõ TXD

TXD lần lượt xuất ra :

- Bit START=0,8 bit data LSB đi trước,bit STOP=1

- Ngay vừa khi xuất bit STOP,cờ TI=1(trước đó phải xóa TI) báo phát xong ký tự

Trang 12

6.3.2 Mode 1- UART 8 bit: SM0SM1=01

 Thu data: Ngay khi RXD=1→0,bộ đếm bị xóa về 0 để đồng bộ 16 xung đếm trong thời gian thu 1 bit data,lấy mẫu data ở giữa 16 xung đếm

- Đầu tiên RXD=1→0 bắt đầu bit START,bộ đếm xóa và sau 8 xung đếm RXD

vẫn =0,sẽ chấp nhận là bit START,nếu không đúng SPI xem như là nhiễu và chờ RXD chuyển biến từ 1→0 kế tiếp

- Nếu nhận đúng bit START,SPI loại bỏ bit START và bắt đầu dịch 8 bit data LSB đi trước vào thanh ghi dịch thu và sau cùng là STOP bit

- Ngay vừa khi thu STOP bit,cờ RI=1 báo SBUF thu xong ký tự

 Cờ RI=1 chỉ khi thỏa 2 điều kiện sau:

1.Trước đó RI=0→Sau khi đọc ký tự từ SBUF phải có lệnh xóa RI để nhận dạng lần thu kế tiếp!

2 Khai báo SM2=0,hoặc nếu SM2=1 và STOP bit=1

 Điều kiện SM2=1 và STOP bit=bit thứ 9=D8 bằng 1→RI=0 trong mode truyền

đa xử lý với bit thứ 9=0!

Trang 13

6.3.3 Mode 2- UART 9 bit baud rate cố định: SM0SM1=10

 Mode 2 SPI làm việc như UART 9 bit thu /phát chuỗi data 11 bit gồm 1 bit START,9 bit data,1 bit STOP

 Bit data thứ 9=D8 trước khi phát được nạp vào bit TB8 và khi thu được trả về bit RB8

 Baud rate cố định =Fosc/32 hay Fosc/64(xem phần sau)

 Bit data thứ 8 thường có thể là bit parity cẩn thêm vào để nhận dạng sai hoặc STOP bit thứ 2 để dễ đồng bộ

6.3.4 Mode 3- UART 9 bit baud rate thay đổi: SM0SM1=11

 Mode 3 SPI làm việc như UART 9 bit giống mode 2

 Baud rate thay đổi như mode 1

 Ngoại trừ mode 0,các mode 1,2,3 đều truyền song công,nghĩa là vừa thu vừa phát do:

- TXD≡ngõ phát,RXD≡ngõ thu

- Thanh ghi SBUF thu và SBUF phát độc lập

Trang 14

6.4.1 Bit cho phép thu REN

 Đặt REN=1 cho phép thu, xóa REN=0 cấm thu

 Sử dụng lệnh truy xuất byte qua SCON ,thường ở đầu chương trình cố định mode thu:

MOV SCON,#XXX1XXXXB

Sử dụng lệnh truy xuất bit ,thường ở giữa chương trình khi mode thu được phép: SETB REN

6.4.2 Bit data thứ 9

 Mode 2 và 3 sử dụng bit data thứ 9=D8

 Trước khi phát nạp bit data thứ 9 vào TB8

 Khi thu xong,đọc bit data thứ 9 từ RB8

6.4.3 Thêm bit parity

 MCU8051 có bit P trong SFR PSW kiểm tra chẵn tự động cập nhật theo (A)(tổng số bit 1 trong A và bit P=số chẵn)

 Sử dụng bit data thứ 9 làm bit parity để phát hiện sai khi truyền

Trang 15

6.4.3 Thêm bit parity

 Phát :

MOV SBUF,A ;phát data 9 bit

 Thu:

MOV A,SBUF ;thu data 9 bit

MOV C,RB8 ; nạp bit thứ 9 vào C

 Trường hợp truyền mã ASCII chỉ cần 7 bit,thêm bit D7=parity bit,chỉ cần UART 8 bit:

UART 8 bit parity lẻ:

 Thu: RI=1 khi thu xong ký tự JNB RI,$ ;chờ thu xong ký tự CLR RI ;xóa RI để nhận dạng lần thu kế tiếp MOV A,SBUF ;thu ký tự

Trang 16

 Một MCU8051 làm chủ(master),các MCU8051 còn lại làm tớ(slaver)

 Kết nối ngõ TXD MCU chủ với các ngõ RXD MCU tớ(đảm bảo fanout)

 Các ngõ TXD các MCU tớ kết nối với ngõ RXD MCU chủ (nên qua mạch đệm 3 trạng thái để tránh wired AND)

 Khai báo các MCU làm việc ở mode 2 hoặc 3 với SM2=1

Hình 6.7: Mô hình truyền thông đa xử lý

Trang 17

 Nghi thức giao tiếp:

 MCU chủ phát lệnh yêu cầu giao tiếp với điều kiện bit TB8=1 và data là mã địa chỉ chọn MCU tớ cần giao tiếp

 Các MCU tớ ban đầu khai báo SM2=1 và khi nhận xong ký tự là lệnh với TB8=1 sẽ đặt cờ RI=1,đọc ký tự và so sánh đúng mã yêu cầu không.Nếu có 1 MCU đúng mã yêu cầu sẽ xóa SM2=0,các MCU còn lại không đúng mã vẫn giữ nguyên SM2=1

 MCU chủ thiết lập xong với MCU tớ có địa chỉ theo yêu cầu(SM2=0) và bắt đầu

truyền data

 Data khác lệnh ở chỗ bit TB8=0,nên khi thu xong ký tự chỉ có MCU tớ có SM2=0 mới đặt cờ RI=1báo tiếp nhận ký tự,còn các MCU khác SM2=1 và TB8=0 nên không đặt cờ RI=1, không đáp ứng và tiếp tục thực hiện công việc riêng cho đến khi nhận lệnh mới thiết lập giao tiếp lại.MCU tớ sau khi kết thúc giao tiếp trả SM2=1 trở lại

 Kết hợp truyền thông đa xử lý với ngắt SPI(xem chương ngắt) sẽ rất hiệu quả trong việc thiết lập mạng giao tiếp cục bộ,mở rộng ngoại vi…

 SM2 không ảnh hưởng mode 0,còn trong mode 1 chỉ dùng để kiểm tra bit

STOP=1(bit thứ 9),mới đặt RI=1

Trang 18

 Mode 0: Tần số xung CK shift=Fosc/12

Nếu Fosc=12MHz→fCK shift= 1MHz

 Mode 2: Baud rate= Fosc/64 SMOD=0

hay baud rate=Fosc/32 SMOD=1

SMOD= bit 7 trong thanh ghi PCON.Lưu ý

là PCON không truy xuất bit được.

Khi mới reset hệ thống SMOD=0,

để đặt SMOD=1 :

MOV A,PCON SETB ACC.7 MOV PCON,A

Hình 6.8: Nguồn tạo baudrate cho các mode SPI

Trang 19

6.6.1Tạo baud rate cho mode 1 và 3 từ Timer1

 Thông thường chọn Timer1 mode 2 tự động nạp lại tạo baud rate sẽ chính xác(trường hợp baud rate chậm quá phải sử dụng mode 1,ta phải dùng ngắt Timer1 hay Timer CK ngoài)

 Khai báo SMOD như mode 2

Công thức tính baud rate:

= Ố ĐỘ À 1 × 2

32Công thức tính giá trị đặt trước Timer1:

Á Ị ĐẶ ƯỚ =

Ố ĐỘ À 1Nếu sử dụng mode timer(xung Timer CK trong)

Á Ị ĐẶ ƯỚ = /

Ố ĐỘ À

 Giá trị đặt trước lấy số âm tương ứng

Trang 20

6.6.1 Tạo baud rate cho mode 1 và 3 từ Timer1

Ví dụ 6.3: Tính giá trị đặt trước cho Timer1 với baudrate=1200 và Fosc=12MHz,SMOD=0 Viết đoạn chương trình tạo baud rate cho mode 1(hoặc 3) sử dụng Timer1

Giải:

Tốc độ tràn Timer 1=1200x32=38400Hz=38.4KHz Giá trị đặt trước= 1000KHz/38.4=26.04→làm tròn =26

ℎự ế = 1000/26 /32 ≈ 1202 →sai số=0.16%

Các lệnh như sau:

Trang 21

6.6.1 Tạo baud rate cho mode 1 và 3 từ Timer1

Bảng B6.3: Tóm tắt baud rate&giá trị đặt trước theo theo Fosc cho Timer1

Trang 22

6.6.2 Tạo baud rate cho mode 1 và 3 sử dụng Timer2

 MCU8052 có thêm Timer2 16 bit tạo baud rate tương tự như Timer1

 Đặt RCLK=1,TCLK=0: Timer2 tạo baud rate thu,Timer1 tạo baud rate phát

 Đặt RCLK=0,TCLK=1: Timer2 tạo baud rate phát,Timer1 tạo baud rate thu

 Đặt RCLK=TCLK=1: Timer 2 tạo baud rate cả phát và thu

 Tính giá trị đặt trước choTimer2:

 Giá trị đặt trước lấy số âm tương ứng

 Lưu ý Timer2 16 bit,nạp giá trị đặt trước vào 2 thanh ghi RCAP2H(byte cao) và

RCAP2L(byte thấp)

Trang 23

6.6.2 Tạo baud rate cho mode 1 và 3 sử dụng Timer2

Ví dụ 6.4: Sử dụng Timer2 tạo baud rate=9600,cho Fosc=11.059MHz

… CLR C_T2 SETB RCLK SETB TCLK MOV RCAP2H,#HIGH(-36) MOV RCAP2L,#LOW(-36) SETB TR2

Trang 24

 Các ví dụ sau sử dụng Fosc=11.059MHz để đảm bảo baud rate chính xác!

Ví dụ 6.5: Viết các lệnh khởi động MCU8051 SPI làm việc như UART 8 bit baud rate=9600,cho phép thu Giải:

RET

Trang 25

Ví dụ 6.7: Viết một chương trình con tên IN_CHR thu ký tự ASCII có cẩn parity lẻ(như vd6.6),đặt (C)=1 nếu thu ký tự sai parity

Giải:

Do đó nếu ký tự thu được trong A sai parity(tổng số bit 1 là số chẵn)→(P)=0.Lệnh CPL C

sẽ đặt (C)=1 khi thu ký tự sai parity!

Trang 26

Ví dụ 6.8: Viết một chương trình cho MCU8051 SPI làm việc như 1 UART 8 bit baudrate

=19200:

1 Liên tục phát các ký tự mã ASCII có cẩn bit parity lẻ chứa trong vùng nhớ RAM nội địa chỉ từ 30H→7FH,sử dụng chương trình con OUT_CHR ở vd 6.6.Sau khi phát xong ký tự cuối quay về phát lại từ đầu

2 Thu các ký tự mã ASCII có cẩn bit parity lẻ,trả về mã ASCII và cất trong vùng nhớ RAM ngoài địa chỉ đầu từ 1000H,cho đến khi thu đươc mã NULL=00H,quay về địa chỉ đầu tiếp tục thu,sử dụng chương trình con IN_CHR ở vd6.7.Nếu thu ký tự sai parity đặt bit P1.0=1 Giải:

 BR=19200 nên phải đặt SMOD=1 với giá trị nạp lại cho Timer1=#-3

 Yêu cầu SPI làm việc song công nên phải lặp vòng kiểm tra cờ TI và RI

 Chương trình con OUT_CHR và IN_CHR đã xử lý việc mã ASCII có cẩn bit parity

 Lặp vòng phát lại từ đầu khi địa chỉ RAM nội=80H,địa chỉ đầu=30H

Trang 27

ORG 0

MOV SCON,#52H;SPI mode 1,cho phép thu,phát ký tự ngay

MOV A,PCON ;lấy nội dung PCON

SETB ACC.7 ;SMOD=1

MOV PCON,A ;x2 BR

MOV TMOD,#20H;Timer1 mode 2 CK trong

MOV TH1,#-3 ;BR=19200(SMOD=1)

MOV TL1,TH1 ;nạp TL1 từ vòng đầu

SETB TR1 ;chạy Timer1

MOV R0,#30H ;R0 trỏ địa chỉ đầu RAM nội

MOV DPTR,#1000H;DPTR trỏ đc đầu RAM ngoài

CHK_TX:

JNB TI,CHK_RX ;TI=0,nhảy đến kiểm tra RI

MOV A,@R0 ;chuyển ký tự phát vào A

CALL OUT_CHR ;gọi CTC phát ký tự

INC R0 ;R0 trở địa chỉ kế tiếp

CJNE R0,#80H,CHK_RX;chưa hết vùng nhớ tiếp tục

;chỉ đầu RAM ngoài SJMP CHK_TX ; quay lại từ đầu

Trang 28

; -

RET

; -

Trang 29

Ví dụ 6.9: Thiết kế một mạng truyền cục bộ ứng dụng đa xử lý làm việc như sau:

 Mạng có 1 MCU master U1và 2 MCU slaver U2 và U3,ký hiệu slaver0: địa chỉ 30H và slaver1:địa chỉ 31H

 Một SW kết nối P3.2 của MCU master: SW=0:master kết nối slaver0,SW=1:master kết nối slaver1

 Các MCU master và slaver có kết nối DIPSW8 ở P1 để nhập data và diplay data output bằng

logicstate ở P2

 Các MCU slaver kết nối ngõ TXD với RXD của MCU master qua cổng đệm 3 trạng thái

74HC244,chân P3.2 điều khiển cổng đệm

 Ban đầu master phát mã địa chỉ chọn slaver(slaver0 địa chỉ 30H,slaver1 địa chỉ 31H)theo trạng thái

SW

 Slaver được chọn trả lại mã địa chỉ của mình cho master để xác nhận và thiết lập đường truyền

 Slaver không được chọn tiếp tục thực hiện công việc nhập data từ P1 và xuất ra P2

 Master phát data nhập từ P1 cho slaver được chọn và thu data từ slaver xuất ra P2

 Slaver được chọn thu data từ master xuất ra P2 và phát data nhập từ P1 cho master

 Master phát ký tự NULL=00H kết thúc truyền quay lại từ đầu chọn slaver mới

 Slaver thu được mã NULL=00H,kết thúc truyền và quay lại tiếp tục công việc nhập data từ P1 và xuất ra P2

 Cho baurate=9600,Fosc=11.059Mhz

Trang 30

Sơ đồ mạch điện như hình

vd6.9 :

Hình vd6.9

Trang 31

 Chương trình nạp cho MCU master U1:

MOV TL0,TH0 SETB TR1 Loop:

Trang 32

TIEP:

MOV A,P1 ;nhập data từ P1

JZ Loop ;data=#0,ngừng truyền quay về từ đầu CALL THU ;thu data từ slaver

MOV P2,A ;xuất data thu được ra P2 JMP TIEP ;lặp vòng truyền tiếp SEL1:

MOV A,#SLAV_1 ;nạp địa chỉ slaver1 SETB SM2 ;SM2=1 để thu mã lệnh từ slaver được chọn SETB TB8 ;truyền mã lệnh

CALL PHAT ; phát địa chỉ slaver cần chọn

Trang 33

; - PHAT:

JNB TI,$

CLR TI MOV SBUF,A RET

; - THU:

JNB RI,$

CLR RI MOV A,SBUF RET

;======================================================== END

Ngày đăng: 02/11/2022, 09:56

TỪ KHÓA LIÊN QUAN