Hướng dẫn sử dụng Kit 89 Bài 12 : Giao tiếp UART Mục đích: Nắm vững giao tiếp Uart. Yêu cầu: Xây dựng ứng dụng giao tiếp giữa board 89 và máy tính thông qua cổng COM. 12.1 Nguyên lý giao tiếp UART Uart RS232 là chuẩn giao tiếp khá phổ biến và được hỗ trợ ở hầu hết các dòng vi điều khiển vì khoảng cách xa và chi phí thấp. Dòng 8051 hỗ trợ 1 kênh giao tiếp uart. Dữ liệu được truyền đi trên chân TX gồm 1 start bit (mức 0), data và 1 stop bit (mức 1). Tốc độ truyền : đơn vị bit per second (bps) còn gọi là Baud (số lần thay đổi tín hiệu trong 1 giây – thường sử dụng cho modem). Đối với đường truyền thì Baud và bps là như nhau. UART là phương thức truyề n nhận bất đồng bộ. nghĩa là bên nhận và bên phát không cần phải có chung tốc độ xung clock (ví dụ : xung clock của vi điều khiển khác xung clock của máy tính) . Khi đó bên truyền muốn truyền dữ liệu sẽ gửi start bit (bit 0) để báo cho bên thu biết để bắt đầu nhận dữ liệu và khi truyền xong dữ liệu thì stop bit (bit 1) sẽ được gửi để báo cho bên thu biết kết thúc quá trình truyền. Khi có start bit thì cả hai bên sẽ dùng chung 1 xung clock (có thể sai khác một ít) với độ rộng 1 tín hiệu (0 hoặc 1) được quy định bởi baud rate, ví dụ baud rate = 9600bps nghĩa là độ rộng của tín hiệu 0(hoặc 1) là 1/9600 = 104 ms và khi phát thì bên phát sẽ dùng baud rate chính xác (ví dụ 9600bps) còn bên thu có thể dùng baud rate sai lêch 1 ít(9800bps chẳng hạn). Truyền bất đồng bộ sẽ truyển theo từng frame và mỗi frame có cấu trúc như sau: Stop bit B7 B6 B5 B4 B3 B2 B1 B0 Start bit Ngoài ra trong frame truyền có thể có thêm bit odd parity (bit lẻ) hoặc even parity (bit chẵn) để kiểm tra lỗi trong quá trình truyền. Bit parity này có đặc điểm nếu sử dụng odd parity thì số các bit 1 + odd parity bit sẽ ra 1 số lẻ còn nếu sử dụng even parity thì số các bit 1 + even parity bit sẽ ra 1 số chẵn. goes out last goes out first BKIT HARDWARE CLUB – www.bkit4u.com 63 Hướng dẫn sử dụng Kit 89 12.2 Giao tiếp UART với máy tính Để giao tiếp COM giữa vi điều khiển và máy tính, ta kết nối mạch theo sơ đồ như sau: Do mức điện áp của tín hiệu logic 1/0 ở cổng COM của máy tính khác với vi điều khiển, nên MAX 232 có tác dụng chuẩn hoá mức điện áp giữa máy tính và điều khiển trong quá trình truyền nhận dữ liệu. Nếu giao tiếp trực tiếp giữa 2 vi điều khiển, ta không cần phải sử dụng MAX 232. BKIT HARDWARE CLUB – www.bkit4u.com 64 Hướng dẫn sử dụng Kit 89 12.3 Viết chương trình 12.3.1 Thanh ghi điều khiển truyền nhận nối tiếp Vi điều khiển 8051 có hai chân dùng trong truyền nhận nối tiếp là RxD(nhận dữ liệu ứng với chân P3.0) và TxD(phát dữ liệu ứng với chân P3.1), ngoài ra còn sử dụng bộ đệm SBUF để lưu dữ liệu thu khi nhận và dữ liệu phát khi truyền và thanh ghi SCON(Serial Control) để truy xuất port nối tiếp. Bộ đệm SBUF có địa chỉ byte là 99h, thực tế có hai bộ đệm là bộ đệm thu (chi đọc) dùng trong nhận dữ liệu và bộ đệm phát (chỉ ghi) dùng trong phát dữ liệu. Thanh ghi SCON có địa chỉ byte là 98h là thanh ghi có thể định địa chỉ từng bit dùng để thiết lập chế độ hoạt động của port nối tiếp và các bit trạng thái chỉ sự kết thúc việc thu hoặc phát dữ liệu. Bit Kí hiệu Chức năng SCON.7 SM0/FE Cách dùng của bit này được định nghĩa bằng giá trị của bit SMOD0 trong thanh ghi PCON, nếu SMOD=0, bit này được đọc và viêt là SM0, nó với bit SM1 định nghĩa chế độ hoạt động của cổng nối tiếp. Nếu SMOD0=1, bit này được đọc và viết là FE (khung lỗi). FE được set trong quá trình nhận khi phát hiện bit dừng không hợp lệ, và nó chỉ được xóa bởi phần mềm. (chú ý rằng các chế độ UART nên được lập trình(thông qua SM0 và SM1) khi SMOD0=’0’-chế độ mặc định sau các quá trình RESET) BKIT HARDWARE CLUB – www.bkit4u.com 65 Hướng dẫn sử dụng Kit 89 SM1 Cùng với SM0, xác định chế độ làm việc của cổng nối tiếp SM0, SM1 Chế độ UART UART 0 Baud Rate 0 0 0: thanh ghi dịch CCLK/16 (chế độ mặc định sau khi RESET) 0 1 1: UART 8-bit Thay đổi 1 0 2: UART 9-bit CCLK/32 hoặc CCLK/16 SCON.6 1 1 3: UART 9-bit Thay đổi SCON.5 SM2 Cho phép truyền thông đa xử lý. Ở Mode 2 và 3, nếu SM2 được lập, RI sẽ không tích cực nếu bit dữ liệu nhận thứ 9 (RB8) là ‘0’. Ở Mode 0, SM2 nên bằng ‘0’, ở mode 1, SM2 phải bằng ‘0’. SCON.4 REN Cho phép thu ở cổng nối tiếp. Thiết lập bởi phần mềm để cho phép thu. Xóa bởi phần mềm khi không cho phép thu,REN = 1 trong tất cả 4 chế độ tuyền nhận. SCON.3 TB8 Bit dữ liệu thứ 9 được phát ở mode 2 và 3, lập/xóa bởi phần mềm khi muốn. SCON.2 RB8 Bit dữ liệu thứ 9 được nhận ở mode 2 và 3. Ở mode 1(SM2=0), RB8 là bit dừng được nhận, ở mode 0, RB8 không được định nghĩa. SCON.1 TI Cờ ngắt phát(truyền nối tiếp), lập bởi phần cứng ở cuối bit thứ 8 ở mode 0, hay là ở bit dừng của các chế độ còn lại, phải được xóa bằng phần mềm. (Xem thêm bit INTL0 ở thanh ghi SSTAT) SCON.0 RI Cờ ngắt thu, lập bởi phần cứng ở cuối bit thứ 8 trong mode 0, hay khoảng giữa bit dừng ở mode 1. với mode 2 và mode 3, nếu SMOD0=0, nó được lập gần khoảng giữa bit dữ liệu thứ 9 (bit 8). Nếu SMOD0=1, nó được lập gần khỏang giữa bit dừng. Phải được xóa bởi phần mềm. Các chế độ truyền nối tiếp: • Chế độ 0: ở chế độ này chân RxD sẽ vửa làm nhiệm vụ thu và phát dữ liệu còn chân TxD làm nhiệm vụ phát xung dịch bit(Shift Clock) vói tốc độ sung bằng 1/12 tốc độ xung của XTAL.Dữ liệu truyền đi gồm 8 bit với bit LSB được truyền hoặc nhận trước. Ứng dụng của chế độ này là mở rộng ngõ ra cho 8051 từ 2 đường TxD,RxD sẽ tạ o ra 8 đường mở rộng. 8051 TxD(P3.1) RxD(P3.0) CLOCK Shift register Data BKIT HARDWARE CLUB – www.bkit4u.com 66 Hướng dẫn sử dụng Kit 89 • Chế độ 1: là chế độ truyền với mỗi frame có 10 bits (bit start – 8 bits data – bit stop) ,tốc độ baud rate có thể thay đổi được tùy vào cách khởi tạo ban đầu.Có thể nhân đôi tốc độ truyền bằng cách bật PCON.7 = 1. • Chế độ 2: là chế độ truyền với mỗi frame có 11 bits (bit start – 8 bits data – bit parity – bit stop),bit parity được đặt trong TB8 khi phát và được đặt trong RB8 khi thu, tốc độ baud rate ở chế độ này không thay đổi được và bằng 1/64 dao động của XTAL (1/32 dao động của XTAL nếu PCON.7 = 1). • Chế độ 3: có chức năng tương tự như chế độ 2 nhưng tốc độ baud rate có thể thay đổi được như ở chể độ 1. Tốc độ Baud : Tốc độ (Baud) của cổng 8051 phải phù hợp với máy tính: 100, 150, 300, 600, 1200, 2400, 4800, 9600, 19200. Khuyến cáo dùng thạch anh có tần số 11.0592Mhz để có thể tạo ra tốc độ Baud với sai s ố thấp (gần như là 0). 12.3.2 Dùng Timer1 tạo Baud rate Timer 1 được dùng để tạo tốc độ baud cho truyền nối tiếp ,cần phải đặt Timer 1 ở Mode 2 – 8 bit tự nạp lại, nếu đặt ở chế độ khác sẽ tốn vài chu kỳ máy cho quá trình thiết lập lại giá trị cho TH1,TL1. Đặt TH1 theo bảng sao để có tốc độ Baud tương ứng với SMOD = 0 (bit D7 trong thanh ghi PCON, XTAL = 11.0592 MHz) : Tốc độ Baud TH1 (Thập phân) TH1 (Hexa) 9600 -3 ED 4800 -6 FA 2400 -12 F4 1200 -24 E8 Tốc độ Baud rate sẽ nhân đôi khi SMOD = 1. 12.3.3 Chương trình truyền nhận UART trên 8051 Hàm InitTimer1ForUart() sẽ thiết lập Timer1 tạo tốc độ baud cho truyền nối tiếp void InitTimer1ForUart() { TMOD |= 0x20; // Timer 1 mode 2-autoreload TL1 = 0; /* if PCON.7 = 0, TH1 = 256 - ((Crystal / 384) / Baud) */ PCON &= ~(1 << 7); //TH1 = (-48); // baudrate 600 BKIT HARDWARE CLUB – www.bkit4u.com 67 Hướng dẫn sử dụng Kit 89 //TH1 = (-24); // baudrate 1200 //TH1 = (-12); // baudrate 2400 //TH1 = (-6); // baudrate 4800 TH1 = (-3); // baudrate 9600 /* if PCON.7 = 1, baud is double, TH1 = 256 - ((Crystal / 192) / Baud) */ //PCON |= (1 << 7); //TH1 = (-96); // baudrate 600 //TH1 = (-48); // baudrate 1200 //TH1 = (-24); // baudrate 2400 //TH1 = (-12); // baudrate 4800 //TH1 = (-6); // baudrate 9600 //TH1 = (-4); // baudrate 14400 //TH1 = (-3); // baudrate 19200 //TH1 = (-2); // baudrate 28800 TR1 = 1; //timer1 run } Hàm initUart() sẽ thiết lập chế độ hoạt động của port nối tiếp void initUart() { //IE = 0xb0; //SCON: SM0 SM1 SM2 REN TB8 RB8 TI RI ES = 1; // enable UART IP = 0x10; // set priority for serial port SCON = 0x50; // Uart mode 1,REN = 1 EA = 1; //enable interrupt } Hàm sendChar(unsigned char c) Để truyền dữ liệu đi, ta chỉ cần ghi giá trị cần truyền vào thanh ghi SBUF. Khi quá trình truyền kết thúc, cờ ngắt TI sẽ bật lên. Ta sẽ dùng 1 biến cờ trans_busy để nhận biết khi nào quá trình truyền kết thúc, và sẽ xoá biến cờ này trong hàm phục vụ ngắt truyền nối tiếp. void sendChar(unsigned char c) { trans_busy = 1; SBUF = c; while(trans_busy); } BKIT HARDWARE CLUB – www.bkit4u.com 68 Hướng dẫn sử dụng Kit 89 Hàm uart_isr() là hàm phục vụ ngắt của truyền nhận nối tiếp : void uart_isr(void) interrupt 4 { if (TI == 1) // Truyền dữ liệu { /* Các câu lệnh xử lý khi truyền dữ liệu */ trans_busy = 0; //cờ báo hiệu truyền kết thúc TI = 0; // xoá cờ ngắt TI , kết thúc truyền dữ liệu } if (RI == 1) //Nhận dữ liệu { /* Các câu lệnh xử lý khi nhận dữ liệu */ data_recv[index] = SBUF; // nhận dữ liệu RI = 0; // xoá cờ ngắt RI, kết thúc nhận dữ liệu } } Dữ liệu truyền tới vi điều khiển được lưu trong thanh ghi SBUF và khi vi điều khiển nhận đủ dữ liệu, cờ ngắt RI sẽ bật lên. BKIT HARDWARE CLUB – www.bkit4u.com 69 . Hướng dẫn sử dụng Kit 89 Bài 12 : Giao tiếp UART Mục đích: Nắm vững giao tiếp Uart. Yêu cầu: Xây dựng ứng dụng giao tiếp giữa board 89 và máy tính thông qua cổng COM. 12. 1 Nguyên. CLUB – www.bkit4u.com 67 Hướng dẫn sử dụng Kit 89 //TH1 = (-2 4); // baudrate 120 0 //TH1 = (-1 2); // baudrate 2400 //TH1 = (-6 ); // baudrate 4800 TH1 = (-3 ); // baudrate 9600 /* if. trình(thông qua SM0 và SM1) khi SMOD0=’0’-chế độ mặc định sau các quá trình RESET) BKIT HARDWARE CLUB – www.bkit4u.com 65 Hướng dẫn sử dụng Kit 89 SM1 Cùng với SM0, xác định chế độ làm việc