Thứ Tư, Tháng Mười 27, 2021
Trang chủ TIN TỨC Tìm hiểu Giao thức I2C

Tìm hiểu Giao thức I2C

Có bạn nào thắc mắc làm sao giữa các thiết bị điện tử chúng có thể giao tiếp trao đổi data qua lại lẫn nhau không?

Tất cả là nhờ khái niệm “giao thức” (Protocols). Với tốc độ phát triển công nghệ hiện nay, nào là Bluetooth, Wifi, 4G, 5G, … phải nói có rất rất là nhiều các chuẩn giao thức khác nhau được con người phát minh.

Mỗi chuẩn được thiết kế có mục đích sử dụng riêng, có những điểm mạnh, cũng như có những điểm hạn chế.

Bài này mình sẽ tập trung vào 1 chuẩn giao thức rất hay được sử dụng trong lập trình Embedded, hay lập trình Vi điều khiển.

Trước khi bắt đầu, mình sẽ nói kỹ hơn khái niệm Bus (ko phải xe buýt 🚌 đâu nha) …

Bus là gì?

_ Bus ở đây là “đường truyền”, ở hình thức trừu tượng nó như là 1 ĐƯỜNG THẲNG ko có điểm bắt đầu và kết thúc, đừng nhầm với khái niệm đoạn thẳng nha mấy bác toán học ^^!

_ Hiểu đơn giản là tất cả mọi điểm trên đường truyền đó đều mang một mức Logic như nhau, trong điện tử chỉ có HIGH (1) hoặc LOW (0) thôi.

Điều này nghĩa là gì?
_ Nghĩa là tất cả các thiết bị kết nối vào đường truyền đó sẽ cùng nhận được một mức Logic ở tại một thời điểm.
_ Đương nhiên các thiết bị này sẽ tự động điều chỉnh chế độ Input (để Read Data) hoặc Output (để Write Data).

I2C là gì?

_ I2C viết tắt của The Inter-Integrated Circuit, ban đầu được phát triển bởi Phillips Corporation (nay là NXP Semiconductors).

1. Về tính năng

_ Nó là sự kết hợp các tính năng tốt nhất của giao thức SPIUART, với I2C

  • Bạn có thể kết nối giữa 1 Master với 1 Slave (như UART).
  • Hay kết nối nhiều Slave với 1 Master duy nhất (như SPI).
  • Thậm chí giữa nhiều Master và nhiều Slave với nhau.
SINGLE MASTER WITH SINGLE SLAVE (circuitbasics.com)
SINGLE MASTER WITH MULTIPLE SLAVES (circuitbasics.com)
MULTIPLE MASTERS WITH MULTIPLE SLAVES (circuitbasics.com)

2. Về thiết kế

_ I2C chỉ cần 2 dây để giao tiếp là Bus SDABus SCL.
_ Với cách thức giao tiếp là “Đồng bộ Nối tiếp” (Synchronous Serial Communication).
_ Và tuân theo hệ thống phân cấp Master/Slave, trong đó:

    • Master: là thiết bị điều khiển Bus.
      → Nó có thể chọn Slave để giao tiếp, và quyết định việc gửi data đến Slave hoặc ngược lại là nhận data từ Slave.
    • Slave: là thiết bị chỉ phản hồi khi Master yêu cầu.
      → Mỗi Slave sẽ có 1 ID duy nhất, giúp Master biết cần giao tiếp với Slave nào thông qua ID. Do đó, bắt buộc phải tránh trùng lặp ID giữa các Slave trên 1 Bus.

! Master là thiết bị bắt đầu quá trình giao tiếp, Slave không bao giờ bắt đầu quá trình này.

Generalized I2C Connection Diagram (analog.com)

    • Serial Data (SDA): là Bus mang Data.
      → Để gửi/nhận data giữa Master và Slave.
      → Những data này được truyền đi từng bit một “nối tiếp” trên Bus SDA.
    • Serial Clock (SCL): là Bus phát tín hiệu xung Clock.
      → Xung này được tạo ra bởi Master và chia sẻ cho các Slave khác.
      → Giúp “đồng bộ hóa” việc truyền data giữa các thiết bị trên Bus SDA.

3. Về cấu tạo

