Lập trình qua UART

Một phần của tài liệu Lập trình ARM của Ngô Vinh (Trang 70 - 78)

- LPCxxx có 2 chíp UARTs. UART1 có những tính năng hiện đại. Các thiết bị kết nối phù hợp với chuẩn công nghiệp 550. 16 bytes truyền và nhận theo kiểu FIFOs.

Trang 71

Thanh ghi PINSEL0 cấu hình cho UART:

STT Chân Kí hiệu Giá trị Chọn chân

1 1:0 P0.0 01 TxD của UART0 2 3:2 P0.1 01 RxD của UART0 3 17:16 P0.8 01 TxD của UART1 4 19:18 P0.9 01 RxD của UART1 5 21:20 P0.10 01 Có thể RTS của UART1 6 23:22 P0.11 01 Có thể CTS của UART1 7 25:24 P0.12 01 Có thể DST của UART1 8 27:26 P0.13 01 Có thể DTR của UART1 9 29:28 P0.14 01 Có thể DCDcủa UART1 31:30 P0.15 01 Có thể RI của UART1

Các thanh ghi của UART:

- Thanh ghi Receiver Buffer Register – UxRBR: là thanh ghi đệm nhận dữ liệu 8 bít. Khi bít DLAB (Divisor Latch Access Bit) trong thanh ghi UxLCR thì cho phép đọc giá trị thanh ghi này. Thanh ghi này chỉ cho phép đọc, không đƣợc phép ghi.

- Thanh ghi Transmit Holding Register UxTHR: Là thanh ghi đệm truyền 8 bít dữ liệu. Khi bít DLAB = 0 cho phép ghi kí tự lên thanh ghi này mà không cho phép đọc dữ liệu từ thanh ghi.

- Thanh ghi chốt phần chia Divisor Latch Registers – UxDLL: Chứa tốc độ truyền dữ liệu, gồm 2 thanh ghi 8 bít là DLL và DLM. Các thanh ghi này đƣợc truy cập khi bít DLAB=1.

- Thanh ghi Fractional Divider Register –UxFDR: Là thanh ghi 31 bít dùng để điều khiển tốc độ truyền dữ liệu theo xung nhịp hệ thống và có thể đọc ghi theo ý của ngƣời dùng. Các bít 3:0 chứa giá trị DIVADDVAL, các bít 7:4 chứa giá trị MULVAL, với 0 <= DIVADDVAL<=15 và 0< MULVAL <=15. Khi đó tốc độ truyền đƣợc tính theo công thức sau:

Trang 72

Thanh ghi này chir đƣợc sử dụng trong một số phiên bản của LPC từ 213x trở lên.

Tính toán tốc độ của UART:

Thí dụ 1: Tính toán tốc độ của UART0 theo PCLK của hệ thống. Khi PCLK = 20 MHz, U0DL = 130 (U0DLM = 0x00 and U0DLL = 0x82), DIVADDVAL = 0 và MULVAL = 1 sẽ cho phép UART0 đạt tới tốc độ 9615 bauds.

Example 2: Tính toán tốc độ của UART0 theo PCLK của hệ thống. Khi PCLK = 20 MHz, U0DL = 93 (U0DLM = 0x00 and U0DLL = 0x5D), DIVADDVAL = 2 và MULVAL = 5 sẽ cho tốc độ UART0 là 9600 bauds.

- Thanh ghi cho phép ngắt Interrupt Enable Regi ster – UxIER: Hoạt động khi DLAB=0.

Bít Ý nghĩa

0 =1 cho phép sinh ra ngắt khi nhận dữ liệu 1 =1 cho phép sinh ra ngắt khi truyền dữ liệu 2 =1 Cho phép ngắt khi thay đổi trạng thái chân Rx

- Thanh ghi điều khiển hàng đợi FIFO Control Register - UxFCR:

- Thanh ghi điều khiển đƣờng truyền: Line Control Register - U0LCR: Là thanh ghi 8 bít với chức năng cụ thể của các bít nhƣ sau:

Bít Giá trị và ý nghĩa 1:0 Chứa số bít dữ liệu 00- 5 bít 01-6 bít 10-7 bít 11-8 bít 2 Bít stop 0- 1 bít 1-2 bít (1.5 bít nếu bít 1:0=00)

3 0-Không kiểm tra chắn/lẻ

1-Cho phép kiểm tra chẵn/lẻ

5:4 00-Kiểm tra lẻ

Trang 73

10-bắt buộc kết quả bằng 0 11-bắt buộc kết quả bằng 1

6 Cho phép ngắt khi truyền

0-không cho phép

1- chân TxD=0 khi UxLCR[6]=1

7 DLAB-bít chốt

0-Không cho phép truy cập thanh ghi tốc độc DLL và DLM (adsbygoogle = window.adsbygoogle || []).push({});

1-Cho phép truy cập thanh ghi DLL và DLM

Thanh ghi trạng thái đƣờng truyền Line Status Register – UxLSR: Là thanh ghi chỉ đcoj cung cấp trạng thái của quá trình nhận và gửi dữ liệu.

Bít Kí hiệu Giá trị, ý nghĩa

0 RBR 0-UxRBR rỗng

1- UxRBR có dữ liệu

1 OE 0-Không kích hoạt lỗi tràn FIFO nhận 1-Kích hoạt lỗi tràn FIFO nhận

