Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 33 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
33
Dung lượng
0,95 MB
Nội dung
CHƯƠNG CỔNG NỐI TIẾP(SPI-SERIAL PORT INTERFACE) Giáo Trình Vi Xử Lý Lưu Phú Tóm tắt: 6.1 Giới thiệu 6.2 Các ghi SBUF SCON 6.3 Các mode làm việc SPI 6.4 Khởi động ,truy xuất 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 Giáo Trình Vi Xử Lý Lưu Phú 6.1 Giới thiệu MCU8051 có cổng nối tiếp (SPI)onchip,cấu 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 phát từ nối tiếp sang song song thu Cổng nối tiếp làm việc mode đồng bộ(data-clock) tần số cố định bất đồng bộ(UART) baud rate thay đổi 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 thu đồng thời) có mạch đệm thu(lưu ký tự thu trước thu ký tự tại),CPU đọc ký tự thu đệm thu lúc miễn trước thu xong ký tự Hai SFR quản lý hoạt động cổng nối tiếp SCON SBUF Giáo Trình Vi Xử Lý Lưu Phú 6.2 Các ghi SBUF SCON Hình 6.1: Sơ đồ khối cổng nối tiếp Giáo Trình Vi Xử Lý Lưu Phú 6.2 Các ghi SBUF SCON 6.2.1 Thanh ghi SBUF Địa 99H,không truy xuất bit SBUF phát thu độc lập: SBUF phát ghi,SBUF thu đọc Trường hợp thu,xung CK (baudrate)thu dịch đủ bit data thu vào ghi chuyển sang SBUF thu.Điều đảm bảo đệm thu lưu ký tự thu trước lúc thu ký tự Truy xuất cổng nối tiếp - Phát data: ghi data SBUF MOV SBUF,A Hay MOV SBUF,direct - Thu data: đọc data từ SBUF MOV A,SBUF Hay MOV direct,SBUF Thông thường nên dùng ghi A truy xuất cổng nối tiếp xét parity! SBUF thu SBUF phát riêng ký hiệu! Giáo Trình Vi Xử Lý Lưu Phú 6.2 Các ghi SBUF SCON 6.2.2 Thanh ghi SCON Địa 98H,truy xuất bit Chứa bit trạng thái điều khiển SPI Ví dụ 6.1: Khởi động SPI làm việc mode UART bit,baud rate thay đổi,có thu data Giải: SPI làm việc mode UART bit SM0SM1=01,cho phép thu REN=1, đặt TI=1 từ đầu SBUF phát rỗng MOV SCON,#01010010B Hay MOV SCON#52H Bit SCON.7 SCON.6 SCON.5 Ký hiệu SM0 SM1 SM2 Địa bit 9FH 9EH 9DH SCON.4 SCON.3 REN TB8 9CH 9BH SCON.2 RB8 9AH SCON.1 TI 99H SCON.0 RI 98H Bảng B6.2: Các mode SPI SM0 0 1 SM1 1 Mode Mô tả Ghi dịch bit UART bit UART bit UART Baud rate Cố định=Fosc/12 Thay đổi(đặt timer) Cố định=Fosc/32 hay Fosc/64 Thay đổi(đặt timer) Giáo Trình Vi Xử Lý Mơ tả Mode bit SPI(xem bảng B6.2) Mode bit SPI(xem bảng B6.2) Mode bit SPI.Cho phép truyền đa xử lý mode 2&3;RI khơng kích hoạt bit thu thứ 9=0 Đặt/xóa=Cho phép /cấm thu SPI Bit phát D8≡bit phát thứ mode 2&3;đặt/xóa mềm Bit thu D8≡bit thu thứ mode 2&3 Cờ ngắt phát.Đặt=1 cứng phát xong ký tự;xóa mềm Cờ ngắt thu.Đặt=1 cứng thu xong ký tự;xóa mềm Bảng B6.1: Tóm tắt ghi SCON Lưu Phú 6.3 Các mode làm việc SPI 6.3.1 Mode 0- Ghi dịch 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 SBUF - Từng bit data xuất RXD ổn định 1MC,xuất LSB trước - Xung CK xuất TXD cạnh xuống S3P1 cạnh lên S6P1 - Ngay sau xuất xong bit data thứ D7, TI=1 báo xuất xong ký tự,TXD=1 ngưng phát xung CK →xóa TI mềm để nhận dạng lần phát Giáo Trình Vi Xử Lý Hình 6.2: Định phát data mode Lưu Phú 6.3 Các mode làm việc SPI 6.3.1 Mode 0- Ghi dịch bit : SM0SM1=00 Thu data-shift in: - Bắt đầu thu cho REN=1(thường đầu chương trình) RI=0 - Xung CK xuất TXD dịch data vào ngõ RXD cạnh lên,thu LSB trước - Ngay sau dịch xong bit data thứ D7,RI=1 báo thu xong ký tự,TXD=1 ngưng phát xung CK Hình 6.3: Định thu data mode Mode thích hợp giao tiếp với ngoại vi dạng ghi dịch để mở rộng ngoại vi(hình 6.4) Hình 6.4: SPI mode giao tiếp ghi dịch Giáo Trình Vi Xử Lý Lưu Phú 6.3 Các mode làm việc SPI 6.3.1 Mode 0- Ghi dịch bit : SM0SM1=00 Ví dụ 6.2: Viết chương trình nhập data từ P1 xuất SPI mode nhập data từ SPI mode xuất P2 Giải: ORG MOV SCON,#00010011B LOOP: MOV A,P1 CALL SHIFT_OUT CALL SHIFT_IN MOV P2,A SJMP LOOP SHIFT_OUT: JNB TI,$ CLR TI MOV SBUF,A RET SHIFT_IN: CLR RI JNB RI,$ MOV A,SBUF RET END ;SPI mode có thu,TI=1 phát ngay,RI=1 cấm thu ;nhập data cần shift out ;shift out ;shift in ;xuất data shift in ;chờ phát xong ký tự trước ;đã phát xong,xóa cờ ngắt phát ;bắt đầu shift out ;bắt đầu thu ;chờ shift in xong ký tự ;lấy ký tự Giáo Trình Vi Xử Lý Lưu Phú 6.3 Các mode làm việc SPI 6.3.2 Mode 1- UART bit: SM0SM1=01 Mode SPI làm việc bất đồng UART bit(Universal Asynchronous Receiver Transmitter) Cấu hình UART 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ách cài đặt Timer1 và/hoặc Timer2 MCU8052 Xung nhịp đồng ghi dịch SPI tạo từ đếm bit chia 16,ngõ baud rate.Xung CK ngõ vào đếm lập trình từ Timer1 và/hoặc Timer2(sẽ phân tích sau) (hình 6.5) Độ dài thời gian bit chuỗi data 1/baud rate Hình 6.5: Bộ chia 16 tạo baud rate Giáo Trình Vi Xử Lý Lưu Phú 10 6.6 Tạo baud rate cho SPI 6.6.1Tạo baud rate cho mode từ Timer1 Thông thường chọn Timer1 mode tự động nạp lại tạo baud rate xác(trường hợp baud rate chậm phải sử dụng mode 1,ta phải dùng ngắt Timer1 hay Timer CK ngoài) Khai báo SMOD mode Cơng thức tính baud rate: = Ố ĐỘ À 1×2 32 Cơng thức tính giá trị đặt trước Timer1: Á Ị ĐẶ ƯỚ = Ố ĐỘ À Nếu sử dụng mode timer(xung Timer CK trong) / Á Ị ĐẶ ƯỚ = Ố ĐỘ À Giá trị đặt trước lấy số âm tương ứng Giáo Trình Vi Xử Lý Lưu Phú 19 6.6 Tạo baud rate cho SPI 6.6.1 Tạo baud rate cho mode từ Timer1 Ví dụ 6.3: Tính giá trị đặt trước cho Timer1 với baudrate=1200 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 sau: MOV TMOD,#20H ;Timer1 mode timer MOV TH1,#-26 ;giá trị đặt trước MOV TL1,TH1 ;chạy từ đầu SETB TR1 ;chạy Timer1 Giáo Trình Vi Xử Lý Lưu Phú 20 6.6 Tạo baud rate cho SPI 6.6.1 Tạo baud rate cho mode từ Timer1 Để tạo baud rate xác,xác suất thu/phát cao→điều chỉnh Fosc để sai số=0 Bảng B6.3: Tóm tắt baud rate&giá trị đặt trước theo theo Fosc cho Timer1 Giáo Trình Vi Xử Lý Lưu Phú 21 6.6 Tạo baud rate cho SPI 6.6.2 Tạo baud rate cho mode sử dụng Timer2 MCU8052 có thêm Timer2 16 bit tạo baud rate tương tự Timer1 Khai báo bit / = chạy mode timer(Timer CK trong) Đặ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 tạo baud rate phát thu Tính giá trị đặt trước choTimer2: Á Ị ĐẶ ƯỚ = ( )/32 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 ghi RCAP2H(byte cao) RCAP2L(byte thấp) Giáo Trình Vi Xử Lý Lưu Phú 22 6.6 Tạo baud rate cho SPI 6.6.2 Tạo baud rate cho mode sử dụng Timer2 Ví dụ 6.4: Sử dụng Timer2 tạo baud rate=9600,cho Fosc=11.059MHz Giải: Giá trị đặt trước=(11059000/32)/9600=35.999=36 C_T2 BIT 0C9H TR2 BIT 0CAH TCLK BIT 0CCH RCLK BIT 0CDH T2CON EQU 0C8H RCAP2L EQU 0CAH RCAP2H EQU 0CBH TL2 EQU 0CCH TH2 EQU 0CDH ORG … CLR C_T2 SETB RCLK SETB TCLK MOV RCAP2H,#HIGH(-36) MOV RCAP2L,#LOW(-36) SETB TR2 … Giáo Trình Vi Xử Lý Lưu Phú 23 6.7 Các ví dụ ứng dụng SPI Các ví dụ sau sử dụng Fosc=11.059MHz để đảm bảo baud rate xác! Ví dụ 6.5: Viết lệnh khởi động MCU8051 SPI làm việc UART bit baud rate=9600,cho phép thu Giải: MOV SCON,#52H ;UART mode cho phép thu,TI=1 phát ký tự MOV TMOD,#20H ;Timer1 mode MOV TH1,#-3 ;BR=9600 MOV TL1,TH1 ;chạy từ vịng đầu SETB TR1 ;chạy Timer1 … Ví dụ 6.6: Viết chương trình tên OUT_CHR phát mã ASCII cất A,có cẩn thêm bit parity lẻ Giải: OUT_CHR: MOV C,P ;lấy bit parity chẵn CPL C ;tạo parity lẻ MOV ACC.7,C ;cẩn vào MSB A JNB TI,$ ;chờ phát xong ký tự trước CLR TI ;xóa TI để báo phát xong ký tự MOV SBUF,A ;phát ký tự CLR ACC.7 ;trả lại mã ASCII A RET Giáo Trình Vi Xử Lý Lưu Phú 24 6.7 Các ví dụ ứng dụng SPI Ví dụ 6.7: Viết chương trình tên IN_CHR thu ký tự ASCII có cẩn parity lẻ(như vd6.6),đặt (C)=1 thu ký tự sai parity Giải: IN_CHR: JNB RI,$ ;chờ thu xong ký tự CLR RI ;xóa RI để báo thu xong ký tự lần MOV A,SBUF ;thu ký tự MOV C,P ;(A) parity lẻ→(P)=1 CPL C ;sai parity→(P)=0→(C)=1 CLR ACC.7 ;trả lại mã ASCII A RET Trong ví dụ 6.7,do ký tự thu A parity lẻ(tổng số bit A số lẻ ) nên (P) ln ln=1 Do ký tự thu A sai parity(tổng số bit số chẵn)→(P)=0.Lệnh CPL C đặt (C)=1 thu ký tự sai parity! 25 Giáo Trình Vi Xử Lý Lưu Phú 6.7 Các ví dụ ứng dụng SPI Ví dụ 6.8: Viết chương trình cho MCU8051 SPI làm việc UART bit baudrate =19200: Liên tục phát ký tự mã ASCII có cẩn bit parity lẻ chứa vùng nhớ RAM nội địa từ 30H→7FH,sử dụng chương trình OUT_CHR vd 6.6.Sau phát xong ký tự cuối quay phát lại từ đầu Thu ký tự mã ASCII có cẩn bit parity lẻ,trả mã ASCII cất vùng nhớ RAM địa đầu từ 1000H,cho đến thu đươc mã NULL=00H,quay địa đầu tiếp tục thu,sử dụng chương trình 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 RI Chương trình OUT_CHR IN_CHR xử lý việc mã ASCII có cẩn bit parity Lặp vịng phát lại từ đầu địa RAM nội=80H,địa đầu=30H Lặp vòng thu lại từ đầu thu mã NULL=00H,địa đầu RAM ngồi=1000H 26 Giáo Trình Vi Xử Lý Lưu Phú 6.7 Các ví dụ ứng dụng SPI ORG MOV SCON,#52H;SPI mode 1,cho phép thu,phát ký tự MOV A,PCON ;lấy nội dung PCON MOV R0,#30H ;nạp lại địa đầu RAM nội SETB ACC.7 ;SMOD=1 CHK_RX: MOV PCON,A ;x2 BR JNB RI,CHK_TX ;RI=0 nhảy kiểm tra TI CALL IN_CHR ;gọi CTC thu ký tự MOV TMOD,#20H;Timer1 mode CK MOV P1.0,C ;xuất kq parity P1.0 MOV TH1,#-3 ;BR=19200(SMOD=1) MOVX @DPTR,A ;xuất ký tự RAM ngồi MOV TL1,TH1 ;nạp TL1 từ vịng đầu INC DPTR ;tăng địa RAM SETB TR1 ;chạy Timer1 ;ký tự≠NULL tiếp tục MOV R0,#30H ;R0 trỏ địa đầu RAM nội JNZ CHK_TX MOV DPTR,#1000H ;ký tự=NULL nạp lại địa MOV DPTR,#1000H;DPTR trỏ đc đầu RAM ;chỉ đầu RAM CHK_TX: SJMP CHK_TX ; quay lại từ đầu 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 CJNE R0,#80H,CHK_RX;chưa hết vùng nhớ tiếp tục Giáo Trình Vi Xử Lý Lưu Phú 27 6.7 Các ví dụ ứng dụng SPI ; -OUT_CHR: MOV C,P ;lấy bit parity chẵn CPL C ;tạo parity lẻ MOV ACC.7,C ;cẩn vào MSB A JNB TI,$ ;chờ phát xong ký tự trước CLR TI ;xóa TI để báo phát xong ký tự MOV SBUF,A ;phát ký tự CLR ACC.7 ;trả lại mã ASCII A RET ; IN_CHR: JNB RI,$ ;chờ thu xong ký tự CLR RI ;xóa RI để báo thu xong ký tự lần MOV A,SBUF ;thu ký tự MOV C,P ;(A) parity lẻ→(P)=1 CPL C ;sai parity→(P)=0→(C)=1 CLR ACC.7 ;trả lại mã ASCII A RET ; END Giáo Trình Vi Xử Lý Lưu Phú 28 6.7 Các ví dụ ứng dụng SPI Ví dụ 6.9: Thiết kế mạng truyền cục ứng dụng đa xử lý làm việc sau: Mạng có MCU master U1và MCU slaver U2 U3,ký hiệu slaver0: địa 30H slaver1:địa 31H Một SW kết nối P3.2 MCU master: SW=0:master kết nối slaver0,SW=1:master kết nối slaver1 Các MCU master slaver có kết nối DIPSW8 P1 để nhập data diplay data output logicstate P2 Các MCU slaver kết nối ngõ TXD với RXD MCU master qua cổng đệm trạng thái 74HC244,chân P3.2 điều khiển cổng đệm Ban đầu master phát mã địa chọn slaver(slaver0 địa 30H,slaver1 địa 31H)theo trạng thái SW Slaver chọn trả lại mã địa cho master để xác nhận thiết lập đường truyền Slaver không chọn tiếp tục thực công việc nhập data từ P1 xuất P2 Master phát data nhập từ P1 cho slaver chọn thu data từ slaver xuất P2 Slaver chọn thu data từ master xuất P2 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 Slaver thu mã NULL=00H,kết thúc truyền quay lại tiếp tục công việc nhập data từ P1 xuất P2 Cho baurate=9600,Fosc=11.059Mhz Giáo Trình Vi Xử Lý Lưu Phú 29 6.7 Các ví dụ ứng dụng SPI Sơ đồ mạch điện hình vd6.9: Hình vd6.9 Giáo Trình Vi Xử Lý Lưu Phú 30 6.7 Các ví dụ ứng dụng SPI Chương trình nạp cho MCU master U1: SELECT BIT P3.2 SLAV_0 EQU 30H SLAV_1 EQU 31H ORG JMP MAIN ORG 0030H MAIN: MOV SP,#5FH MOV SCON,#72H MOV TMOD,#20H MOV TH0,#-3 MOV TL0,TH0 SETB TR1 Loop: JB SELECT,SEL1 MOV A,#SLAV_0 SETB SM2 SETB TB8 CALL PHAT CLR A CALL THU CJNE A,#SLAV_0,Loop CLR SM2 CLR TB8 ;SPI mode cho phép thu,TI=1 ;Timer1 tạo baudrate ;BR=9600 ;SELECT=1,chọn slaver1 ;nạp địa slaver0 ;SM2=1 để thu mã lệnh từ slaver chọn ;truyền mã lệnh ;phát địa slaver cần chọn ;xóa A ;thu địa slaver chọn ;kiểm tra địa chỉ? ;đúng địa ;chuẩn bị truyền data Giáo Trình Vi Xử Lý Lưu Phú 31 6.7 Các ví dụ ứng dụng SPI TIEP: MOV CALL JZ CALL MOV JMP SEL1: MOV SETB SETB CALL CLR CALL CJNE CLR CLR JMP A,P1 PHAT Loop THU P2,A TIEP ;nhập data từ P1 ;phát data ;data=#0,ngừng truyền quay từ đầu ;thu data từ slaver ;xuất data thu P2 ;lặp vòng truyền tiếp A,#SLAV_1 SM2 TB8 PHAT A THU A,#SLAV_1,Loop SM2 TB8 TIEP ;nạp địa slaver1 ;SM2=1 để thu mã lệnh từ slaver chọn ;truyền mã lệnh ; phát địa slaver cần chọn ;xóa A ; thu địa slaver chọn ; kiểm tra địa chỉ? ;đúng địa ; chuẩn bị truyền data ;nhảy đến truyền data Giáo Trình Vi Xử Lý Lưu Phú 32 6.7 Các ví dụ ứng dụng SPI ; -PHAT: JNB TI,$ CLR TI MOV SBUF,A RET ; THU: JNB RI,$ CLR RI MOV A,SBUF RET ;======================================================== END Giáo Trình Vi Xử Lý Lưu Phú 33 ...Tóm tắt: 6. 1 Giới thiệu 6. 2 Các ghi SBUF SCON 6. 3 Các mode làm vi? ??c SPI 6. 4 Khởi động ,truy xuất 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ụ... SFR quản lý hoạt động cổng nối tiếp SCON SBUF Giáo Trình Vi Xử Lý Lưu Phú 6. 2 Các ghi SBUF SCON Hình 6. 1: Sơ đồ khối cổng nối tiếp Giáo Trình Vi Xử Lý Lưu Phú 6. 2 Các ghi SBUF SCON 6. 2.1 Thanh... để tránh wired AND) Khai báo MCU làm vi? ??c mode với SM2=1 Hình 6. 7: Mơ hình truyền thơng đa xử lý Giáo Trình Vi Xử Lý Lưu Phú 16 6.5 Truyền thơng đa xử lý( Multiprocessor) Nghi thức giao tiếp: