
Ngày càng có nhiều cảm biến được kết nối với một thiết bị điều khiển (ví dụ như vi điều khiển). Nhưng mỗi loại cảm biến lại sử dụng một giao tiếp khác nhau như I2C, SPI, UART, làm cho việc quản lý chúng trở nên phức tạp.
Vì vậy, để đơn giản hóa việc giao tiếp với cảm biến và nâng cao hiệu suất, MIPI Alliance đã phát triển một giao tiếp mới gọi là I3C. Nó có nhiều cải tiến so với I2C, như tốc độ cao hơn, tiêu thụ ít điện hơn, nhưng vẫn có thể tương thích với các thiết bị dùng I2C cũ.
Trong bài viết này hãy cùng chipstack.vn tìm hiểu về giao thức I3c nhé!
I3C là gì?
I3C được tạo ra để nâng cấp các vấn đề còn tồn đọng của I2C, nhưng vẫn có thể hoạt động với các thiết bị cũ dùng I2C.
Chuẩn I3C cho phép nhiều cảm biến kết nối với một bộ xử lý (vi điều khiển) theo kiểu Multi-Drop (nhiều thiết bị có thể dùng chung một đường truyền).
Xem thêm: Giao thức I2C
I3C bus

I3C là một giao tiếp hai dây, giống như I2C. Nó bao gồm:
- SDA (Serial Data Line) – Dây truyền dữ liệu nối tiếp.
- SCL (Serial Clock Line) – Dây xung nhịp nối tiếp.
I3C có thể hoạt động trên một bus thuần I3C hoặc bus hỗn hợp (khi có thiết bị I2C cũ kết nối, nhưng không sử dụng tính năng clock stretching).
Trên bus I3C có 4 loại thiết bị chính:
- I3C main controller – Bộ điều khiển chính, chịu trách nhiệm quản lý bus.
- I3C secondary controller – Bộ điều khiển phụ, có thể hỗ trợ điều khiển bus khi cần.
- I3C targets – Các thiết bị ngoại vi hỗ trợ I3C (cảm biến, vi mạch, v.v.).
- Legacy I2C targets – Các thiết bị I2C cũ có thể kết nối với I3C nhưng có hạn chế nhất định.
Bus format

1. Bit start:
Mọi quy trình truyền dữ liệu trên bus đều bắt đầu bằng bit Start (S) do controller gửi ra.
2. Address:
Sau tín hiệu START, controller gửi một byte đặc biệt có giá trị 0x7E để báo hiệu rằng đây là truyền dữ liệu theo chuẩn I3C.
Tiếp theo controller gửi địa chỉ của thiết bị cần giao tiếp:
- Nếu giao tiếp với thiết bị I3C, controller sẽ gửi địa chỉ I3C target address.
- Nếu giao tiếp với thiết bị I2C cũ, controller sẽ gửi địa chỉ I2C target address.
- Lệnh Broadcast (CCC – Common Command Code) nếu nó muốn gửi một lệnh chung đến tất cả các thiết bị trên bus.
3. Bit Read và Write:
Sau khi địa chỉ được gửi đi, Controller sẽ xác định hướng truyền:
- Ghi dữ liệu (Write – W)
- Đọc dữ liệu (Read – Rn)
Sau đó, dữ liệu được truyền kèm theo bit xác nhận (ACK/NACK) để đảm bảo rằng dữ liệu đã được nhận đúng.
4. Bit T – Kiểm tra lỗi và điều khiển luồng dữ liệu
Trong chế độ ghi (Write – SDR Mode):
- Bit T đóng vai trò là bit chẵn lẻ (parity bit) để kiểm tra lỗi.
- Tính toán: Bit T là XOR của 8 bit dữ liệu cộng với 1.
- Ví dụ:
- 0x0F (00001111) → XOR(00001111, 1) = 1 (Bit T = 1)
- 0xF2 (11110010) → XOR(11110010, 1) = 0 (Bit T = 0)
- Ví dụ:
Trong chế độ đọc (Read – SDR Mode):
Bit T được sử dụng như bit báo hiệu cuối dữ liệu (End-of-Data bit):
- 0: Kết thúc truyền dữ liệu.
- 1: Tiếp tục truyền dữ liệu.
5. Kết thúc bằng bit STOP (P)
Khi quá trình truyền kết thúc, Controller sẽ gửi tín hiệu STOP (P) để giải phóng bus.
Xem thêm: Tổng quan về giao thức SPI
I3C và I2C