2 PE 0-Không kích hoạt lỗi kiểm tra chẵn lẻ 1-Kích hoạt lỗi kiểm tra chẵn lẻ

3 FE 0-không kích hoạt lỗi bít stop=0 1- kích hoạt lỗi bít stop=0 4 BI 0-không kích hoạt ngắt break

1-kích hoạt ngắt break

5 THRE 0-Đệm truyền UxTHR có dữ liệu 1-Đệm truyền UxTHR rỗng

6 TEMT 0-Đệm truyền UxTHR hoặc UxTSR có dữ liệu 1-Đệm truyền UxTHR hoặc UxTSR rỗng 7 RxFE 0-UxRBR không có lỗi

1- UxRBR có ít nhất một lỗi

Cài đặt UART0 nhƣ sau:

Trang 74 {

PINSEL0 = 0x00050000; /* cho phep RxD1 va TxD1*/

U1LCR = 0x00000083; /* 8 bít dữ liệu, không bít Parity, 1 Stop bit */ U1DLL = 0x000000C2; /* tốc độ 9600, xung nhịp clock 30MHz VPB */ U1LCR = 0x00000003; /* DLAB = 0*/

}

- Chân chọn khối phải đƣợc lập trình để vi xử lý chuyển từ chức năng GPIO sang UART. Thanh ghi điều khiển đƣờng truyền ( line control register ) UART đƣợc sử dụng để định dạng khung truyền dữ liệu.

Hình 3.17. Thanh ghi điều khiển đƣờng truyền LCR của UART

- Tần số hoạt động của UART đƣợc chia từ Pclk, gấp 16 lần tốc độ truyền dữ liệu và tính theo công thức:

Divisor = Pclk/16 x BAUD

- Giả sử Pclk=30MHz: Divisor = 30,000,000/16 x 9600 = (approx) 194 or 0xC2 Không thể lấy tốc độ chính xác của UART, tuy nhiện các cổng này có thể hoạt động với sai số tốc độ 5%. Nếu muốn điều chỉnh Pclk để nhân đƣợc tốc độ chính xác thì phải sử dụng đến CAN.

- Giá trị Divisor đƣợc tổ chức thành 2 thanh ghi Divisor latch MSB (DLM) và Divisor latch LSB (DLL). 8 bít đầu tiên của cả 2 thanh ghi chứa nửa giá trị chia nhƣ hình dƣới, cuối cùng, bít DLAB đƣợc set =0 để bảo vệ nội dung của thanh ghi chia tốc độ:

Trang 75

Hình 3.18. Thiết lập tốc độ của UART

- Khi UART đƣợc khởi tạo, các kí tự có thể đƣợc truyền bằng cách ghi tới thanh ghi Transmit Holding Register. Các kí tự nhận đƣợc có thể đọc đƣợc từ thanh ghi đệm nhận (receive buffer register). Thực chất cả hai thanh ghi này là 1, và việc đọc ghi theo cơ chế FIFO. Hai chƣơng trình con dƣới đây mô tả việc gửi và nhậ kí tự.\

int putchar (int ch) /* Ghi một ký tự tới cổng Serial */ {

if (ch == '\n') {

while (!(U1LSR & 0x20));

U1THR = CR; /* output CR */ } (adsbygoogle = window.adsbygoogle || []).push({});

while (!(U1LSR & 0x20)); return (U1THR = ch); }

int getchar (void) /* Đọc từ cổng Serial */ {

while (!(U1LSR & 0x01)); return (U1RBR);

Trang 76 }

Trong thƣ viện STDIO của Keil C có thể sử dụng hàm printf() và scanf(). Cả hai hàm putchar() và getchar() đều đọc thanh ghi liên kết trạng thái (LSR) để kiểm tra lỗi và trạng thái truyền và nhận.

Hình 3.19. Thanh ghi liên kết trạng thái cho phép kiểm tra lỗi

UART có 1 ngắt tới VIC, nhƣng có 3 nguồn ngắt. Các ngắt đƣợc sinh ra khi thay đổi trạng thái đƣờng nhận (receive line status). Nếu có một lỗi phát sinh thì một ngắt sẽ đƣợc sinh ra và thanh ghi liên kết trạng thái sẽ đƣợc đọc để tìm nguyên nhân lỗi, Hai loại ngắt còn lại sinh ra do nhận và truyền dữ liệu. Ngắt sinh ra sẽ đƣợc theo dõi bởi các ký tự nhận đƣợc trong chân RX FIFO. Các ngắt đƣợc theo dõi trong thanh ghi điều khiển UART FIFO.

Trang 77

Hình 3.20. Bảng theo dõi các ngắt

Khi truyền sinh ra ngắt khi thanh ghi đệm truyền và thanh ghi dịch truyền là rỗng:

Hình 3.21. Ngắt tạo ra khi truyền

UART1 có cấu trúc giống UART0 nhƣng có hỗ trợ thêm modem điều khiển. Có thêm các chân mở rộng để hỗ trợ giao diện modem: CTS, DCD, DSR, DTR, RI, RTS, có thêm 2 thanh ghi: điều khiển modem và trạng thái modem; và một nguồn ngắt để cung cấp thêm trạng thái ngắt của modem.

Trang 78

Hình 3.22. Cấu trúc chân mở rộng của UART1

Một phần của tài liệu Lập trình ARM của Ngô Vinh (Trang 70 - 78)