Lập trình - Điện tử

Blog Logo

🌱 Communication Protocols - Chuẩn truyền thông theo cách dễ hiểu

🌱 Communication Protocols - Chuẩn truyền thông theo cách dễ hiểu

    Các bạn làm việc với nhúng có thể đã quá quen với các chuẩn truyền thông của vi điều khiển - Communication Protocols (UART, SPI, I2C, CAN, LIN, USB, ..., hay các chuẩn không dây như Wifi, Bluetooth, Zigbee, ...). Bài viết này không nhằm đi sâu vào chuẩn truyền thông nào cả, mà muốn dành cho bạn một cái nhìn tổng quan về chuẩn truyền thông là gì, tại sao lại có nhiều chuẩn truyền thông như thế! Các ngoại vi cụ thể sẽ được giới thiệu trong các bài viết sau của Series này!

    👉 Tại sao cần có các chuẩn truyền thông?

    Dễ hiểu, trong hệ nhúng, khi làm việc với các vi điều khiển và các thiết bị, chúng sẽ cần giao tiếp với nhau! Chẳng hạn, vi điều khiển đọc dữ liệu từ các cảm biến, phát tín hiệu điều khiển các thiết bị, hoặc đơn giản là 2 con vi điều khiển "nói chuyện" với nhau - trao đổi thông tin.

    Giống như con người, vi điều khiển muốn "nói chuyện" với nhau, thì cần phải có cùng "ngôn ngữ", việc "nói chuyện" ở đây gọi là giao tiếp, hay truyền thông. Còn việc quy định các "ngôn ngữ" chung cho việc giao tiếp đó gọi là "chuẩn truyền thông".

Communication protocols

    Vậy thì chuẩn truyền thông đó là gì? Hãy cùng mình phân tích ví dụ sau : 2 con vi điều khiển MCU1 và MCU2 cần giao tiếp với nhau. MCU1 cần truyền một ký tự 'a' (mã nhị phân là ‭0110.0001‬) sang MCU2.

    Đầu tiên, muốn truyền được dữ liệu là các bit, thì giữa MCU1 và MCU2 sẽ cần phải có kết nối về mặt vật lý. Kết nối này có thể là các đường dây điện (kết nối có dây), hoặc là các dạng sóng (kết nối không dây). Trong khuôn khổ bài viết sẽ giới hạn ở kết nối có dây cho đơn giản!

    👉 Truyền thông song song

    Để truyền một ký tự (8-bits) thì đơn giản nhất là chúng ta nối 8 đường dây điện, mỗi đường dây điện sẽ truyền 1 bit (giống như đường bus) - như đoạn GIF bên dưới.

Communication Protocols - Parallel

    Đến đây vẫn chưa đủ, đồng ý mỗi đường dây sẽ truyền 1 bit, nhưng khi nào MCU1 truyền? khi nào MCU2 nhận? Vì dữ liệu truyền đi rồi thì chân đó sẽ làm việc khác nữa nên mức logic sẽ thay đổi, vì vậy 2 MCU cần thống nhất về thời điểm truyền nhận. Và để thống nhất được, chúng ta cần thêm 1 đường dây nữa (Đường màu đỏ trên đoạn GIF). Khi nào muốn truyền, MCU có thể kéo đường dây lên mức 1 ➔ xuất tín hiệu 8 bits cần truyền  nhận được tín hiệu này thì MCU2 sẽ đọc 8 chân để lấy được data  đưa đường truyền tín hiệu xuống mức 0 để báo lại với MCU1.

    Cách giao tiếp trên đây gọi là truyền thông song song (Parallel Communucation), tức là chúng ta sử dụng nhiều chân để truyền dữ liệu (nhiều ở đây là từ 2 chân trở lên). Truyền thông song song thường hay gặp nhất ở các loại màn hình LCD, với chế độ truyền 4bits hoặc 8bits.

    Truyền thông song song có ưu điểm là tốc độ truyền cao, tuy nhiên lại có nhược điểm là gây tốn chân của vi điều khiển. Nó thường áp dụng cho việc giao tiếp yêu cầu tốc độ cao như màn hình LCD, RAM, PCI, printer, ...

    Tuy nhiên, tài nguyên của vi điều khiển, đặc biệt là pin thì có hạn, trong khi đó có một số thiết bị cũng không nhất thiết cần truyền nhận tốc độ cao như màn hình, nên người ta muốn có cách truyền thông tốn ít dây hơn (cụ thể là 1 hoặc 2 dây), còn tốc độ thì bị giảm 1 chút cũng không sao! Và đó chính là truyền thông nối tiếp - Serial Communication.

    👉 Truyền thông nối tiếp

    Dễ thấy truyền thông nối tiếp thì bên truyền và nhận sẽ giao tiếp trên một đường dây (cả truyền và nhận) hoặc hai đường dây (một dây truyền, một dây nhận). Data sẽ được truyền đi theo từng bit. Trong khi data từ các đường bus của vi điều khiển là dạng song song (thường lưu trong các thanh ghi). Nên việc đầu tiên cần làm đó là chuyển từ dạng song song sang nối tiếp từng bit để truyền đi, và ngược lại chuyển từ từng bit nối tiếp sang song song ở bên nhận.

    🔻 Thanh ghi dịch

    Để chuyển đổi giữa song song - nối tiếp, chúng ta có cơ chế thanh ghi dịch - Shift Register.

    Thanh ghi dịch là tập hợp của các D-Flip-Flop nhằm mục đích đẩy từng bit data đi, hoặc nhận từng bit data về theo mỗi chu kỳ clock. Dưới đây là một ví dụ về thanh ghi dịch chuyển dữ liệu nối tiếp thành song song.