1. Giao tiếp & Tốc độ truyền dữ liệu
- I3C: Tốc độ tối đa lên đến 12.5 MHz (chế độ SDR).
- I2C: Giới hạn ở 1 MHz (chế độ Fast Mode Plus).
⮕ I3C nhanh hơn đáng kể, giúp truyền dữ liệu hiệu quả hơn.
2. Cách truyền tín hiệu (Signaling)

Trong I3C, cơ chế truyền tín hiệu tự động chuyển đổi giữa open-drain và push-pull, giúp cải thiện tốc độ và giảm tiêu thụ điện năng.
- Trong pha open-drain: Pull-up được bật để duy trì mức logic cao khi không có thiết bị nào kéo xuống.
- Trong pha push-pull: Pull-up được tắt, chỉ sử dụng tín hiệu điều khiển từ phần cứng.
3. Địa chỉ
- I2C: Sử dụng địa chỉ 7-bit hoặc 10-bit tĩnh.
- I3C: Hỗ trợ địa chỉ động (dynamic addressing), giúp các thiết bị tự động lấy địa chỉ mà không cần cấu hình cố định.
⮕ I3C linh hoạt hơn trong việc quản lý thiết bị trên bus.
4. Tính năng mở rộng
Tính năng | I3C | I2C |
In-band Interrupt (Thiết bị gửi tín hiệu ngắt qua bus) | ✅ | ❌ |
Hot-join (Thiết bị mới có thể tham gia bus mà không reset hệ thống) | ✅ | ❌ |
Multicontrollers (Hỗ trợ nhiều Controller trên cùng bus) | ✅ | ✅ |
5. Tiêu thụ điện năng
- I3C không cần điện trở pull-up trên bus như I2C.
- Cơ chế push-pull giúp giảm tiêu thụ điện năng đáng kể.
⮕ I3C tiết kiệm năng lượng hơn, phù hợp với các thiết bị IoT và di động.
Xem thêm: Giao thức UART hoạt động như thế nào?
Vai trò của Master và Slave trong I3C
1. Cấu trúc tổng quan của bus I3C
Một bus I3C luôn có một Master và một hoặc nhiều Slave.
Các thiết bị có thể được thiết kế để hoạt động chỉ như Master, chỉ như Slave, hoặc có thể đóng cả hai vai trò.
2. Master trong I3C
Main Master: Là thiết bị Master đầu tiên trên bus khi khởi tạo.
Current Master: Là thiết bị Master hiện tại đang điều khiển bus.
Chuyển quyền Master: Sau khi khởi tạo, quyền điều khiển bus có thể được chuyển từ Current Master sang thiết bị khác có khả năng làm Master bằng cách sử dụng lệnh CCCs (Common Command Codes).
⮕ Điều quan trọng: Chỉ có một thiết bị đóng vai trò Master tại một thời điểm.
3. Slave trong I3C
Tất cả các thiết bị khác trên bus (bao gồm cả thiết bị I2C cũ) ban đầu được khởi tạo ở chế độ Slave.
Một Slave có thể được thiết kế để sau này trở thành Master nếu có hỗ trợ tính năng này.
Địa chỉ động (Dynamic address) trong I3C là gì?
Trong I²C, mỗi thiết bị có địa chỉ tĩnh (địa chỉ cố định) (7-bit hoặc 10-bit), nhưng có giới hạn số lượng địa chỉ (chỉ khoảng 127 thiết bị tối đa) và các địa chỉ này không thay đổi được.
Nếu có 2 thiết bị cùng địa chỉ, bus sẽ bị lỗi do xung đột.
I3C khắc phục điều này bằng cách cấp địa chỉ động, đảm bảo mỗi thiết bị trên bus đều có địa chỉ duy nhất.
Địa chỉ động là địa chỉ mà các Slave được Master cấp và có thể thay đổi được.
Quá trình gán địa chỉ động diễn ra như thế nào?
- Master gửi lệnh SETAASA (0x29):
- Lệnh này đặt tất cả thiết bị về trạng thái chỉ sử dụng địa chỉ tĩnh.
- Điều này đảm bảo chỉ các thiết bị I3C mới nhận địa chỉ động, còn thiết bị I2C vẫn giữ nguyên địa chỉ của chúng.
- Master gửi lệnh ENTDAA (0x07):
- Lệnh này bắt đầu quá trình gán địa chỉ động cho thiết bị I3C.
- Các thiết bị I3C lần lượt phản hồi và Master gán địa chỉ động cho từng thiết bị.
- Thiết bị nhận địa chỉ động và sử dụng địa chỉ này:
- Sau khi có địa chỉ động, thiết bị I3C sẽ dùng địa chỉ này để giao tiếp trên bus.
- Địa chỉ động có thể thay đổi hoặc bị reset nếu Master yêu cầu.
I3C CCC (Common Command Codes) – Lệnh điều khiển chung
CCCs (Common Command Codes) là tập hợp các lệnh đặc biệt mà Master có thể gửi đến một thiết bị cụ thể hoặc tất cả thiết bị trên bus I3C, có hai loại lệnh chính:


