I.GIỚI THIỆU
Truyền dữ liệu nối tiếp có nhiều tiện ích trong điều khiển nên hầu hết các vi điều khiển đều tích
hợp, ở chương này chúng ta sẽ khảo sát nguyên lý hoạt động truyền dữ liệu đồng bộ và không đồng bộ,
các viết chương trình truyền dữ liệu cho các ứng dụng.
Sau khi kết thúc chương này bạn có thể sử dụng được truyền dữ liệu nối tiếp của các vi điều
khiển.
II. TỔNG QUAN VỀ CÁC KIỂU TRUYỀN DỮ LIỆU
Có nhiều kiểu truyền dữ liệu phổ biến tích hợp trong các họ vi điều khiển bao gồm:
· Truyền dữ liệu nối tiếp đồng bộ và bất đồng bộ (UART synchronous asynchronous receiver and transmitter).
· Truyền dữ liệu giữa các vi điều khiển với các thiết bị ngoại vi (SPI serial peripheral interface).
· Truyền dữ liệu 2 dây (I2C: inter-integrated circuit).
Ở kiểu truyền nối tiếp đồng bộ thì có 1 đường dữ liệu và 1 đường xung clock, thiết bị nào cấp
xung clock thì thiết bị đóng vai trò là chủ, thiết bị nhận xung clock đóng vai trò là tớ, tốc độ truyền dữ
liệu phụ thuộc vào tần số xung clock.
Ở kiểu truyền nối tiếp bất đồng bộ thì có 1 đường phát dữ liệu và 1 đường nhận dữ liệu, không
còn tín hiệu xung clock nên gọi là bất đồng bộ. Để truyền được dữ liệu thì cả bên phát và bên nhận
phải tự tạo xung clock có cùng tần số và thường gọi là tốc độ truyền dữ liệu (baud), ví dụ 2400baud,
4800baud, …, 2400baud có nghĩa là truyền 2400 bit trên 1 giây.
Hai kiểu truyền SPI và I2C sẽ được trình bày ở chương tiếp theo.
III. TRUYỀN DỮ LIỆU NỐI TIẾP ĐỒNG BỘ VÀ KHÔNG ĐỒNG BỘ
Truyền dữ liệu đồng bộ gồm các đường truyền dữ liệu (DT) và tín hiệu xung clock (CK) – chức
năng của CK dùng để dịch chuyển dữ liệu, mỗi 1 xung ck là 1 bit dữ liệu được truyền đi.
Trong hệ thống truyền dữ liệu đồng bộ, hệ thống nào cung cấp xung CK thì đóng vai trò là
master (chủ) – những hệ thống còn lại nhận xung ck đóng vai trò là slave (tớ).
Tốc độ truyền dữ liệu chính là tốc độ của xung ck – chính là tần số xung ck.
Ví dụ tần số xung ck là 1MHz thì tốc độ truyền dữ liệu là 1MBPS – 1M baud
Truyền dữ liệu nối tiếp có nhiều tiện ích trong điều khiển nên hầu hết các vi điều khiển đều tích
hợp, ở chương này chúng ta sẽ khảo sát nguyên lý hoạt động truyền dữ liệu đồng bộ và không đồng bộ,
các viết chương trình truyền dữ liệu cho các ứng dụng.
Sau khi kết thúc chương này bạn có thể sử dụng được truyền dữ liệu nối tiếp của các vi điều
khiển.
II. TỔNG QUAN VỀ CÁC KIỂU TRUYỀN DỮ LIỆU
Có nhiều kiểu truyền dữ liệu phổ biến tích hợp trong các họ vi điều khiển bao gồm:
· Truyền dữ liệu nối tiếp đồng bộ và bất đồng bộ (UART synchronous asynchronous receiver and transmitter).
· Truyền dữ liệu giữa các vi điều khiển với các thiết bị ngoại vi (SPI serial peripheral interface).
· Truyền dữ liệu 2 dây (I2C: inter-integrated circuit).
Ở kiểu truyền nối tiếp đồng bộ thì có 1 đường dữ liệu và 1 đường xung clock, thiết bị nào cấp
xung clock thì thiết bị đóng vai trò là chủ, thiết bị nhận xung clock đóng vai trò là tớ, tốc độ truyền dữ
liệu phụ thuộc vào tần số xung clock.
Ở kiểu truyền nối tiếp bất đồng bộ thì có 1 đường phát dữ liệu và 1 đường nhận dữ liệu, không
còn tín hiệu xung clock nên gọi là bất đồng bộ. Để truyền được dữ liệu thì cả bên phát và bên nhận
phải tự tạo xung clock có cùng tần số và thường gọi là tốc độ truyền dữ liệu (baud), ví dụ 2400baud,
4800baud, …, 2400baud có nghĩa là truyền 2400 bit trên 1 giây.
Hai kiểu truyền SPI và I2C sẽ được trình bày ở chương tiếp theo.
III. TRUYỀN DỮ LIỆU NỐI TIẾP ĐỒNG BỘ VÀ KHÔNG ĐỒNG BỘ
Truyền dữ liệu đồng bộ gồm các đường truyền dữ liệu (DT) và tín hiệu xung clock (CK) – chức
năng của CK dùng để dịch chuyển dữ liệu, mỗi 1 xung ck là 1 bit dữ liệu được truyền đi.
Trong hệ thống truyền dữ liệu đồng bộ, hệ thống nào cung cấp xung CK thì đóng vai trò là
master (chủ) – những hệ thống còn lại nhận xung ck đóng vai trò là slave (tớ).
Tốc độ truyền dữ liệu chính là tốc độ của xung ck – chính là tần số xung ck.
Ví dụ tần số xung ck là 1MHz thì tốc độ truyền dữ liệu là 1MBPS – 1M baud
Hình 1.Hệ thống truyền đồng bộ Hình 2.Hệ thống
truyền bất đồng bộ
Truyền dữ liệu không đồng bộ giống như hệ thống truyền
dữ liệu đồng bộ nhưng không có xung CK. Không còn phân biệt chủ và tớ – các hệ
thống là ngang cấp.
Mỗi 1 xung ck là 1 bit dữ liệu được truyền đi – bây
giờ không còn xung Ck thì làm sao để
truyền dữ liệu?
Để truyền dữ liệu thì mỗi hệ thống phải có 1 mạch dao động tạo xung CK – hai hệ thống sẽ có 2
mạch dao động độc lập nhưng phải cùng tần số hay cùng tốc độ.
truyền dữ liệu?
Để truyền dữ liệu thì mỗi hệ thống phải có 1 mạch dao động tạo xung CK – hai hệ thống sẽ có 2
mạch dao động độc lập nhưng phải cùng tần số hay cùng tốc độ.
2. CÁC
THANH GHI PHỤC VỤ CHO KHỐI UART CỦA PIC
· Thanh ghi điều khiển và trạng
thái của khối phát (TXSTA – transmit Status and Control).
· Thanh ghi điều khiển và trạng thái của khối nhận (RCSTA – transmit Status and Control).
· Thanh ghi điều khiển tốc độ baud (BAUDCTL – Baud Rate Control)
a. Thanh ghi điều khiển và trạng thái của khối phát TXSTA
Tổ chức của thanh ghi như hình sau:
· Thanh ghi điều khiển và trạng thái của khối nhận (RCSTA – transmit Status and Control).
· Thanh ghi điều khiển tốc độ baud (BAUDCTL – Baud Rate Control)
a. Thanh ghi điều khiển và trạng thái của khối phát TXSTA
Tổ chức của thanh ghi như hình sau:
Hình 3.
Bảng tóm tắt chức năng các bit
trong thanh ghi TXSTA:
Hình 4.
Sơ đồ khối của khối phát như hình
sau:
Hình 5.
Thiết
lập truyền dữ liệu bất đồng bộ
· Thiết lập giá trị cho cặp thanh ghi SPBRGH và SPBRG và BRGH và bit BRG16 để có
tốc độ baud mong muốn.
· Cho phép truyền dữ liệu bất đồng bộ bằng cách xóa bit SYNC làm bit SPEN lên 1.
· Nếu truyền dữ liệu 9 bit thì thiết lập bit cho phép TX9 lên 1.
· Làm bit TXEN lên 1 để cho phép truyền dữ liệu.
· Nếu muốn sử dụng ngắt thì cho bit TXIE lên 1, cho phép ngắt ngoại vi và cho phép ngắt
toàn cục.
· Nếu truyền dữ liệu 9 bit thì phải gán giá trị bit thứ 9 cho bit TX9D
· Tiến hành nạp giá trị cần truyền vào thanh ghi TXREG, khi đó quá trình truyền dữ liệu sẽ
bắt đầu.
Dạng sóng truyền dữ liệu bất đồng bộ như hình sau:
· Thiết lập giá trị cho cặp thanh ghi SPBRGH và SPBRG và BRGH và bit BRG16 để có
tốc độ baud mong muốn.
· Cho phép truyền dữ liệu bất đồng bộ bằng cách xóa bit SYNC làm bit SPEN lên 1.
· Nếu truyền dữ liệu 9 bit thì thiết lập bit cho phép TX9 lên 1.
· Làm bit TXEN lên 1 để cho phép truyền dữ liệu.
· Nếu muốn sử dụng ngắt thì cho bit TXIE lên 1, cho phép ngắt ngoại vi và cho phép ngắt
toàn cục.
· Nếu truyền dữ liệu 9 bit thì phải gán giá trị bit thứ 9 cho bit TX9D
· Tiến hành nạp giá trị cần truyền vào thanh ghi TXREG, khi đó quá trình truyền dữ liệu sẽ
bắt đầu.
Dạng sóng truyền dữ liệu bất đồng bộ như hình sau:
Hình 6.
Giải
thích dạng sóng:
Dạng sóng tín hiệu thứ hai là BRG: là tín hiệu tạo xung clock để dịch dữ liệu được phát liên tục.
Dạng sóng tín hiệu thứ nhất: là khi thực hiện lệnh ghi dữ liệu cần truyền byte thứ nhất vào thanh ghi TXREG.
Dạng sóng tín hiệu thứ hai là BRG: là tín hiệu tạo xung clock để dịch dữ liệu được phát liên tục.
Dạng sóng tín hiệu thứ nhất: là khi thực hiện lệnh ghi dữ liệu cần truyền byte thứ nhất vào thanh ghi TXREG.
Dạng sóng thứ tư cho biết trạng
thái của cờ báo ngắt TXIF: tín hiệu từ 1 xuống 0 rồi lên 1 trở lại
cho biết trạng thái thanh ghi bộ đệm còn rỗng, thời gian xuống mức 0 chỉ tồn tại 1 chu kỳ.
Dạng sóng thứ năm cho biết trạng thái của bit TRMT: tín hiệu từ 1 xuống 0 để cho biết quá trình
dịch dữ liệu bắt đầu và trở lại mức 0 khi đã dịch xong dữ liệu.
Dạng sóng thứ ba là ngõ xuất dữ liệu nối tiếp ra ngoài: bit đầu tiên được phát là bit Start, tiếp
theo là bit dữ liệu thứ 0, 1, …, đến bit dữ liệu cuối cùng là bit thứ 7 nếu truyền 8 bit, là bit thứ 8 nếu
truyền 9 bit, bit cuối cùng là bit Stop.
Dạng truyền thứ 2 như hình sau, ở kiểu này thì truyền 2 byte:
cho biết trạng thái thanh ghi bộ đệm còn rỗng, thời gian xuống mức 0 chỉ tồn tại 1 chu kỳ.
Dạng sóng thứ năm cho biết trạng thái của bit TRMT: tín hiệu từ 1 xuống 0 để cho biết quá trình
dịch dữ liệu bắt đầu và trở lại mức 0 khi đã dịch xong dữ liệu.
Dạng sóng thứ ba là ngõ xuất dữ liệu nối tiếp ra ngoài: bit đầu tiên được phát là bit Start, tiếp
theo là bit dữ liệu thứ 0, 1, …, đến bit dữ liệu cuối cùng là bit thứ 7 nếu truyền 8 bit, là bit thứ 8 nếu
truyền 9 bit, bit cuối cùng là bit Stop.
Dạng truyền thứ 2 như hình sau, ở kiểu này thì truyền 2 byte:
Hình 7.
Giải
thích dạng sóng:
Dạng sóng tín hiệu thứ nhất: là khi thực hiện lệnh ghi dữ liệu cần truyền byte thứ nhất vào thanh
ghi TXREG, sau đó thực hiện tiếp byte thứ 2. Bộ đệm có thể chứa 2 byte để truyền đi.
Dạng sóng thứ tư cho biết trạng thái của cờ báo ngắt TXIF: tín hiệu từ 1 xuống 0 rồi lên 1 trở lại
cho biết trạng thái thanh ghi bộ đệm còn rỗng 1 byte, sau đó nhận tiếp byte thứ 2 thì tín hiệu này xuống
lại mức 0 và ở luôn mức 0 vì bộ đệm đầy. Sau khi truyền xong 1 byte thì bộ đệm rỗng nên tín hiệu này
lên 1 trở lại, ta có thể ghi dữ liệu để phát tiếp.
Dạng sóng thứ ba là ngõ xuất dữ liệu nối tiếp ra ngoài: sẽ phát lần lượt từng byte.
b. Thanh ghi điều khiển và trạng thái của khối nhận RCSTA
Tổ chức của thanh ghi như hình sau:
Dạng sóng tín hiệu thứ nhất: là khi thực hiện lệnh ghi dữ liệu cần truyền byte thứ nhất vào thanh
ghi TXREG, sau đó thực hiện tiếp byte thứ 2. Bộ đệm có thể chứa 2 byte để truyền đi.
Dạng sóng thứ tư cho biết trạng thái của cờ báo ngắt TXIF: tín hiệu từ 1 xuống 0 rồi lên 1 trở lại
cho biết trạng thái thanh ghi bộ đệm còn rỗng 1 byte, sau đó nhận tiếp byte thứ 2 thì tín hiệu này xuống
lại mức 0 và ở luôn mức 0 vì bộ đệm đầy. Sau khi truyền xong 1 byte thì bộ đệm rỗng nên tín hiệu này
lên 1 trở lại, ta có thể ghi dữ liệu để phát tiếp.
Dạng sóng thứ ba là ngõ xuất dữ liệu nối tiếp ra ngoài: sẽ phát lần lượt từng byte.
b. Thanh ghi điều khiển và trạng thái của khối nhận RCSTA
Tổ chức của thanh ghi như hình sau:
Hình 8.
Bảng tóm tắt chức năng các bit
trong thanh ghi RCSTA:
Hình 9.
Ảnh mô phỏng protues.
Code chương trình.
#define _XTAL_FREQ 8000000
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "uart.h"
// CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
void main(void)
{
UART_Init(9600);
while(1)
{
__delay_ms(1000);
UART_Write_Text("chiasedientu.blogspot.com");
__delay_ms(1000);
UART_Write_Text("\r\n");
UART_Write(232);
UART_Write_Text("\r\n");
}
}
EmoticonEmoticon