1. Tổng quan về truyền nhận dữ liệu bằng UART trong PIC16F877A Truyền
Sơ đồ khối bộ truyền UART:
Sơ đồ khối bộ truyền UART:
Nguyên tắc hoạt động:
1. Dữ liệu cần truyền được đặt vào thanh ghi TXREG, baund rate được tạo ra, khi TXEN gán bằng 1
dữ liệu từ thanh ghi TXREG đưa vào thanh ghi TSR đồng thời baund rate tác động đến TSR, đẩy
dữ liệu cần truyền ra bộ đệm sau đó xuất ra chân TX.
2. Bit TXIF dùng để báo trạng thái trong thanh ghi TXREG, nếu có dữ liệu trong TXREG thì TXIF =
1. Nếu dữ liệu được truyền xuống thanh TSR thì TXIF = 0. Tương tự bit TRMT dùng để báo trạng
thái thanh ghi TSR.
dữ liệu từ thanh ghi TXREG đưa vào thanh ghi TSR đồng thời baund rate tác động đến TSR, đẩy
dữ liệu cần truyền ra bộ đệm sau đó xuất ra chân TX.
2. Bit TXIF dùng để báo trạng thái trong thanh ghi TXREG, nếu có dữ liệu trong TXREG thì TXIF =
1. Nếu dữ liệu được truyền xuống thanh TSR thì TXIF = 0. Tương tự bit TRMT dùng để báo trạng
thái thanh ghi TSR.
Như vậy các bước cho quá trình gửi dữ liệu bao gồm:
1. Khởi tạo baund rate: ở thanh ghi SPBRG
Cho phép quá trình truyền thông không đồng bộ bằng cách thiết lập SPEN = 1; SYNC = 0;
2. Cho phép truyền dữ liệu bằng cách thiết lập bit TXEN = 1;
3. Khi cần truyền dữ liệu thì cần set dữ liệu đó lên TXREG.
Thanh ghi quy định chế độ truyền.
1. Khởi tạo baund rate: ở thanh ghi SPBRG
Cho phép quá trình truyền thông không đồng bộ bằng cách thiết lập SPEN = 1; SYNC = 0;
2. Cho phép truyền dữ liệu bằng cách thiết lập bit TXEN = 1;
3. Khi cần truyền dữ liệu thì cần set dữ liệu đó lên TXREG.
Thanh ghi quy định chế độ truyền.
- CSRC:
- TX9: Cho phép truyền nhận chế độ 9 bit
- TX9 = 1; // Hoạt động với chế độ 9 bit.
- TX9 = 0; // Hoạt động với chế độ 8 bit.
- TXEN: Cho phép truyền UART
- TXEN = 1; // Cho phép
- TXEN = 0; // Không cho phép
- SYNC: Cho phép chế độ đồng bộ
- SYNC = 1; // Truyền chế độ đồng bộ.
- SYNC = 0; // Truyền chế độ bất đồng bộ.
- BRGH: Chọn chế độ baund rate
- BRGH = 1; // Tốc độ cao (bất đồng bộ).
- BRGH = 0; // Tốc độ thấp (bất đồng bộ).
- TRMT: Trạng thái thanh ghi truyền.
- TRMT = 1; // Thanh ghi TSR trống
- TRMT = 0; // Thanh ghi TSR có dữ liệu.
- TX9D: Dữ liệu bit thứ 9 trong chế độ truyền 9 bit.
- TX9 = 1; // Hoạt động với chế độ 9 bit.
- TX9 = 0; // Hoạt động với chế độ 8 bit.
- TXEN: Cho phép truyền UART
- TXEN = 1; // Cho phép
- TXEN = 0; // Không cho phép
- SYNC: Cho phép chế độ đồng bộ
- SYNC = 1; // Truyền chế độ đồng bộ.
- SYNC = 0; // Truyền chế độ bất đồng bộ.
- BRGH: Chọn chế độ baund rate
- BRGH = 1; // Tốc độ cao (bất đồng bộ).
- BRGH = 0; // Tốc độ thấp (bất đồng bộ).
- TRMT: Trạng thái thanh ghi truyền.
- TRMT = 1; // Thanh ghi TSR trống
- TRMT = 0; // Thanh ghi TSR có dữ liệu.
- TX9D: Dữ liệu bit thứ 9 trong chế độ truyền 9 bit.
2. Nhận
Sơ đồ khối bộ nhận UART:
Sơ đồ khối bộ nhận UART:
Nguyên tắc hoạt động:
Khi có dữ liệu được truyền đến chân RX và bit SPEN được cho phép thì dữ liệu sẽ được đồng bộ với khối
tạo xung, vì baund rate giữa 2 khối bằng nhau nên xung baund rate mang từng bit vào thanh ghi RSR, khi
một farm được truyền hoàn tất (xuất hiện 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 có lỗi thì các bit OERR, FERR dùng để thông báo. Quá trình nhận
cũng tạo ra ngắt RCIF = 1, bằng cách thiết lập bit RCIE = 1 mỗi khi có dữ liệu truyền đến thì sẽ sinh ra
ngắt và PIC sẽ tạm dừng chương trình hiện thời để xử lý dữ liệu vừa nhận được.
Như vậy các bước cho quá trình nhận dữ liệu bao gồm:
1. Khởi tạo baund rate: ở thanh ghi SPBRG
Cho phép quá trình truyền thông không đồng bộ bằng cách thiết lập SPEN = 1; SYNC = 0;
2. Cho phép ngắt quá trình nhận dữ liệu CREN = 1;
3. Cho phép ngắt toàn cục: CIE = 1; PEIE = 1;
4. Xử lý các phần khác của chương trình khi có ngắt xảy ra thì xử lý dữ liệu.
Thanh ghi quy định chế độ nhận:
tạo xung, vì baund rate giữa 2 khối bằng nhau nên xung baund rate mang từng bit vào thanh ghi RSR, khi
một farm được truyền hoàn tất (xuất hiện 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 có lỗi thì các bit OERR, FERR dùng để thông báo. Quá trình nhận
cũng tạo ra ngắt RCIF = 1, bằng cách thiết lập bit RCIE = 1 mỗi khi có dữ liệu truyền đến thì sẽ sinh ra
ngắt và PIC sẽ tạm dừng chương trình hiện thời để xử lý dữ liệu vừa nhận được.
Như vậy các bước cho quá trình nhận dữ liệu bao gồm:
1. Khởi tạo baund rate: ở thanh ghi SPBRG
Cho phép quá trình truyền thông không đồng bộ bằng cách thiết lập SPEN = 1; SYNC = 0;
2. Cho phép ngắt quá trình nhận dữ liệu CREN = 1;
3. Cho phép ngắt toàn cục: CIE = 1; PEIE = 1;
4. Xử lý các phần khác của chương trình khi có ngắt xảy ra thì xử lý dữ liệu.
Thanh ghi quy định chế độ nhận:
- SPEN: Khởi tạo cổng nối tiếp
- SPEN = 1; // Cho phép cổng nối tiếp
- SPEN = 0; // Không cho phép
- RX9: Cho phép nhận 9bit
- RX9 = 1; // Cho phép nhận 9bit
- RX9 = 0; // Nhan 8bit
- CREN: Cho phép nhận liên tục
- CREN = 1; // Cho phép
- CREN = 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 )
- ADDEN = 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.
- ADDEN = 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
- FERR == 1; // Có lỗi.
- FERR == 0; // Không có lỗi.
- OERR: Lỗi OVERRUN
- OEER == 1 ; // Có lỗi
- OEER == 0; // Không lỗi
- RX9D: Lưu dữ liệu nhân của bit thứ 9
- Thanh ghi TXREG: Dùng để chứa dữ liệu truyền đi.
- Thanh ghi RCREG: Dùng để lưu dữ liệu từ ngoài vào.
- Thanh ghi SPBRG: Thiết lập baud rate của PIC
3. BaudRate và Công thức tính Baud Rate.
Như mình đã nêu trên, UART khác với I2C ở điểm là nó không có dây CLK. Vậy để 2 thiết bị truyền
và nhận dữ liệu hiểu được độ dài của mỗi bit tín hiệu để gửi và nhận chính xác tín hiệu thì ta cần phải
thiết lập được độ dài của bit tín hiệu. Ta có thể hiểu nó là baund rate.
Công thức tính:
- SPEN = 0; // Không cho phép
- RX9: Cho phép nhận 9bit
- RX9 = 1; // Cho phép nhận 9bit
- RX9 = 0; // Nhan 8bit
- CREN: Cho phép nhận liên tục
- CREN = 1; // Cho phép
- CREN = 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 )
- ADDEN = 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.
- ADDEN = 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
- FERR == 1; // Có lỗi.
- FERR == 0; // Không có lỗi.
- OERR: Lỗi OVERRUN
- OEER == 1 ; // Có lỗi
- OEER == 0; // Không lỗi
- RX9D: Lưu dữ liệu nhân của bit thứ 9
- Thanh ghi TXREG: Dùng để chứa dữ liệu truyền đi.
- Thanh ghi RCREG: Dùng để lưu dữ liệu từ ngoài vào.
- Thanh ghi SPBRG: Thiết lập baud rate của PIC
3. BaudRate và Công thức tính Baud Rate.
Như mình đã nêu trên, UART khác với I2C ở điểm là nó không có dây CLK. Vậy để 2 thiết bị truyền
và nhận dữ liệu hiểu được độ dài của mỗi bit tín hiệu để gửi và nhận chính xác tín hiệu thì ta cần phải
thiết lập được độ dài của bit tín hiệu. Ta có thể hiểu nó là baund rate.
Công thức tính:
- Ảnh mô phỏng protues.
Ok mình chỉ giới thiệu với các bạn như vậy thôi nha có gì các bạn xem Datasheet với tham khảo các diễn đàn khác nha !
- Link download project Click here
EmoticonEmoticon