Communication Protocols - Shift Register
Hoạt động của thanh ghi dịch - Shift Register

    Tiếp theo, giống như trường hợp Parallel Communication, để cả hai bên biết được khi nào truyền/nhận từng bit, thì cũng sẽ cần thêm cơ chế báo hiệu nào đó! Ở đây chúng ta có hai cách.

    🔻 Truyền thông nối tiếp đồng bộ - Synchronous Serial Communication

    Làm giống như Parallel Communication, thêm một dây tín hiệu nữa, khi nào MCU1 truyền, thì set dây tín hiệu lên mức cao (1) để báo cho bên nhận biết để nhận.

Communication Protocol - Serial
Truyền thông nối tiếp đồng bộ

    Dễ thấy, đường dây tín hiệu đang mang một tín hiệu xung vuông (clock) khi dữ liệu truyền liên tục, và để tự động hóa việc truyền dữ liệu, người ta thiết kế một bộ phát xung clock từ bên truyền, và nhận xung clock từ bên nhận. Các bit data có thể được đẩy đi theo sườn lên, sườn xuống, hoặc cả 2 sườn của xung clock.

 ➤ Đó chính là ý tưởng của Truyền thông nối tiếp đồng bộ - Synchronous Serial Communication, tức là bên truyền và nhận sẽ đồng bộ dữ liệu thông qua xung clock. Điển hình của giao thức này chuẩn SPI (Serial Peripheral Interface)I2C (Inter-Integrated Circuit), DDR, ... mà mình sẽ đề cập ở bài viết sau.

    ➥ Dưới đây là hoạt động cơ bản của giao thức SPI, sẽ giống với hoạt động kể trên,

Communication Protocols - SPI
Chuẩn giao thức nối tiếp đồng bộ - SPI

    🔻 Truyền thông nối tiếp bất đồng bộ - Asynchronous Serial Communication

    Phương án 2 là quy định sẵn xem truyền một bit hết bao lâu, hai bên sẽ cùng căn đúng từng đó thời gian để truyền nhận. Đánh dấu lần bắt đầu truyền bit đầu tiên, và lần kết thúc.

    Mục tiêu của phương án này là tránh việc phải có thêm dây clock, và để tín hiệu có thể truyền được xa hơn (Vì clock tần số cao truyền đi trên đường dây sẽ dễ bị nhiễu và gây sai lệch dữ liệu). Chính vì vậy, để đồng bộ hóa việc truyền nhận dữ liệu, hai bên truyền và nhận cần phải thống nhất 2 yếu tố sau, và được gọi là Truyền thông nối tiếp bất đồng bộ - Asynchronous Serial Communication.

  1. Mỗi bên có một nguồn clock riêng, và tốc độ truyền của hai bên cần giống nhau. Yếu tố này được cụ thể hóa với khái niệm Baudrate (đơn vị là bit per second).
  2. Bên truyền nhận cần đóng gói data để truyền nhận, tức là cần có tín báo hiệu việc bắt đầu, và kết thúc để đồng bộ dữ liệu. Mỗi gói data này được cụ thể hóa với khái niệm Transaction Frame (Khung truyền).

 ➤ Điển hình của truyền thông nối tiếp bất đồng bộ là các giao thức như UART, CAN, Ethernet, USB, ... đều là những giao thức với khả năng truyền tin với khoảng cách xa hơn so với SPI hay I2C kể trên.

    ➥ Dưới đây là ví dụ về cách truyền nhận dữ liệu của giao thức UART,

Communication Protocols - UART
Giao thức UART

    👉 Kết luận

    Trên đây bàn về Communication Protocols - Tức chúng là những quy chuẩn về mặt phần mềm, chỉ cần 2 bên thống nhất với nhau về mặt giao thức thì hoàn toàn có thể truyền nhận dữ liệu được. Một ý nghĩa khác là chúng ta hoàn toàn có thể triển khai các giao thức kể trên bằng phần mềm (sử dụng các bộ GPIO, Timer để xuất đúng dạng tín hiệu là được).

    Tuy nhiên, các vi điều khiển đã hỗ trợ các peripheral cho từng giao thức này với một số lượng nhất định (ví dụ STM32F1 hỗ trợ 2 bộ I2C, 3 bộ USART, 2 bộ SPI, 1 bộ CAN, 1 bộ USB 2.0), để người lập trình chỉ việc cấu hình thanh ghi và sử dụng.

    Việc hiểu về Protocols giúp bạn làm việc tốt hơn với giao thức, dễ dàng triển khai và tìm lỗi khi phát triển phần mềm nhúng, và nếu có nhu cầu sử dụng thêm hoặc linh hoạt trong việc giao tiếp, thì bạn có thể áp dụng các kiến thức về Protocols để tạo ra các giao tiếp trên bằng phần mềm.

>>>= Follow ngay =<<<

Để nhận được những bài học miễn phí mới nhất nhé 😊

Chúc các bạn học tập tốt 😊

        

Đăng nhận xét

0 Nhận xét