intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Bài giảng Vi xử lý: Chương 8 - Nguyễn Lý Thiên Trường

Chia sẻ: _ _ | Ngày: | Loại File: PDF | Số trang:83

1
lượt xem
0
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Bài giảng "Vi xử lý" Chương 8 - Cổng nối tiếp (Serial port), được biên soạn gồm các nội dung chính sau: Giới thiệu; Giao thức USART trên ATmega324P; Giao thức SPI trên ATmega324P; Giao thức TWI trên ATmega324P. Mời các bạn cùng tham khảo!

Chủ đề:
Lưu

Nội dung Text: Bài giảng Vi xử lý: Chương 8 - Nguyễn Lý Thiên Trường

  1. Chương 8 Cổng nối tiếp (Serial port) Tài liệu tham khảo: 1. Chương 8: Cổng nối tiếp (Giáo trình VXL) 2. Muhammad Ali Mazidi, AVR Microcontroller and Embedded Systems: Using Assembly and C, Pearson New International Edition, 2014. 3. Datasheet ATmega324P 4. https://nicerland.com/avr/ 5. http://www.hocavr.com/ 6. https://www.youtube.com/watch?v=Fr2K9pzec8g&list=PLgwJf8NK- 2e55CdbY_WnY6pejPHoojCkJ Nguyễn Lý Thiên Trường 1
  2. 8.1 Giới thiệu 8.2 Giao thức USART trên ATmega324P 8.2.1 Cài đặt tốc độ truyền nối tiếp (baud rate) 8.2.2 Khối truyền/nhận dữ liệu 8.2.3 Các thanh ghi điều khiển và trạng thái UCSRnA, UCSRnB và UCSRnC 8.2.4 Lập trình giao tiếp UART với ATmega324P 8.3 Giao thức SPI trên ATmega324P 8.4 Giao thức TWI trên ATmega324P Nguyễn Lý Thiên Trường 2
  3. 8.1 Giới thiệu ▪ Việc truyền dữ liệu giữa các vi điều khiển hoặc giữa vi điều khiển với thiết bị ngoại vi được thực hiện theo hai cách: song song và nối tiếp. ▪ Trong truyền dữ liệu song song: nhiều bit được phát (truyền)/thu (nhận) cùng lúc trên đường truyền (được gọi là bus). ▪ Trong truyền dữ liệu nối tiếp: từng bit được phát/thu trên đường truyền (sử dụng 1 hoặc một vài đường dây). Nguyễn Lý Thiên Trường 3
  4. 8.1 Giới thiệu ▪ Truyền thông nối tiếp sử dụng hai phương thức: đồng bộ (synchronous) và bất đồng bộ (asynchronous). ▪ Trong phương thức đồng bộ thì mỗi lần truyền/nhận một khối dữ liệu (các ký tự liên tiếp nhau) với tốc độ phát/thu dữ liệu không đổi. Phương pháp này yêu cầu giữa phía phát và phía thu phải được đồng bộ bởi tín hiệu xung clock (còn gọi là tín hiệu xung nhịp, hay xung đồng hồ). ▪ Trong phương thức truyền nối tiếp bất đồng bộ chỉ truyền một byte cho mỗi lần truyền. Phương pháp này không sử dụng xung clock để đồng bộ mà sử dụng định dạng khung (frame). 4
  5. 8.1 Giới thiệu ▪ Một định dạng khung cơ bản trong truyền nối tiếp bất đồng bộ gồm: o Start bit (St): luôn là bit 0, dùng để báo hiệu bắt đầu khung truyền. o Tiếp theo là các bit dữ liệu (từ 5 đến 9 bit, LSB được truyền/nhận trước). o Kết thúc là stop bit (Sp) luôn là bit 1 (có thể là 1 hoặc 2 bit 1), dùng để báo hiệu kết thúc khung dữ liệu. ▪ Để tăng thêm độ tin cậy của dữ liệu trong quá trình phát, 1 bit kiểm tra chẵn lẻ (gọi là parity-check bit) P có thể được thêm vào giữa bit dữ liệu cuối cùng (MSB) và stop bit. ▪ Bit rate = 1/Tb với Tb là thời gian truyền 1 bit. ▪ Bit rate = N x Baud rate với N là số bit để biểu diễn cho một tín hiệu (hay một symbol). Ví dụ: điều chế BPSK: N = 1, QPSK: N = 2. Trong chương này, sử dụng N = 1. 5
  6. 8.1 Giới thiệu ▪ ATmega324P hỗ trợ 3 giao thức nối tiếp gồm USART (USART0 và USART1), SPI và TWI (Two-wire Serial Interface) (tương đương với giao thức I2C). o Chân XCK0/XCK1: có chức năng phát xung clock (chế độ master) hoặc nhận xung clock (chế độ slave) khi giao thức USART hoạt động ở chế độ truyền nối tiếp đồng bộ. o Các chân /SS, MOSI, MISO, SCK: cung cấp các tín hiệu trong giao thức SPI. o Các chân RXD0/TXD0, RXD1/TXD1: dùng để thu/nhận (trên chân RXD) và truyền/phát (trên chân TXD) khi giao thức USART hoạt động ở chế độ truyền nối tiếp bất đồng bộ/đồng bộ. Lưu ý: trong trường hợp truyền nối tiếp bất đồng bộ, không sử dụng chân XCK0/XCK1 vì trong giao tiếp nối tiếp bất đồng bộ không cần đến tín hiệu xung clock đồng bộ XCK0/XCK1. o Các chân SCL, SDA: cung cấp các tín hiệu trong giao thức TWI. ▪ USART: Universal Synchronous-Asynchronous Receiver-Transmitter. ▪ SPI: Serial Peripheral Interface. ▪ TWI: Two-Wire Serial Interface. 6
  7. Có chức năng phát xung clock (chế độ master) hoặc nhận xung clock (chế độ slave) khi giao thức USART hoạt động ở chế độ truyền nối tiếp đồng bộ. Cung cấp các tín ATmega324P hiệu trong giao thức SPI. Dùng để thu/nhận (trên chân RXD) và truyền/phát (trên chân TXD) khi giao thức USART hoạt động ở chế độ truyền nối tiếp bất đồng bộ/đồng bộ. ▪ USART: Universal Synchronous-Asynchronous Receiver-Transmitter. Cung cấp các tín hiệu ▪ SPI: Serial Peripheral Interface. trong giao thức TWI ▪ TWI: Two-Wire Serial Interface. Nguyễn Lý Thiên Trường 7
  8. 8.2 Giao thức USART trên ATmega324P ❖ Một số đặc điểm giao thức USART trên ATmega324P: ▪ Hỗ trợ hai USART: USART0 và USART1. Ký hiệu là USARTn, với n = 0, 1. ▪ Hỗ trợ giao tiếp chế độ song công toàn phần (full duplex) (thu và phát độc lập nhau). ▪ Hỗ trợ chế độ giao tiếp nối tiếp bất đồng bộ và đồng bộ. ▪ Hỗ trợ chế độ giao tiếp nối tiếp đồng bộ Master – Slave. ▪ Tốc độ truyền thông (baud rate) thay đổi được. ▪ Hỗ trợ các khung truyền nối tiếp với 5, 6, 7, 8, hoặc 9 bit dữ liệu và 1 hoặc 2 stop bit. ▪ Khối tạo bit kiểm tra chẵn lẻ (bên phát) và khối kiểm tra lỗi bit này (bên thu) bằng phần cứng. ▪ Phát hiện chồng chập dữ liệu (Data OverRun). ▪ Phát hiện lỗi khung truyền (Frame Error). ▪ Khối lọc nhiễu gồm khối phát hiện lỗi start bit và bộ lọc số thông thấp. ▪ 3 ngắt: phát USARTn_TX hoàn thành, bộ đệm phát USARTn_UDRE rỗng, thu USARTn_ RX hoàn thành. ▪ Chế độ truyền thông đa xử lý (Multi-processor). ▪ Chế độ tăng gấp đôi tốc độ baud khi truyền nối tiếp bất đồng bộ và đồng bộ. Nguyễn Lý Thiên Trường 8
  9. ❖ Sơ đồ khối của USART trên ATmega324P ❖ Khối tạo xung nhịp/baud rate: ▪ UBRRn: USART Baud Rate Register ▪ … ❖ Khối phát dữ liệu: ▪ UDRn: USART Data Register (bộ đệm phát) ▪ Tạo kiểm tra chẵn lẻ ▪ … ❖ Khối thu dữ liệu: ▪ UDRn: USART Data Register (bộ đệm thu) ▪ Kiểm tra lỗi khung,… ▪ … Các thanh ghi điều khiển và trạng thái 9
  10. ❖ Các thanh ghi sử dụng trong chế độ truyền bất đồng bộ (UART) Địa chỉ MEM Tên thanh ghi Truy xuất bit Chức năng 0xC0 UCSR0A Có Cờ báo trạng thái UART 0xC1 UCSR0B Có Điều khiển trạng thái UART USART0 0xC2 UCSR0C Có Cài đặt định dạng truyền UART 0xC4 UBRR0L Không Cài đặt baudrate byte thấp 0xC5 UBRR0H Không Cài đặt baudrate byte cao 0xC6 UDR0 Không Đệm dữ liệu phát/thu nối tiếp 0xC8 UCSR1A Có Cờ báo trạng thái UART 0xC9 UCSR1B Có Điều khiển trạng thái UART 0xCA UCSR1C Có Cài đặt định dạng truyền UART USART1 0xCC UBRR1L Không Cài đặt baudrate byte thấp 0xCD UBRR1H Không Cài đặt baudrate byte cao 0xCE UDR1 Không Đệm dữ liệu phát/thu nối tiếp ▪ USART0 và USART1 hoạt động độc lập nhau. Nguyễn Lý Thiên Trường 10
  11. 8.2.1 Cài đặt tốc độ truyền nối tiếp (baud rate) UBRRn[11:8] UBRRnH UBRRn[7:0] UBRRnL ▪ Thanh ghi UBRRn là thanh ghi 16 bit (UBRRnH là byte cao và UBRRnL là byte thấp) (thuộc vùng I/O mở rộng), nhưng chỉ có 12 bit thấp (UBRRn[11:0]) được sử dụng để điều chỉnh tốc độ baud. ▪ Chú ý là nếu ghi giá trị vào thanh ghi UBRRnL thì tốc độ baud sẽ được cập nhật tức thời. Do đó, khi lập trình, chúng ta phải nạp giá trị vào thanh ghi UBRRnH trước khi nạp vào thanh ghi UBRRnL. ▪ Thanh ghi UBRRn được kết nối với một bộ đếm xuống đặt trước hệ số (PDC: Prescaling Down-Counter) từ giá trị là nội dung của thanh ghi UBRRn. Baud rate 11
  12. 8.2.1 Cài đặt tốc độ truyền nối tiếp (baud rate) ▪ Tốc độ baud trong truyền nối tiếp bất đồng bộ (UART) và đồng bộ (USRT) được xác định như sau: 2U2Xn × 𝑓𝑜 𝑠𝑐 Tốc độ baud = 16 × 𝑋 + 1 Trong đó: o 𝑋 là giá trị (không dấu) được nạp vào thanh ghi UBRRn. o fosc là tần số clock hệ thống o U2Xn là bit 1 của thanh ghi UCSRnA. Lưu ý: khi U2Xn = 1: tăng gấp đôi tốc độ baud. ▪ Xác định giá trị nạp vào thanh ghi UBRRn để cài đặt tốc độ baud: 2U2Xn × 𝑓𝑜 𝑠𝑐 𝑋= −1 16 × Tốc độ baud Nguyễn Lý Thiên Trường 12
  13. 8.2.1 Cài đặt tốc độ truyền nối tiếp (baud rate) Ví dụ 1: Cho fosc = 8MHz, CKDIV8 = 1, U2X0 = 0, chế độ truyền nối tiếp bất đồng bộ. Tìm giá trị nạp vào thanh ghi UBRR0 để đạt được tốc độ baud sau: a) 9600 và b) 4800. Giải: ▪ Tốc độ baud = 2U2Xnfosc/[16(X+1)] → giá nạp vào thanh ghi UBRRn được tính bởi: X = [(2U2Xn.fosc/ Tốc độ baud)]/16 – 1 a) Với fosc = 8MHz, U2X0 = 0, tốc độ baud = 9600: X = [(20x8x106/9600)]/16 – 1 = 51.08 Vì nội dung thanh ghi UBRR0 là số nguyên, do đó chọn X = 51 hay 33H b) Với fosc = 8MHz, U2X0 = 0, tốc độ baud = 4800: X = [(20x8x106/4800)]/16 – 1 = 103.17 Vì nội dung thanh ghi UBRR0 là số nguyên, do đó chọn X = 103 hay 67H Nguyễn Lý Thiên Trường 13
  14. ▪ Từ ví dụ 1, chúng ta thấy rằng, giá trị nạp vào thanh ghi UBRR0 phải là số nguyên. Điều này dẫn đến sai số khi tính tốc độ baud. Sai số được tính như sau: Sai số (%) = [(Tốc độ baud thực tế/Tốc độ baud mong muốn) – 1] x 100 ▪ Để đảm bảo dữ liệu truyền và nhận trong truyền thông nối tiếp đáng tin cậy, sai số cho phép không được vượt quá 2% (theo thực tế). Ví dụ 2: Tính sai số tốc độ baud trong chế độ truyền nối tiếp bất đồng bộ ứng với tốc độ baud mong muốn là 19200. Cho fosc = 4MHz, CKDIV8 = 1, U2X0 = 0. Giải: ▪ Với fosc = 4MHz, U2X0 = 0, tốc độ baud = 19200: X = [(20x4x106/19200)]/16 – 1 = 12.02 → Chọn X = 12 ▪ Với X = 12: Tốc độ baud thực tế là: 2U2Xnfosc/[16(X+1)] = 20x4x106/[16(12+1)] = 19230 ▪ Sai số (%) = [(Tốc độ baud thực tế/Tốc độ baud mong muốn) – 1] x 100 = [(19230/19200) – 1] x 100 = 0.2% < 2% (chấp nhận được). Nguyễn Lý Thiên Trường 14
  15. 8.2.1 Cài đặt tốc độ truyền nối tiếp (baud rate) Ví dụ tốc độ baud theo giá trị thanh ghi UBRRn, fosc và sai số tương ứng fosc = 8.0000MHz fosc = 11.0592MHz fosc = 14.7456MHz Baud Rate [bps] U2Xn = 0 U2Xn = 1 U2Xn = 0 U2Xn = 1 U2Xn = 0 U2Xn = 1 UBRRn Error UBRRn Error UBRRn Error UBRRn Error UBRRn Error UBRRn Error 2400 207 0.2% 416 -0.1% 287 0.0% 575 0.0% 383 0.0% 767 0.0% 4800 103 0.2% 207 0.2% 143 0.0% 287 0.0% 191 0.0% 383 0.0% 9600 51 0.2% 103 0.2% 71 0.0% 143 0.0% 95 0.0% 191 0.0% 14.4k 34 -0.8% 68 0.6% 47 0.0% 95 0.0% 63 0.0% 127 0.0% 19.2k 25 0.2% 51 0.2% 35 0.0% 71 0.0% 47 0.0% 95 0.0% 28.8k 16 2.1% 34 -0.8% 23 0.0% 47 0.0% 31 0.0% 63 0.0% 38.4k 12 0.2% 25 0.2% 17 0.0% 35 0.0% 23 0.0% 47 0.0% 57.6k 8 -3.5% 16 2.1% 11 0.0% 23 0.0% 15 0.0% 31 0.0% 76.8k 6 -7.0% 12 0.2% 8 0.0% 17 0.0% 11 0.0% 23 0.0% 115.2k 3 8.5% 8 -3.5% 5 0.0% 11 0.0% 7 0.0% 15 0.0% 230.4k 1 8.5% 3 8.5% 2 0.0% 5 0.0% 3 0.0% 7 0.0% 250k 1 0.0% 3 0.0% 2 -7.8% 5 -7.8% 3 -7.8% 6 5.3% 0.5M 0 0.0% 1 0.0% - - 2 -7.8% 1 -7.8% 3 -7.8% 1M - - 0 0.0% - - - - 0 -7.8% 1 -7.8% Max. (1) 0.5Mbps 1Mbps 691.2kbps 1.3824Mbps 921.6kbps 1.8432Mbps (1) UBRRn = 0, Error = 0.0% Nguyễn Lý Thiên Trường 15
  16. 8.2.2 Khối truyền/nhận dữ liệu UDREn = 1: bộ đệm phát trống (rỗng) và sẵn sàng để ghi dữ liệu mới vào. RXCn = 1: Bộ đệm thu đầy và sẵn sàng Lưu ý: sau khi reset hệ thống, UDREn = 1 để đọc từ bộ đệm thu. Bộ đệm thu: Cấu tạo Bộ đệm phát: Cấu tạo gồm một FIFO (First gồm một FIFO (First In, First Out) 2 mức. Bộ đệm phát (chỉ ghi) In, First Out) 1 mức. Bộ đệm thu (chỉ đọc) TXCn = 1: toàn bộ dữ liệu của một frame trong thanh ghi dịch phát (Transmit Shift Register) được dịch hết ra ngoài trên chân TxD và không có dữ liệu mới nào được ghi vào UDRn. Thanh ghi dịch thu Thanh ghi dịch phát RXB[7:0] UDRn (Read) TXB[7:0] UDRn (Write) Nguyễn Lý Thiên Trường 16
  17. 8.2.3 Các thanh ghi điều khiển và trạng thái UCSRnA, UCSRnB và UCSRnC RXCn TXCn UDREn FEn DORn UPEn U2Xn MPCMn UCSRnA = 1: cho phép truyền thông đa xử lý (1 Master – nhiều Slave). = 1: cho phép tăng gấp 2 tốc độ baud trong chế độ truyền nối tiếp bất đồng bộ/đồng bộ. = 1: nếu ký tự tiếp theo trong bộ đệm thu có lỗi kiểm tra chẵn lẻ khi thu dữ liệu. = 1: nếu bộ đệm thu đầy (lưu 2 ký tự: byte1, byte2), 1 ký tự (byte3) đang chờ trong thanh ghi dịch thu (Receive Shift Register) và xuất hiện start bit của ký tự mới (byte4). = 1: nếu ký tự tiếp theo trong bộ đệm thu bị lỗi khung truyền. Một khung truyền bị lỗi nếu stop bit đầu tiên là 0. = 1: khi dữ liệu trong bộ đệm phát được chuyển đến thanh ghi dịch phát hay nói cách khác là bộ đệm phát đang trống và sẵn sàng nhận dữ liệu mới. Cờ UDREn được tự động xóa sau khi ghi dữ liệu mới vào thanh ghi UDRn. = 1: khi toàn bộ dữ liệu của một frame (start bit, data bit, [parity bit], stop bit) trong thanh ghi dịch phát (Transmit Shift Register) được dịch hết ra ngoài trên chân TxD và không có dữ liệu mới nào được ghi vào bộ đệm phát UDRn. = 1: khi có dữ liệu mới trong bộ đệm thu chưa được đọc, hay nói cách khác là bộ đệm thu đầy. Cờ RXCn sẽ bị xóa về 0 bằng phần cứng sau khi đọc dữ liệu từ thanh ghi UDRn. 17
  18. 8.2.3 Các thanh ghi điều khiển và trạng thái UCSRnA, UCSRnB và UCSRnC RXCIEn TXCIEn UDRIEn RXENn TXENn UCSZn2 RXB8n TXB8n UCSRnB Bit dữ liệu phát 8 (hay bit phát thứ 9) trong chế độ phát/thu 9 bit, được ghi vào bit TXB8n trước khi ghi các bit dữ liệu thấp vào bộ đệm phát UDRn. Bit dữ liệu thu 8 (hay bit thu thứ 9) trong chế độ phát/thu 9 bit và được đọc trước khi đọc các bit dữ liệu thấp trong bộ đệm thu UDRn. Kết hợp với 2 bit UCSZn1 và UCSZn0 trong thanh ghi UCSRnC quy định độ dài của dữ liệu phát/thu. = 1: cho phép phát. Bit TXENn = 0 không cho phép phát. Quá trình phát chỉ bị vô hiệu hóa sau khi toàn bộ dữ liệu trong thanh ghi dịch phát và bộ đệm phát (UDRn) được phát hoàn toàn ra đường truyền TxD. = 1: cho phép thu. Khi RXENn = 0 thì việc không cho phép bộ thu sẽ có tác dụng ngay lập tức. Dữ liệu đang được thu sẽ bị mất. = 1: cho phép ngắt bộ đệm phát USART trống (USART Data Register Empty Interrupt) khi bit cho phép ngắt toàn cục I = 1 và cờ UDREn trong thanh ghi UCSRnA bằng 1. = 1: cho phép ngắt phát USART hoàn thành (USART Transmit Complete Interrupt) khi bit cho phép ngắt toàn cục I = 1 và cờ TXCn trong thanh ghi UCSRnA bằng 1. = 1: cho phép ngắt thu USART hoàn thành (USART Receive Complete Interrupt) khi bit cho phép ngắt toàn cục I = 1 và cờ RXCn trong thanh ghi UCSRnA bằng 1. 18
  19. 8.2.3 Các thanh ghi điều khiển và trạng thái UCSRnA, UCSRnB và UCSRnC UCSZn1/ UCSZn0/ UCSRnC UMSELn1 UMSELn0 UPMn1 UPMn0 USBSn UCPOLn UDORDn UCPHAn ▪ Bit 7:6 – UMSELn[1:0]: USART Mode Select UMSELn1 UMSELn0 Chế độ (Mode) 0 0 USART bất đồng bộ (hay UART) 0 1 USART đồng bộ (hay USRT) 1 0 Bit dành riêng (Chưa định nghĩa) 1 1 USART Master SPI (hay MSPIM) ▪ Bit 5:4 – UPMn[1:0]: Parity Mode UPMn1 UPMn0 Chế độ kiểm tra chẵn lẻ (Parity Mode) 0 0 Không sử dụng chức năng kiểm tra chẵn lẻ 0 1 Bit dành riêng (Chưa định nghĩa) 1 0 Cho phép kiểm tra chẵn 1 1 Cho phép kiểm tra lẻ o 𝑃even = 𝑑 𝑚−1 ⊕ 𝑑 ⊕ ⋯ ⨁𝑑1 ⨁𝑑0 ⨁0 ▪ Peven: bit kiểm tra chẵn 𝑚−2 ▪ Podd: bit kiểm tra lẻ o 𝑃odd = 𝑑 𝑚−1 ⊕ 𝑑 𝑚−2 ⊕ ⋯ ⨁𝑑1 ⨁𝑑0 ⨁1 ▪ d : bit i của dữ liệu i 19
  20. 8.2.3 Các thanh ghi điều khiển và trạng thái UCSRnA, UCSRnB và UCSRnC UCSZn1/ UCSZn0/ UCSRnC UMSELn1 UMSELn0 UPMn1 UPMn0 USBSn UCPOLn UDORDn UCPHAn ▪ Bit 3 – USBSn: Stop Bit Select Bit USBSn dùng để thiết lập số stop bit là 1 stop bit (USBSn = 0) hay 2 stop bit (USBSn = 1). Bộ thu sẽ bỏ qua stop bit trong quá trình thu. ▪ Bit 2:1 – UCSZn[1:0]: Character Size Các bit UCSZn1 và UCSZn0 kết hợp với bit UCSZn2 (bit 2 trong thanh ghi UCSRnB) để thiết lập số bit dữ liệu (hay kích thước ký tự) trong một khung truyền. UCSZn[2:0] Kích thước ký tự (bit) Lưu ý: trong chế độ master SPI (MSPIM), 000 5 bit 2 là UDORDn (Data Order) dùng để 001 6 thiết lập thứ tự bit được phát/thu. 010 7 UDORDn = 0: MSB được phát/thu trước. 011 8 (mặc định) UDORDn = 1: LSB được phát/thu trước. 100 Bit dành riêng (Chưa định nghĩa) Bit 1 là UCPHAn (Clock Phase) dùng để thiết lập dữ liệu được lấy mẫu tại cạnh 101 Bit dành riêng (Chưa định nghĩa) trước (leasing edge) hay cạnh sau (tailing 110 Bit dành riêng (Chưa định nghĩa) edge) của xung XCKn. 111 9 Lưu ý: giá trị mặc định UCSZn[2:0] là 011 (khung truyền 8 bit data). 20
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
15=>0