BÀI 4: CHUẨN GIAO TIẾP UART TRONG ESP8266 NONOS SDK

UART (Universal Asynchronous Transmitter Receiver) là một chuẩn giao tiếp dùng để truyền và nhận dữ liệu mà đa số hầu hết các loại vi điều khiển đều hỗ trợ, trong đó có ESP8266. Để có thể truyền/nhận được dữ liệu thì chuẩn truyền thông nối tiếp này cần phải sử dụng 03 chân: Tx, Rx và GND.
  • Chân Tx: dùng để truyền dữ liệu.
  • Chân Rx: dùng để nhận dữ liệu.
  • Chân GND: dùng để đồng bộ giữa hai thiết bị sử dụng giao thức UART.
Với phương thức truyền/nhận đơn giản, UART có thể giúp chúng ta thực hiện rất nhiều project, cụ thể như:
  • Dùng để debug => tìm lỗi sai của code.
  • Giao tiếp với máy tính.
  • Truyền nhận dữ liệu với những loại vi điều khiển/vi xử lý khác.
  • Giao tiếp với các loại thiết bị, cảm biến như: Module sim, bluetooh, wifi, Ethernet/Internet, RFID, GPS, ...

Hình 1. Những ngoại vi có thể giao tiếp bằng UART

GIAO THỨC UART
Để có thể thao tác được với giao thức này, chúng ta cần phải nắm một số khái niệm:
Hình 2. Cách truyền - nhận của giao thức UART
  • Tốc độ Baud: thời gian truyền dữ liệu, có đơn vị là Bit trên giây(bits per second). ESP8266 hỗ trợ tốc độ truyền từ 300 đến 4.608.000 (115200 * 40) bits/s. Vì chuẩn giao tiếp này không có chân xung clock để đồng bộ, nên hai thiết bị muốn giao tiếp được với nhau thì cần phải thống nhất về tốc độ Baud (một ví dụ đơn giản là khi chúng ta nói chuyện với người nước ngoài. Để cho hai người có thể hiểu được nhau một cách chính xác, thì đòi hỏi chúng ta phải nói chung một ngôn ngữ - đó là Tiếng Anh chẳng hạn. Đối với vi điều khiển cũng vậy, để hai bên hiểu được thì nó phải thống nhất về tốc độ baud này). Các tốc độ Baud thông dụng: 1200, 2400, 4800, 9600, 57600, 115200, ...
  • Start Bit: Bit này giúp báo hiệu cho bên nhận biết là sắp có dữ liệu được truyền đến. Đối với giao thức UART, hai chân Tx/Rx sẽ được kéo lên mức cao (VCC). Vì vậy,  Bit start sẽ giúp Chân Tx kéo xuống mức thấp để báo hiệu cho một quá trình truyền dữ liệu. Trong ESP8266, chúng ta có thể khai báo chọn 1 hoặc 2 Start Bit.
  • Data bits: Là dữ liệu muốn truyền. Trong ESP8266, chúng ta có thể cấu hình dữ liệu này là 5, 6, 7 hoặc 8 bit.
  • Parity Bit: Là bit giúp chúng ta có thể kiểm tra được dữ liệu nhận được đúng hay sai(đúng nếu dữ liệu nhận được giống với dữ liệu truyền đi và ngược lại). Chúng ta có thể sử dụng hoặc có thể bỏ qua Bit này.
  • Stop Bit: Ngược lại với Start Bit, Stop Bit báo hiệu kết thúc quá trình truyền dữ liệu. Bit này sẽ đưa chân Tx trở lại mức 1 (VCC) để sẵn sàng cho quá trình truyền/nhận tiếp theo nếu có. Trong ESP8266, chúng ta có thể sử dụng 1, 1.5 hoặc 2 Stop Bit.
CÁC HÀM HỖ TRỢ

Trong cấu tạo của ESP8266 có hỗ trợ hai bộ UART (UART0 và UART1). Tuy nhiên, UART1 chỉ có chức năng là Tx (Truyền dữ liệu đi) - thường dùng để debug. Còn lại, chúng ta chỉ có lại UART0 với sơ đồ chân như sau:
  • U0TXD: pin26 (U0TXD)
  • U0RXD: pin 25 (U0RXD).
  • U0CTS: pin 12 (MTCK) - CTS (Request to Send) thường dùng trong giao tiếp RS232.
  • U0RTS: pin 13 (MTDO) - RTS (Clear to Send) thường dùng trong giao tiếp RS232.
Khi cắm ESP8266 D1 mini vào máy tính, tốc độ Baud mặc định của bộ UART0 sẽ phụ thuộc vào tần số thạch anh:
  • Nếu sử dụng thạch anh có tần số là 40Mhz thì tốc độ baud mặc định sẽ là 115200.
  • Nếu sử dụng thạch anh có tần số là 26Mhz thì tốc độ baud mặc định sẽ là 74880.
1. Hàm khai báo khởi tạo UART
void uart_init(UartBautRate uart0_br, UartBautRate uart1_br);
- Chức năng: Khởi tạo tốc độ Baud cho hai bộ UART0 và UART1.
- Tham số truyền vào: 
  • UartBautRate uart0_br: Tốc độ baud cần sử dụng cho bộ UART0.
  • UartBautRate uart1_br: Tốc độ baud cần sử dụng cho bộ UART1.