_ Các thiết bị có hỗ trợ tính năng I2C, để sử dụng ta chỉ cần kết nối các pin đó đến đúng các Bus thôi.

Master(n) Slave(n)
SDA SDA
SCL SCL

_ Các pin này được thiết kế dạng “Open Drain” hoặc “Open Collector”.

Open Drain vs Open Collector (microcontrollertips.com)

_ Khi hoạt động pin sẽ kéo Bus xuống mức LOW. Ngược lại, khi không hoạt động thì Bus sẽ tự động trở về mức HIGH.
_ Để giao tiếp I2C ổn định, ta cần dùng “Điện trở kéo lên” (Pull Up Resistors) để phân áp giúp tạo mức Logic rõ ràng trên Bus, tránh rơi vào trạng thái “trôi nổi”.

! Quá trình truyền data I2C là sự “Pulling LOW” và “Releasing HIGH”.

4. Về cách thức hoạt động

_ Với I2C, data được đặt trong các “Tin nhắn” (Message) để chuyển đi.

Nguồn (circuitbasics.com)

_ Mỗi “Tin nhắn” chứa 1 “Khung địa chỉ” (Address Frame) của Slave.
_ Và có 1 hoặc nhiều “Khung data” (Data Frame), cũng là nơi chứa data.
_ Nó cũng bao gồm các Condition và Bit sau:

    • 1 Điều kiện bắt đầu (Start Condition).
    • 1 Điều kiện kết thúc (Stop Condition).
    • 1 bit Read/Write.
    • nhiều bit ACK/NACK … cụ thể là nhiêu?

_ Phần dưới đây mình sẽ giải thích chi tiết hơn từng phần. À trước khi bắt đầu, thì đây là mấu chốt cơ bản để hiểu I2C.

Những data (tức các bit) được xem là hợp lệ cho Address FrameData Frame.
Khi SCL đang mức HIGH thì SDA phải ổn định ở mức Logic 0 hoặc 1.
khi SCL đang mức LOW thì SDA mới được phép thay đổi mức Logic.

⇒ Có thể thấy ta đang xét giá trị SDA thay đổi khi SCL ở mức LOW. Đây là lúc I2C đang hoạt động.

Nhưng có một số ngoại lệ đó là: Repeated Start, Start Condition, Stop Condition.

⇒ Lần này ta xét giá trị SDA được phép thay đổi khi SCL ở mức HIGH. Đây cũng là lúc I2C bắt đầu, tiếp tục hoặc dừng hoạt động.

Start/Stop Condition và Repeated Start ⇔ cả 3 phải được điều khiển bởi Master.

_ Như tên gọi, nó cho thấy một “Điều kiện bắt đầu” luôn xảy ra khi bắt đầu truyền data hay “Điều kiện dừng” xảy ra khi kết thúc quá trình truyền data.

🤔 Vậy còn Repeated Start là gì?
⇒ Nó cũng là một “Điều kiện bắt đầu”, nhưng có thể được lặp lại trong suốt quá trình truyền mà không cần phải dùng tới “Điều kiện dừng”.

Nguồn (analog.com)

🤔 Mà Repeated Start khi nào được sử dụng?
⇒ Khi ta cần truyền liên tục nhiều Message, nó được dùng làm điểm nối giữa các “Tin nhắn”.
⇒ Thay vì ta phải dùng “Điều kiện dừng” cho “Tin nhắn” cũ“Điều kiện bắt đầu” cho “Tin nhắn” mới.

🤔 Mà sao ta lại cần đổi Message, trong khi nó có thể chứa nhiều Data Frame?
⇒ Bạn có thắc mắc là “Tin nhắn” này sẽ được truyền từ đâu sang đâu chưa? Là từ Master → Slave hay ngược lại là từ Slave → Master.
⇒ Nhìn kỹ có thể thấy chính Bit Read/Write là nhân tố quyết định hướng truyền.
⇒ Cho nên ta cần đổi Message mỗi khi ta cần thay đổi hướng truyền.

Address Frame

🤔 Làm sao I2C có thể giao tiếp với nhiều thiết bị (Slave) mà chỉ cần 2 dây?
⇒ Như trên mình có nói mỗi Slave có 1 ID duy nhất để Master có thể chọn thiết bị nào sẽ được giao tiếp.