- Broadcast CCC (Lệnh tổng)
- Gửi đến tất cả thiết bị trên bus.
- Ví dụ:
- ENTDAA (0x07): Bắt đầu quá trình cấp phát địa chỉ động (DAA).
- RSTDAA (0x2A): Reset lại địa chỉ động của tất cả thiết bị.
- DISEC: Vô hiệu hóa CCC.
- Direct CCC (Lệnh trực tiếp)
- Gửi đến một thiết bị cụ thể, sử dụng địa chỉ động.
- Ví dụ:
- GETPID: Yêu cầu thiết bị gửi ID duy nhất của nó.
- GETBCR: Yêu cầu thiết bị gửi Bus Characteristic Register (BCR).


Xem thêm: Timer là gì? Ứng dụng của timer trong hệ thống nhúng
Các chế độ trong I3C
1. Single Data Rate (SDR)
SDR (Single Data Rate) Mode là chế độ mặc định của bus I3C.
Mục đích chính: Dùng để truyền dữ liệu riêng tư giữa Current Master và các Slave.
Ngoài ra, SDR Mode còn được dùng để:
- Chuyển sang các chế độ khác hoặc trạng thái khác.
- Gửi các lệnh Common Commands (CCCs).
- Hỗ trợ In-Band Interrupts (các Slave có thể gửi tín hiệu ngắt ngay trên bus).
- Chuyển đổi từ I2C sang I3C bằng cách cấp địa chỉ động (Dynamic Address) cho các thiết bị I2C cũ.
2. High Data Rate (HDR)
HDR (High Data Rate) là chế độ truyền dữ liệu tốc độ cao trong I3C, giúp tăng tốc so với chế độ SDR (Single Data Rate). Nó sử dụng các kỹ thuật như DDR (Double Data Rate) và mã hóa đặc biệt để truyền dữ liệu nhanh hơn. HDR có nhiều chế độ khác nhau, phù hợp với các mức yêu cầu tốc độ khác nhau.
In-Band Interrupt (IBI) trong I3C
1. IBI là gì?
In-Band Interrupt (IBI) là một cơ chế trong giao thức I3C, cho phép một thiết bị Target gửi tín hiệu ngắt (interrupt) đến Controller mà không cần một đường tín hiệu riêng (external interrupt line).
2. Quá trình IBI diễn ra như thế nào?
- Khởi tạo yêu cầu ngắt:
- Nếu bus đang rảnh (idle), Target có thể kéo SDA xuống LOW khi SCL đang HIGH để báo hiệu yêu cầu IBI.
- Controller sẽ nhận biết điều này và bắt đầu chu kỳ xung nhịp (clock cycle) để tiếp tục quá trình.
- Quá trình arbitration (tranh chấp địa chỉ):
- Nếu có nhiều Target cùng yêu cầu IBI, chúng sẽ tranh chấp quyền gửi dữ liệu bằng cách gửi địa chỉ của mình theo cơ chế open-drain.
- Thiết bị nào có địa chỉ thấp hơn (ưu tiên cao hơn) sẽ thắng và được gửi IBI trước.

