- vừa được xem lúc

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

0 0 5

Người đăng: Nguyen Thinh

Theo Viblo Asia

Đầ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ữ.

I2CI^2C Bus terminology

  • 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.

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.

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, I2C 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 của giao thức I2C.

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).

Bình luận

Bài viết tương tự

- vừa được xem lúc

Một số thủ thuật hay ho với Linux (1).

1. Ctrl + x + e. Giữ CTRL, nhấn phím x rồi nhấn phím e. Thao tác này sẽ mở ra editor mặc định (echo $EDITOR | $VISUAL để kiểm tra) chứa sẵn.

0 0 45

- vừa được xem lúc

How to deploy Amplication app to DigitalOcean

This article shows you the way to deploy an app generated by Amplication to DigitalOcean. Amplication provides the dockerfile to use containers for deployment, but this blog explains how to do it manu

0 0 53

- vừa được xem lúc

Có gì mới trong Laravel 9.0?

Laravel v9 là phiên bản LTS tiếp theo của Laravel và ra mắt vào tháng 2 năm 2022. Trong bài viết này, mình xin giới thiệu một vài tính năng mới trong Laravel trong Laravel 9.

0 0 78

- vừa được xem lúc

Xây dựng trang web tra cứu ảnh sử dụng phân cụm Spectral Clustering

1. Tổng quan tra cứu ảnh. 1.1.

0 0 45

- vừa được xem lúc

Scanning network 1 - quét mạng như một hacker

Chào mọi người mình là Tuntun. Một năm qua là một năm khá bận rộn nhỉ.

0 0 46

- vừa được xem lúc

Interpreter Design Pattern - Trợ thủ đắc lực của Developers

1. Giới thiệu. . Interpreter là một mẫu thiết kế thuộc nhóm hành vi (Behavioral Pattern).

0 0 43