_ ID của Slave được gửi ở định dạng 1 Byte (8 bit), với Bit MSB được gửi đi trước và Bit LSB được gửi sau cùng, trong đó:

    • 7 bit: dành cho ID của Slave thuộc “Khung địa chỉ”.
    • 1 bit: cũng là Bit LSB dành cho Bit Read/Write.

Nguồn (totalphase.com)

⇒ Với ID 7 bit, theo lý thuyết nó có thể giao tiếp với 128 (27) thiết bị khác nhau, tuy nhiên thật tế họ dành ra 16 địa chỉ (Reserved Addresses) cho mục đích sử dụng riêng. Tức ta chỉ dùng được 112 thiết bị khác nhau trên cùng 1 Bus.

Nguồn (totalphase.com)

⇒ Để tăng số lượng thiết bị giao tiếp, họ mở rộng bằng ID 10 bit, được thiết kế để tương thích với ID 7 bit. Tương tự nó vẫn có 16 địa chỉ dành riêng, cho nên số thiết bị giao tiếp tối đa của I2C hiện tại là (210 – 16) = 1008 thiết bị.

Nguồn (totalphase.com)

Read/Write Bit

_ Khi Master gửi 7/10 bit ID kia, nếu Slave nào khớp ID nó sẽ bắt đầu lắng nghe Master đó, còn các Slave khác sẽ bỏ qua.
_ Cho nên bit đầu tiên Slave đọcBit Read/Write, trong đó nếu là …

    • Bit 0: mode Write ; Master → Slave.
    • Bit 1: mode Read ; Slave → Master.

Data Frame

_ Nếu nhìn kỹ lại cấu trúc Message, bạn sẽ thấy Data Frame cũng có định dạng1 Byte (8 bit). Nó cũng tương đồng với [ Address Frame + Bit Read/Write] mình có phân tích ở trên.
! Cả 2 đều gửi Bit MSB trước tiên và cuối cùng là Bit LSB.

Một vd giao tiếp I2C thực tế (howtomechatronics.com)

_ Đây cũng chính là phần có giá trị của Message, để đơn giản mình gọi chung là data. Mà theo sau mỗi data sẽ luôn có 1 bit ACK/NACK.
! Hãy chú ý đến màu sắc của databit ACK/NACK trong cấu trúc Message.

ACK/NACK Bit

_ Như mình nói trên sau mỗi data sẽ luôn có 1 bit này. Đây là bit được bên NHẬN gửi lại cho bên TRUYỀN, để phản hồi về kết quả truyền data, trong đó …

    • Bit 0: ACK (Acknowledge) ; nghĩa là gửi data thành công.
    • Bit 1: NACK (Not Acknowledge) ; nghĩa là không nhận được data.

! Lưu ý: bên NHẬN hay TRUYỀN đều có thể là Master/Slave.

Hình này minh họa cho việc truyền data qua lại giữa Master và Slave trên Bus I2C.

Hết rồi ^^

Việc nắm những mấu chốt trên rất có ích cho việc ta viết các chương trình hay Thư viện các thiết bị mà có giao tiếp I2C tối ưu hơn. Nhất là cho việc đọc Datasheet các thiết bị đó.

Các bạn có thể xem qua Bảng này, nó sẽ cho ta cái nhìn tổng quát cơ bản về I2C.

Nguồn (circuitbasics.com)

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments

Most Popular

Tìm hiểu CRC

🤔 Có bạn nào thắc mắc là các thiết bị điện tử ngoài việc chúng có thể giao tiếp trao đổi thông tin với...

Tìm hiểu Giao thức I2C

Có bạn nào thắc mắc làm sao giữa các thiết bị điện tử chúng có thể giao tiếp trao đổi data qua lại lẫn...

Tìm hiểu cách sử dụng các cảm biến Nhiệt độ & Độ ẩm DHT

Chắc nhiều bạn sinh viên cũng quá quen mấy con này rồi nhỉ. Nói không sai, DHT có thể xem như cảm biến quốc...

Tìm hiểu về Nhiệt độ biểu kiến cũng như Cách ta cảm nhận nhiệt độ

Có bạn nào từng thắc mắc rằng, tại sao đôi khi nhiệt độ ngoài trời không cao lắm, nhưng ta lại thấy nóng nực...

Recent Comments

0
Would love your thoughts, please comment.x
()
x