- Truyền dữ liệu ngắt (IBI payload):
- Sau khi được ACK từ Controller, Target có thể gửi một byte dữ liệu bắt buộc (Mandatory Data Byte) để chỉ định loại ngắt.
- Nếu gửi tín hiệu muốn gửi tiếp, Target có thể gửi thêm dữ liệu tùy chọn (tối đa 4 byte).
- Kết thúc giao tiếp:
- Sau khi gửi xong dữ liệu, Controller có thể kết thúc bằng STOP hoặc Repeated START để tiếp tục các giao tiếp khác.
Xem thêm: Ngắt là gì? Tầm quan trọng của ngắt trong hệ thống nhúng
Hỗ trợ thiết bị I2C Legacy trên bus I3C
I3C được thiết kế để hỗ trợ các thiết bị I2C cũ (Legacy I2C) trên cùng một bus, tuy nhiên có một số hạn chế nhất định.
1. Những điểm cần lưu ý khi dùng I2C trên I3C
Tốc độ hoạt động phụ thuộc vào thiết bị I2C
- Nếu thiết bị I2C có bộ lọc xung nhiễu (spike filter), I3C có thể hoạt động với tốc độ tối đa.
- Nếu không có bộ lọc xung nhiễu, tốc độ bus phải giảm xuống tương ứng với tốc độ thấp nhất của thiết bị I2C.
Không hỗ trợ địa chỉ 10-bit
- Chỉ hỗ trợ địa chỉ 7-bit của I2C, không dùng được địa chỉ 10-bit mở rộng.
Không hỗ trợ “Clock Stretching”
- Các thiết bị I2C thường có thể kéo xung SCL xuống để trì hoãn giao tiếp (Clock Stretching), nhưng I3C không cho phép điều này.
- Điều này có thể gây vấn đề nếu thiết bị I2C cần thêm thời gian xử lý dữ liệu.
2. Frame format
Hình dưới đây minh họa hai kiểu truyền dữ liệu phổ biến khi sử dụng thiết bị I2C trên bus I3C:

Đọc dữ liệu từ thiết bị I2C
- Gửi địa chỉ thanh ghi cần đọc:
- Bộ điều khiển (Master) gửi tín hiệu Bắt đầu (S – START), sau đó gửi địa chỉ thiết bị I²C với bit ghi (W = 0).
- Thiết bị nhận (Slave) xác nhận bằng tín hiệu ACK, tiếp theo là gửi địa chỉ thanh ghi cần đọc.
- Thiết bị nhận tiếp tục phản hồi ACK, sau đó bộ điều khiển gửi tín hiệu Khởi động lại (Sr – repeated START).
- Nhận dữ liệu từ thanh ghi:
- Bộ điều khiển gửi lại địa chỉ thiết bị I²C nhưng lần này với bit đọc (R = 1), thiết bị nhận phản hồi ACK.
- Thiết bị bắt đầu gửi dữ liệu (Data 1, Data 2, …, Data N).
- Sau mỗi byte dữ liệu, bộ điều khiển gửi ACK để xác nhận tiếp tục nhận dữ liệu.
- Khi nhận byte cuối cùng, bộ điều khiển gửi NACK (không xác nhận) để báo hiệu kết thúc.
- Cuối cùng, bộ điều khiển gửi tín hiệu Dừng (P – STOP).
Ghi dữ liệu vào thiết bị I2C
- Gửi địa chỉ thanh ghi cần ghi:
- Bộ điều khiển gửi tín hiệu Bắt đầu (S – START), sau đó gửi địa chỉ thiết bị I²C với bit ghi (W = 0).
- Thiết bị nhận phản hồi ACK, tiếp theo là gửi địa chỉ thanh ghi cần ghi.
- Thiết bị nhận phản hồi ACK.
- Gửi dữ liệu cần ghi vào thanh ghi:
- Bộ điều khiển gửi dữ liệu (Data 1, Data 2, …, Data N).
- Sau mỗi byte dữ liệu, thiết bị nhận gửi ACK.
- Sau byte cuối cùng, thiết bị nhận gửi NACK để báo hiệu kết thúc.
- Bộ điều khiển gửi tín hiệu Dừng (P – STOP).
I3C là một bước tiến vượt bậc so với I2C với tốc độ truyền nhanh hơn, tiêu thụ năng lượng thấp hơn và tích hợp nhiều tính năng hiện đại như địa chỉ động, in-band interrupt và hot-join, giúp tối ưu hóa giao tiếp giữa vi điều khiển và các cảm biến, đồng thời vẫn giữ được khả năng tương thích với các thiết bị I2C cũ, mở ra hướng phát triển mới cho các ứng dụng nhúng và IoT.