+2

Giao tiếp I2C - Một vài khái niệm cơ bản

Đầu xuân năm mới xin chúc cộng đồng ngày càng phát triển với nhiều nội dung chất lượng. Chúc anh, em trên diễn đàn nhiều sức khỏe và nhiều niềm vui trong cuộc sống. Trong bài viết này mình xin giới thiệu về một giao thức truyền thông được xử dụng phổ biến trong các hệ thống nhúng, đó là giao thức I2C.

Hãy bắt đầu với một vài thuật ngữ.

  • Transmitter - Thiết bị gởi dữ liệu đến bus. Một transmitter có thể là thiết bị chủ động gởi dữ liệu (a master-transmitter) hoặc là thiết bị gởi dữ liệu phản hồi yêu cầu từ một thiết bị khác (a slave-transmitter).
  • Receiver - Thiết bị nhận dữ liệu từ bus.
  • Master - Thiết bị khởi tạo quá trình truyền nhận dữ liệu, tạo clock signal, và kết thúc quá trình truyền nhận dữ liệu. Một master có thể là một transmitter hoặc một receiver.
  • Slave - Thiết bị được truy cập bởi master. Một slave có thể là một transmitter hoặc receiver.
  • Multi-master - Là khả năng nhiều master cùng hiện diện trên bus tại cùng một thời điểm mà không gây ra chồng lấn hoặc mất mát dữ liệu.
  • Arbitration - Là cơ chế cho chỉ cho phép một master kiểm soát bus tại một thời điểm
  • SDA - Data signal line (serial data)
  • SCL - Clock signal line (serial clock)

1. I2CI^2C là gì?

I2C (viết tắt của từ Inter-Integrated Circuit) là một giao thức thức truyền thông nối tiếp (serial communication protocol) được sử dụng rộng rãi trong trong các hệ thống nhúng. Giao thức này được phát triển bởi Philips Semiconductor (tiền thân của NXP Semiconductors ngày nay) vào năm 1982. image.png

Một số tính chất đặc trưng của I2CI^2C là:

  • Chỉ yêu cầu 2 bus lines: Một đường truyền dữ liệu nối tiếp (SDA) và một đường xung nhịp nối tiếp (SCL).
  • Cho phép nhiều master và nhiều slave trên cùng một đường truyền.
  • Mỗi slave được định danh bởi một địa chỉ đơn nhất.

Một yếu tố khác không thể không nhắc đến khi nói đến các giao thức truyền thông đó là tốc độ truyền, nhận dữ liệu. Đối với I2CI^2C, dựa trên các chế độ khác nhau mà tốc độ truyền nhận dữ liệu có thể từ vài trăm kilo-bits/s cho đến vài mega-bits/s.

2. Cách I2CI^2C hoạt động

Khi một thiết bị muốn giao tiếp với thiết bị khác trên đường truyền, quá trình thực hiện thường diễn ra như sau:

  1. I2CI^2C bus phải ở trạng thái "free", tức là cả SDA và SCL đều ở trạng thái "High".
  2. Tạo "START signal" để sử dụng bus. Tất cả các thiết bị còn lại sẽ "LISTEN" dữ liệu trên bus để xác nhận xem mình có phải là đối tượng được truy cập hay không.
  3. Cung cấp xung nhịp CLOCK trên đường SCL. Xung CLOCK này sẽ được sử dụng chung cho tất cả các thiết bị còn lại trên bus. Dữ liệu trên đường SDA được "chốt" khi clock wire SCL chuyển trạng thái từ low --> high.
  4. Gởi đi địa chỉ của thiết bị cần truy cập lên bus.
  5. Gởi đến bus bit chỉ định việc SEND or RECEIVE dữ liệu từ thiết bị được truy cập.
  6. Yêu cầu ACK bit từ thiết bị được truy cập để xác nhận thiết bị sẵn sàng cho việc giao tiếp.
  7. Sau khi nhận được ACK, bắt đầu trao đổi dữ liệu.
  8. Sau mỗi 8-bit data được trao đổi, transmitter yêu cầu ACK bit từ receiver để xác nhận việc truyền nhận dữ liệu OK.
  9. Sau khi hoàn tất việc trao đổi dữ liệu, free the bus và tạo "STOP signal" để hoàn tất quá trình.

Hình bên dưới đây mô tả một giản đồ xung của một giao tiếp I2CI^2C cơ bản image.png

Giải thích hoạt động một vài cơ chế của quá trình giao tiếp:

Start signal: Để tạo start signal để bắt đầu quá trình giao tiếp, master kéo SDA xuống trạng thái low, sau đó tiếp tục kéo SCL xuống trạng thái low.

Stop signal: Sau khi hoàn thành quá trình giao tiếp, SCL được kéo lên trạng thái high, sau đó tiếp tục kéo SDA lên trạng thái high.

ACK bit: Sau mỗi 1 byte giao tiếp, một bit thứ 9 được thêm vào để xác nhận quá trình giao tiếp thành công, bit này được gọi là ACK bit. Bit này được điều khiển bởi target device trong quá trình giao tiếp (Master gởi data đến Slave thì target device là Slave và ngược lại). Trạng thái ACK bit ở mức low xác nhận quá trình giao tiếp thành công, ngược lại nếu ACK bit ở mức high, quá trình giao tiếp thất bại.

Khi bạn cần truyền nhận dữ liệu giữa các thiết bị trong một hệ thống nhúng, I2CI^2C là một giao thức hữu hiệu và đáng tin cậy. Hy vọng thông qua bài viết này người đọc có thêm được một vài thông tin cũng như biết được một vài khái niệm cơ bản về giao thức I2CI^2C.

3. Tài liệu tham khảo

[1] “I2C,” Wikipedia, https://en.wikipedia.org/wiki/I²C (accessed Feb. 22, 2024).

[2] AN10216-01 I2C Manual, https://www.nxp.com/docs/en/application-note/AN10216.pdf (accessed Feb. 22, 2024).

[3] Ti, https://www.ti.com/lit/an/sbaa565/sbaa565.pdf?ts=1707990744633&ref_url=https%3A%2F%2Fwww.google.com%2F (accessed Feb. 22, 2024).


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí