Hình 6.6: Sơ đồ khối bộ truyền UART
Nguyên tắc hoạt động:
Khi có dữ liệu được truyền tới chân RX, nếu bit SPEN được cho phép, thì dữ liệu sẽ được đồng bộ với khối tạo xung, vì baud rate giữa hai khối truyền nhận bằng nhau, nên xung baud mang dữ liệu từng bit vào thanh ghi RSR, khi một frame truyền hoàn tất (dấu hiệu từ bit stop), thì dữ liệu được truyền xuống thanh ghi RCREG, bit thứ 9 được truyền xuống RX9D (nếu sử dụng chế độ 9 bit), nếu trên đường truyền có lỗi thì các bit OERR, FERR sẽ được hiển thị để báo.
Quá trình nhận cũng có thể tạo ra ngắt sau khi kết thúc một frame truyền nhận, bằng việc làm cho bit RCIF =1.
Thanh ghi quy định chế độ nhận:
Các bit liên quan đến chế độ truyền nhận bất đồng bộ.
SPEN: Bit cho phép khởi tạo cổng nối tiếp
1: Cho phép cổng nối tiếp 0: Không cho phép cổng nối tiếp
RX9: Bit cho phép nhận 9 bit
1: Chế độ nhận 9 bit 0: Chế độ nhận 8 bit
CREN: Bit cho phép nhận liên tục
1: Cho phép 0: Không cho phép
ADDEN: Bit cho phép phát hiện địa chỉ (sử dụng ở chế độ truyền
nhận bất đồng bộ 9 bit)
1: Cho phép phát hiện địa chỉ, cho phép ngắt và tải bộ đệm nhận khi RSR<8> được set.
0: Không cho phép phát hiện địa chỉ, tất cả byte được nhận và bit thứ 9 dùng làm bit parity
FERR: Bit báo lỗi frame
1: Có lỗi 0: Không có lỗi
OERR: Lỗi OVERRUN
1: Có lỗi (có thể xóa bằng việc xóa bít CREN) 0: Không lỗi
Hình 6.7: Ngắt nhận UART
Các bit khởi tạo ngắt nhận UART
RCIF: Cờ ngắt, sau khi thanh ghi RCREG nhận được dữ liệu thì
bit này tự động bằng 1.
RCIE: Bit cho phép ngắt nhận, để tạo ra ngắt nhận ta cần phải cho
phép bit này bằng 1.
PEIE: Bit cho phép ngắt ngoại vi. GIE: Bit cho phép ngắt toàn cục.
Các bước khởi tạo chế độ nhận UART
* Bước 1: Khởi tạo thanh ghi SPBRGH, SPBRG và các bit BRGH và BRG16 để tạo ra baud rate cần thiết.
* Bước 2: Cho phép giao tiếp bất đồng bộ: SYNC=0; SPEN=1; * Bước 3: Nếu sử dụng ngắt nhận: RCIE=1; PEIE=1; GIE=1;
* Bước 4: Cho phép chế độ 9 bit bằng (nếu sử dụng truyền nhận 9 bit): RX9=1;
* Bước 5: Cho phép nhận dữ liệu: CREN=1;
* Bước 6: Cờ ngắt RCIF = 1 khi dữ liệu chuyển đổi từ RSR tới bộ đệm nhận. Ngắt sẽ được tạo ra nếu RCIE=1.
* Bước 7: Đọc thanh ghi RCSTA để phát hiện các lỗi trong quá trình truyền nhận.
* Bước 8: Nhận 8 bit dữ liệu từ bộ điệm nhận bằng cách đọc thanh ghi RCREG.
* Bước 9: Nếu có lỗi overrun xảy ra, xóa cờ OERR bằng cách xóa bit CREN.