Cụ thể, các giá trị tốc độ baud chúng ta có thể chọn một trong số những khai báo sau:
typedef enum {
    BIT_RATE_300 = 300,
    BIT_RATE_600 = 600,
    BIT_RATE_1200 = 1200,
    BIT_RATE_2400 = 2400,
    BIT_RATE_4800 = 4800,
    BIT_RATE_9600   = 9600,
    BIT_RATE_19200  = 19200,
    BIT_RATE_38400  = 38400,
    BIT_RATE_57600  = 57600,
    BIT_RATE_74880  = 74880,
    BIT_RATE_115200 = 115200,
    BIT_RATE_230400 = 230400,
    BIT_RATE_460800 = 460800,
    BIT_RATE_921600 = 921600,
    BIT_RATE_1843200 = 1843200,
    BIT_RATE_3686400 = 3686400,
} UartBautRate;
- Ví dụ: uart_init(BIT_RATE_9600, BIT_RATE_9600); //set tốc độ cho cả hai bộ UART0, UART1 là 9600 bps.

2. Khai báo sử dụng tính năng kiểm tra chẵn/lẻ (parity)
void UART_SetParity(uint8 uart_no, UartParityMode Parity_mode);
- Chức năng: Khai báo sử dụng tính năng Parity cho bộ UART mong muốn.
- Tham số truyền vào:
  • uint8 uart_no: bộ UART muốn sử dụng tính năng này (UART0 hoặc UART1).
  • UartParityMode Parity_mode: mode cần kiểm tra (NONE_BITS - không kiểm tra, ODD_BITS - kiểm tra theo lẻ, EVEN_BITS - kiểm tra theo chẵn).
- Ví dụ: UART_SetParity(UART0NONE_BITS); //không sử dụng tính năng kiểm tra lỗi cho UART0.

3. Khai báo chọn số stop bit
void UART_SetStopBits(uint8 uart_no, UartStopBitsNum bit_num);
- Chức năng: chọn số stop bit cho bộ UART mong muốn.
- Tham số truyền vào:
  • uint8 uart_no: bộ UART muốn sử dụng tính năng này (UART0 hoặc UART1).
  • UartStopBitsNum bit_num: số stop bit cần cấu hình (ONE_STOP_BIT - 1 stop bit, ONE_HALF_STOP_BIT - 1.5 stop bit, TWO_STOP_BIT - 2 stop bit).
- Ví dụ: UART_SetStopBits(UART0ONE_STOP_BIT); //sử dụng UART0 với 1 stop bit.

4. Khai báo data bit
void UART_SetWordLength(uint8 uart_no, UartBitsNum4Char len);
- Chức năng: Khai báo chọn data bit cần gửi hoặc nhận.
- Tham số truyền vào:
  • uint8 uart_no: bộ UART muốn sử dụng tính năng này (UART0 hoặc UART1).
  • UartBitsNum4Char len: số data bit cần sử dụng (FIVE_BITS - dữ liệu truyền/nhận là 5 bit, SIX_BITS -  6 bit, SEVEN_BITS - 7 bit, EIGHT_BITS - 8 bit)
- Ví dụ: UART_SetWordLength(UART0 EIGHT_BITS); //Khai báo sử dụng UART0 với 8 bit data.

5. Truyền dữ liệu qua giao thức UART
5.1. Truyền một ký tự (character)
STATUS uart_tx_one_char(uint8 uart, uint8 TxChar);
- Chức năng: sử dụng UART0 để truyền một ký tự
Tham số truyền vào:
  • uint8 uart: cổng UART muốn sử dụng.
  • uint8 TxChar: ký tự muốn truyền.
- Ví dụ: uart_tx_one_char(UART0, 'a');

5.2. Truyền một chuỗi ký tự (String)
5.2.1. Cách 1
void ICACHE_FLASH_ATTR uart0_sendStr(const char *str);
- Chức năng: sử dụng UART0 để truyền một chuỗi ký tự
- Tham số truyền vào:
  • const char *str: chuỗi ký tự cần truyền
- Ví dụ: uart0_sendStr("hello world\n");

5.2.2. Cách 2
void ICACHE_FLASH_ATTR uart0_tx_buffer(uint8 *buf, uint16 len);
- Chức năng:
Truyền một số lượng ký tự trong mảng qua UART.
- Tham số truyền vào:
  • uint8 *buf: Mảng chứa các ký tự cần truyền.
  • uint16 len: Số lượng các ký tự muốn truyền.
5.3. Nhận dữ liệu

CODE MẪU
Hiện chưa có code mẫu!

VIDEO HƯỚNG DẪN
Video hướng dẫn chưa có sẵn!

Nhận xét

Bài đăng phổ biến từ blog này

Dòng điện, điện áp 1 chiều và các định luật cơ bản

Dòng điện 1 chiều (DC) là gì ?

Các cách mắc điện trở

Dòng điện xoay chiều

Biến áp, Triết áp, Phân loại điện trở