
Bạn đã bao giờ thắc mắc làm thế nào laptop của bạn biết khi nào pin yếu, hoặc làm thế nào các linh kiện trong một hệ thống nhúng có thể giao tiếp mà không cần quá nhiều dây kết nối? Câu trả lời nằm ở SMBus – một giao thức truyền thông đơn giản nhưng mạnh mẽ, giúp các thiết bị trong hệ thống trao đổi thông tin một cách hiệu quả.
Nhiều người có thể nghĩ rằng I²C là đủ để xử lý mọi nhu cầu giao tiếp giữa các linh kiện, nhưng SMBus lại mang đến một số tính năng chuyên biệt, đặc biệt là trong quản lý hệ thống và năng lượng. Vậy SMBus hoạt động như thế nào, nó khác gì so với I²C, và tại sao nó lại đóng vai trò quan trọng trong các thiết bị điện tử hiện đại? Hãy cùng chipstack.vn khám phá trong bài viết này!
Xem thêm: Tổng quan về Inter-Integrated Circuit (I2C)
Tổng quan về SMBus
1. Cấu trúc cơ bản của SMBus
SMBus là một giao thức truyền thông hai dây, gồm:
• SMBCLK (Clock – xung nhịp).
• SMBDAT (Data – dữ liệu).

Giao thức này cho phép một Master (thiết bị điều khiển) có thể giao tiếp với một hoặc nhiều Slave (thiết bị bị điều khiển) trên cùng một bus
Xem thêm: Giao thức SDIO (Secure Digital Input Output) Là Gì?
2. Cách giao tiếp trong SMBus
Master là thiết bị chủ động khởi tạo giao tiếp, điều khiển quá trình truyền dữ liệu và cung cấp tín hiệu xung nhịp (Clock).
Slave là thiết bị phản hồi theo yêu cầu từ Master, có thể gửi hoặc nhận dữ liệu.
Thông thường, Master chỉ làm việc với một Slave tại một thời điểm, nhưng có một số ngoại lệ:
• Khi thiết lập bus ban đầu, Master có thể giao tiếp với nhiều Slave cùng lúc.
• Khi thực hiện ZONE WRITE, Master có thể gửi dữ liệu đến nhiều Slave đồng thời.
3. Quy tắc tranh chấp quyền điều khiển bus
Chỉ một thiết bị có thể làm Master tại một thời điểm.
Nếu có nhiều thiết bị cố gắng làm Master cùng lúc, SMBus sử dụng cơ chế tranh chấp (arbitration) để chọn ra một thiết bị duy nhất.
Cơ chế này dựa trên nguyên tắc wired-AND, nơi tất cả thiết bị đều kết nối với bus theo kiểu mở (open-drain hoặc open-collector).
4. Hai mức điện áp trong SMBus
SMBus có hai tiêu chuẩn điện áp khác nhau:
• Low Power (công suất thấp): Xuất hiện trong SMBus 1.0 và 1.1, dùng cho thiết bị tiêu thụ ít điện năng như Smart Battery.
• High Power (công suất cao): Xuất hiện trong SMBus 2.0, dùng cho card mở rộng PCI và thiết bị cần công suất cao hơn.
5. Cải tiến trong SMBus 3.0
SMBus 3.0 có một số nâng cấp đáng chú ý:
• Hỗ trợ tốc độ cao hơn: 400 kHz và 1 MHz.
• Thêm các giao thức đọc/ghi dữ liệu 32-bit và 64-bit.
• Giảm điện áp VDD từ 3V xuống 1.8V, phù hợp hơn với các hệ thống hiện đại.
6. SMBus hoạt động như thế nào?
Master cấp xung nhịp (Clock) trên đường SMBCLK và điều khiển quá trình truyền dữ liệu trên đường SMBDAT.
Slave chỉ phản hồi khi được Master yêu cầu.
Khi bus không có giao tiếp, cả hai đường SMBCLK và SMBDAT đều ở mức cao nhờ điện trở pull-up.
Khi gửi dữ liệu:
• Gửi 0: Thiết bị kéo đường dữ liệu xuống mức thấp.
• Gửi 1: Thiết bị nhả đường dữ liệu, để điện trở pull-up kéo lên mức cao.
7. Thiết kế mạch và chống ảnh hưởng khi mất nguồn

Kéo cao tín hiệu: Đường SMBus (SMBCLK và SMBDAT) có thể được kéo cao bằng hai cách:
• Dùng điện trở pull-up (cho tín hiệu lên cao theo đường cong hàm mũ).
• Dùng nguồn dòng (cho tín hiệu lên cao tuyến tính, giúp tốc độ nhanh hơn).
Khi điện dung bus cao:
• Nếu bus có điện dung lớn (do có nhiều thiết bị hoặc dây dài), tín hiệu lên cao sẽ chậm hơn, có thể không đạt chuẩn thời gian lên mức cao (rise time).
• Để khắc phục, cần mạch kéo cao khác (FET-controlled pull-up hay Adaptive pull-up circuit) có khả năng: Giới hạn dòng kéo xuống (pull-down sink current) để tránh tiêu thụ điện năng không cần thiết. Cung cấp đủ dòng trong quá trình chuyển từ mức thấp lên mức cao để đảm bảo tín hiệu đạt chuẩn tốc độ của SMBus.
Xem thêm: Tổng quan về CAN Flexible Data-rate (CAN FD)
Đặc tính của SMBus
1. Điện áp nguồn (VDD) của SMBus
SMBus hỗ trợ hai mức công suất:
• Công suất thấp (Low Power).
• Công suất cao (High Power).
Điện áp mà thiết bị có thể sử dụng nằm trong khoảng:
• Thấp nhất: 1.62V.
• Cao nhất: 5.5V.
• Thông thường: từ 1.8V đến 5.0V
Không yêu cầu tất cả thiết bị trên bus phải dùng cùng một mức điện áp.
Nếu có nhiều thiết bị với các mức điện áp khác nhau, điện trở pull-up phải được kéo lên mức điện áp cao nhất trên bus. Ví dụ: Nếu có thiết bị hoạt động ở 3.3V và thiết bị khác hoạt động ở 5V, thì các đường SMBus phải kéo lên 5V.

2. Tốc độ
SMBus hỗ trợ ba tốc độ truyền dữ liệu:
• 100 kHz (chuẩn SMBus gốc).
• 400 kHz (hỗ trợ tốc độ cao hơn).
• 1 MHz (cải thiện hiệu suất, gần với I²C Fast Mode Plus).
3. Thời gian timeout (tTIMEOUT,MIN và tTIMEOUT,MAX)

Nếu một thiết bị giữ xung clock (SMBCLK) ở mức thấp quá lâu, bus có thể bị treo.
SMBus có cơ chế timeout để phát hiện lỗi:
• Nếu một thiết bị phát hiện xung clock bị giữ ở mức thấp lâu hơn giá trị tTIMEOUT,MIN, nó bắt buộc phải thả clock ra để bus hoạt động lại.
• Sau khi phát hiện lỗi này, thiết bị đó phải reset giao tiếp và sẵn sàng nhận lệnh mới trong thời gian không quá tTIMEOUT,MAX.
4. tLOW:TEXT và tLOW:CEXT là gì?
tLOW:TEXT (Clock Extension của Target):
• Đây là tổng thời gian mà một thiết bị đích có thể giữ xung clock ở mức thấp trong suốt toàn bộ quá trình truyền dữ liệu (từ lúc START đến STOP).
• Nếu có nhiều thiết bị đích cùng kéo dài clock, tổng thời gian có thể vượt quá tLOW:TEXT, vì vậy giá trị này được đo khi chỉ có một thiết bị đích duy nhất đang hoạt động với controller.
tLOW:CEXT (Clock Extension của Controller):
• Đây là tổng thời gian mà controller có thể giữ clock ở mức thấp trong mỗi byte của dữ liệu (từ START đến ACK, ACK đến ACK, hoặc ACK đến STOP).
• Nếu có nhiều Controller cùng kéo dài clock, tổng thời gian có thể vượt quá tLOW:CEXT, nên giá trị này cũng được đo khi chỉ có một thiết bị đích đang hoạt động.

5. Clock Stretching và Vi phạm tLOW:TEXT
Một số thiết bị có thể giữ xung clock ở mức thấp lâu hơn bình thường (gọi là Clock Stretching) để xử lý dữ liệu.
Tuy nhiên, nếu thời gian giữ thấp vượt quá tLOW:TEXT, thiết bị đó sẽ không tuân thủ tiêu chuẩn SMBus.
Nếu một thiết bị vi phạm tLOW:TEXT hoặc tTIMEOUT,MIN, bộ điều khiển (Controller) có quyền kết thúc giao tiếp bằng cách gửi STOP condition.
6. SMBDAT bị giữ thấp quá lâu
Nếu một thiết bị bị lỗi và giữ SMBDAT ở mức thấp mãi mãi, Controller sẽ không thể gửi STOP.
Hiện tại, chưa có quy định chính xác về thời gian tối đa mà một thiết bị có thể giữ SMBDAT ở mức thấp sau khi SMBCLK lên cao.
Giải pháp tạm thời: Nếu sau khi SMBCLK lên cao mà SMBDAT vẫn ở mức thấp quá tTIMEOUT,MAX, thì controller nên:
• Giữ SMBCLK ở mức thấp ít nhất tTIMEOUT,MAX.
• Điều này giúp cố gắng reset lại SMBus và các thiết bị trên bus.
• Sau đó, controller có thể thử lại hoặc thông báo lỗi.
Giao thức SMBus
1. Cách SMBus truyền dữ liệu (Bit Transfers)
SMBus sử dụng mức điện áp cố định để biểu diễn bit 0 (ZERO) và bit 1 (ONE) trên đường dữ liệu SMBDAT.
Dữ liệu trên SMBDAT phải tuân theo quy tắc về tính hợp lệ và điều kiện START/STOP.
2. Tính hợp lệ của dữ liệu (Data Validity)
Dữ liệu trên SMBDAT phải ổn định khi SMBCLK ở mức cao.
Dữ liệu chỉ có thể thay đổi khi SMBCLK ở mức thấp.
Điều này đảm bảo dữ liệu không bị sai lệch trong quá trình truyền.

3. Điều kiện START và STOP trong SMBus

Khi SMBDAT chuyển từ cao xuống thấp trong khi SMBCLK đang ở mức cao, đây là tín hiệu bắt đầu (START). Sau START, bus được coi là bận (busy).
Khi SMBDAT chuyển từ thấp lên cao trong khi SMBCLK đang ở mức cao, đây là tín hiệu kết thúc (STOP). Sau một thời gian nhất định, bus sẽ trở về trạng thái nhàn rỗi (idle). Nếu cả SMBCLK và SMBDAT đều ở mức cao lâu hơn tHIGH:MAX, bus cũng sẽ trở về trạng thái idle.
Xem thêm: Fritzing Cơ Bản: Hướng dẫn chi tiết vẽ mạch trực quan
Trạng thái nhàn rỗi là khi không có thiết bị nào đang truyền dữ liệu trên bus, và cả hai đường tín hiệu SMBCLK (clock) và SMBDAT (data) đều ở mức cao trong một khoảng thời gian đủ dài.
Trạng thái nhàn rỗi: Giúp bộ điều khiển nhận biết khi nào bus sẵn sàng để bắt đầu một giao dịch mới. Tránh xung đột dữ liệu khi có nhiều thiết bị cùng truy cập SMBus. Nếu bus không trở về trạng thái nhàn rỗi đúng cách, có thể gây lỗi giao tiếp hoặc treo bus.
4. Truyền dữ liệu trên SMBus

Mỗi byte trên SMBus có 8 bit. Dữ liệu được truyền theo thứ tự bit quan trọng nhất (MSB) trước. Sau mỗi byte, luôn có một bit xác nhận (ACK/NACK) để xác nhận dữ liệu.
ACK (Acknowledge – Xác nhận thành công): Bộ điều khiển tạo xung clock để kiểm tra phản hồi của thiết bị nhận. Nếu thiết bị nhận kéo SMBDAT xuống thấp (LOW) trong chu kỳ xung clock, có nghĩa là nó đã nhận dữ liệu thành công và sẵn sàng nhận tiếp.

NACK (Not Acknowledge – Từ chối nhận dữ liệu): Nếu thiết bị nhận giữ SMBDAT ở mức cao (HIGH) trong chu kỳ xung clock, có nghĩa là nó từ chối nhận dữ liệu. Lúc này, bộ điều khiển sẽ hiểu rằng có vấn đề xảy ra và cần xử lý thích hợp.

5. Clock synchronization

Ở hình 12, SMBus Controller 1 kéo xuống mức thấp trước SMBus Controller 2. Với kiểu kết nối AND, SMBCLK sẽ được kéo xuống mức thấp ngay khi SMBus Controller 1 kéo xuống mức thấp mà không cần SMBus Controller 2 kéo xuống mức thấp.
Sau đó SMBus Controller 1 thả lên mức cao nhưng do SMBus Controller 2 vẫn giữ ở mức thấp nên SMBCLK vẫn ở mức thấp. Khi SMBus Controller 2 thả lên mức cao thì SMBCLK sẽ ở mức cao.
Quá trình này tương tự ở phần xung clock sau – khi SMBus Controller 2 kéo xuống mức thấp trước.
Xem thêm: Cách Tạo Linh Kiện Mới Trong Fritzing: Hướng Dẫn Từ A Đến Z
6. Arbitration
a. Tranh chấp bus xảy ra khi nào?
Trong SMBus, chỉ một bộ điều khiển (Controller) có thể truyền dữ liệu tại một thời điểm.
Một bộ điều khiển chỉ được phép bắt đầu truyền dữ liệu nếu bus đang ở trạng thái nhàn rỗi (idle).
Tuy nhiên, có thể xảy ra trường hợp nhiều bộ điều khiển cố gắng bắt đầu truyền dữ liệu cùng lúc.
Khi điều này xảy ra, hệ thống cần một cơ chế để quyết định bộ điều khiển nào sẽ được quyền tiếp tục truyền dữ liệu, gọi là Arbitration (tranh chấp bus).
b. SMBus giải quyết tranh chấp như thế nào?
SMBus sử dụng đường dữ liệu SMBDAT để quyết định bộ điều khiển nào thắng.
Nếu một bộ điều khiển gửi mức HIGH, còn bộ khác gửi mức LOW, thì bộ điều khiển gửi HIGH sẽ thua tranh chấp.
Điều này xảy ra vì bus SMBus sử dụng AND có dây (Wired-AND), có nghĩa là chỉ cần một thiết bị kéo xuống LOW, toàn bộ bus sẽ thấy LOW.
c. Các trường hợp đặc biệt
Nếu bộ điều khiển muốn gửi một START lặp lại (Repeated START) mà bộ điều khiển khác muốn gửi bit 0, thì bộ điều khiển gửi START sẽ thua.
Nếu bộ điều khiển muốn gửi START lặp lại, còn bộ điều khiển khác muốn gửi bit 1, thì bộ điều khiển gửi bit 1 sẽ thua.
Nếu cả hai bộ điều khiển đều gửi Repeated START cùng lúc, thì tranh chấp sẽ tiếp tục trên từng bit dữ liệu tiếp theo cho đến khi có một bộ điều khiển gửi bit 1 thì bộ điều khiển đó thua.
d. Điều gì xảy ra khi một bộ điều khiển thua tranh chấp?

Khi một bộ điều khiển thua tranh chấp (arbitration), nó không được phép tiếp tục truyền dữ liệu trên bus.
Nếu bộ điều khiển thua tranh chấp cũng là một thiết bị đích (target device), nó cần kiểm tra xem địa chỉ mà bộ điều khiển thắng đang gửi có phải là địa chỉ của nó không.
• Nếu đúng → Nó phải chuyển sang chế độ nhận dữ liệu từ bộ điều khiển thắng.
• Nếu không đúng → Nó sẽ ngừng truyền và chờ bus trở về trạng thái nhàn rỗi.
Nói cách khác, nếu bạn đang tranh giành quyền nói trên một chiếc micro (bus), nhưng bạn thua, bạn phải im lặng. Nhưng nếu ai đó gọi tên bạn (gửi địa chỉ của bạn trên bus), bạn vẫn phải trả lời họ.
Sau khi bộ điều khiển thắng tranh chấp hoàn tất việc truyền dữ liệu, bus sẽ trở về trạng thái nhàn rỗi (idle) nếu không có thiết bị nào tiếp tục giữ bus.
Lúc này, bộ điều khiển thua tranh chấp có thể làm gì?
• Nếu bus trở lại nhàn rỗi, bộ điều khiển thua tranh chấp có thể thử gửi lại dữ liệu của mình bằng cách phát ra một START condition mới và bắt đầu quá trình truyền lại từ đầu.
• Nếu bus vẫn bận (bộ điều khiển thắng vẫn đang truyền tiếp hoặc có một bộ điều khiển khác giành quyền ngay sau đó), bộ điều khiển thua phải tiếp tục chờ cho đến khi bus nhàn rỗi trở lại.
7. Clock stretching
a. Vì sao cần Clock stretching
Trong SMBus, nếu một thiết bị (bộ điều khiển hoặc thiết bị đích) cần thêm thời gian để xử lý dữ liệu, nó có thể kéo dài xung LOW của tín hiệu clock (SMBCLK) thay vì tuân theo nhịp clock thông thường.
Khi SMBCLK đang ở mức LOW, thiết bị có thể giữ nó ở mức LOW lâu hơn thay vì thả ra ngay lập tức. Thiết bị chậm có thể dùng cách này để kịp xử lý dữ liệu trước khi tiếp tục truyền. Bộ điều khiển phải chờ cho đến khi thiết bị nhả SMBCLK (cho phép nó lên HIGH) mới tiếp tục truyền dữ liệu.
Điều kiện:
• Thiết bị không được kéo dài quá giới hạn quy định trong SMBus (timeout tTIMEOUT).
• Phải đảm bảo bus vẫn hoạt động với tần số tối thiểu 10 kHz.
b. Kéo dài clock có thể xảy ra khi nào?
Trong quá trình truyền bit: Nếu thiết bị cần thêm thời gian, nó có thể giữ mức LOW trên SMBCLK trước khi cho phép nó chuyển sang HIGH.
Giữa các byte dữ liệu: Một thiết bị có thể giữ SMBCLK ở mức LOW sau khi nhận và ACK một byte để xử lý hoặc chuẩn bị dữ liệu.
c. Cả bộ điều khiển và thiết bị đích đều có thể kéo dài clock


Bộ điều khiển có thể kéo dài clock LOW để xử lý dữ liệu hoặc phục vụ một tác vụ thời gian thực.
Thiết bị đích có thể làm điều này để kiểm tra dữ liệu hoặc chuẩn bị phản hồi.
8. Tổng quan về truyền dữ liệu trên SMBus

Khi truyền dữ liệu trên SMBus, trình tự bắt đầu bằng điều kiện START (S) do bộ điều khiển tạo ra.
Bộ điều khiển sau đó gửi địa chỉ 7-bit của thiết bị đích lên bus.
Bit thứ 8 ngay sau địa chỉ này là bit R/W# để xác định hướng truyền:
• 0 (WRITE) → Bộ điều khiển sẽ ghi dữ liệu vào thiết bị đích.
• 1 (READ) → Bộ điều khiển sẽ đọc dữ liệu từ thiết bị đích.
Dữ liệu sẽ được truyền tiếp sau phần địa chỉ, và quá trình kết thúc bằng điều kiện STOP (P) do bộ điều khiển tạo ra.
Repeated START:
• Một số giao thức trong SMBus yêu cầu bộ điều khiển tạo START lần nữa (Repeated START) mà không cần dừng truyền (STOP).
• Điều này giúp duy trì kết nối mà không làm mất quyền điều khiển bus.
Data format
1. Gửi 1 byte từ bộ điều khiển

Một thiết bị SMBus đơn giản có thể nhận biết địa chỉ của chính nó trên bus. Sau khi nhận địa chỉ được gửi từ bộ điều khiển, thiết bị có thể nhận thêm 1 byte dữ liệu (Send Byte) từ bộ điều khiển. Byte này có thể là một mã lệnh (command code), với cách mã hóa tùy thuộc vào thiết bị.
2. Nhận 1 byte từ bộ điều khiển

Receive Byte giống với Send Byte, nhưng hướng truyền dữ liệu ngược lại. Dùng để đọc một byte dữ liệu từ thiết bị đích (target/slave) mà không cần gửi lệnh trước. Một thiết bị có thể hỗ trợ cả Send Byte và Receive Byte.
Bộ điều khiển có thể gửi:
• ACK (0) → Tiếp tục đọc dữ liệu.
• NACK (1) → Kết thúc quá trình đọc.
3. Gửi word từ bộ điều khiển

Byte đầu tiên luôn là mã lệnh (command code). Giao thức này dùng để ghi cấu hình hoặc thiết lập giá trị trên thiết bị đích.
Bộ điều khiển (controller) gửi địa chỉ thiết bị + bit ghi (write bit). Thiết bị nhận phản hồi bằng ACK (xác nhận). Bộ điều khiển gửi mã lệnh → thiết bị lại gửi ACK. Bộ điều khiển gửi dữ liệu cần ghi (1 byte hoặc 2 byte, byte thấp gửi trước). Thiết bị ACK từng byte nhận được. Cuối cùng, bộ điều khiển gửi STOP để kết thúc giao dịch.
4. Nhận word từ bộ điều khiển

Đọc dữ liệu phức tạp hơn ghi vì phải trải qua hai bước:
• Bộ điều khiển gửi mã lệnh (command) đến thiết bị để yêu cầu dữ liệu.
• Bộ điều khiển gửi tín hiệu đọc (repeated START) để nhận dữ liệu từ thiết bị.
Bộ điều khiển gửi địa chỉ thiết bị + bit ghi (write). Thiết bị phản hồi ACK. Bộ điều khiển gửi mã lệnh (command code) để chỉ định dữ liệu cần đọc. Thiết bị phản hồi ACK.
KHÔNG gửi STOP, thay vào đó gửi repeated START (bắt đầu chế độ đọc). Bộ điều khiển gửi lại địa chỉ thiết bị + bit đọc (read). Thiết bị phản hồi ACK và gửi dữ liệu (1 byte hoặc 2 byte). Bộ điều khiển gửi NACK để kết thúc việc đọc. Bộ điều khiển gửi STOP để kết thúc giao dịch.
Xem thêm: Giao thức 1-Wire là gì? Tất cả những điều bạn cần biết
5. Process Call
Process Call là một giao thức vừa ghi vừa đọc mà không cần một lệnh đọc riêng biệt, giúp giảm số lần truyền dữ liệu.

Gửi dữ liệu (giống Write Word):
• Bộ điều khiển gửi địa chỉ thiết bị + bit ghi (write).
• Thiết bị phản hồi ACK.
• Bộ điều khiển gửi mã lệnh (command code).
• Thiết bị phản hồi ACK.
• Bộ điều khiển gửi 2 byte dữ liệu (low byte trước, high byte sau).
• Thiết bị phản hồi ACK.
Nhận dữ liệu phản hồi (giống Read Word nhưng bỏ qua lệnh đọc riêng biệt):
• Bộ điều khiển gửi repeated START (KHÔNG có STOP trước đó).
• Bộ điều khiển gửi địa chỉ thiết bị + bit đọc (read).
• Thiết bị phản hồi ACK.
• Thiết bị gửi lại 2 byte dữ liệu phản hồi.
• Bộ điều khiển gửi NACK để kết thúc.
• Bộ điều khiển gửi STOP để hoàn thành giao dịch.
6. Block Write/Read
Block Write/Read để gửi/nhận nhiều byte sau một command.
Block Write (Ghi khối dữ liệu):
• Bộ điều khiển gửi địa chỉ thiết bị + bit ghi (Write).
• Thiết bị phản hồi ACK.
• Bộ điều khiển gửi mã lệnh (command code).
• Thiết bị phản hồi ACK.
• Bộ điều khiển gửi số byte dữ liệu (byte count, tối đa 255 byte).
• Thiết bị phản hồi ACK.
• Bộ điều khiển gửi các byte dữ liệu (từ 1 đến 255 byte).
• Thiết bị phản hồi ACK cho từng byte.
• Bộ điều khiển gửi STOP để kết thúc giao dịch.

Block Read (Đọc khối dữ liệu)
• Bộ điều khiển gửi địa chỉ thiết bị + bit ghi (Write).
• Thiết bị phản hồi ACK.
• Bộ điều khiển gửi mã lệnh (command code).
• Thiết bị phản hồi ACK.
• Bộ điều khiển gửi repeated START (KHÔNG có STOP trước đó).
• Bộ điều khiển gửi địa chỉ thiết bị + bit đọc (Read).
• Thiết bị phản hồi ACK.
• Thiết bị gửi số byte dữ liệu (byte count, tối đa 255 byte).
• Bộ điều khiển phản hồi ACK.
• Thiết bị gửi từng byte dữ liệu, bộ điều khiển ACK mỗi byte.
• Bộ điều khiển gửi NACK trước STOP để kết thúc giao dịch.

7. Block Write – Block Read Process Call

Đây là giao thức 2 phần, gồm ghi khối dữ liệu (Block Write) và đọc khối dữ liệu (Block Read).
Không có STOP giữa hai phần, mà sử dụng repeated START để chuyển hướng dữ liệu.
Số byte ghi (M) có thể khác số byte đọc (N).
Tổng số byte (M + N) không được vượt quá 255 byte.
Phần 1: Ghi dữ liệu (Block Write)
• Bộ điều khiển gửi địa chỉ thiết bị + bit ghi (Write).
• Thiết bị phản hồi ACK.
• Bộ điều khiển gửi mã lệnh (command code).
• Thiết bị phản hồi ACK.
• Bộ điều khiển gửi số byte ghi (M, số byte dữ liệu sắp gửi).
• Thiết bị phản hồi ACK.
• Bộ điều khiển gửi M byte dữ liệu.
• Thiết bị phản hồi ACK cho từng byte.
Phần 2: Đọc dữ liệu (Block Read)
• Bộ điều khiển gửi repeated START (không có STOP).
• Bộ điều khiển gửi địa chỉ thiết bị + bit đọc (Read).
• Thiết bị phản hồi ACK.
• Thiết bị gửi số byte đọc (N, số byte sắp nhận).
• Bộ điều khiển phản hồi ACK.
• Thiết bị gửi N byte dữ liệu.
• Bộ điều khiển phản hồi ACK cho từng byte (trừ byte cuối cùng).
• Bộ điều khiển gửi NACK cho byte cuối cùng để kết thúc đọc dữ liệu.
• Bộ điều khiển gửi STOP để kết thúc giao dịch.
Xem thêm: Inter-IC sound (I2S) là gì? Hiểu về giao thức truyền âm thanh số
8. SMBus Host Notify
Dùng khi một thiết bị cần báo cho Host về một sự kiện quan trọng (ví dụ: cảnh báo lỗi, nhiệt độ quá cao, điện áp bất thường…). Host chỉ nhận thông báo theo định dạng chuẩn để tránh nhầm lẫn.

Thiết bị SMBus gửi thông báo cho Host.
Host nhận thông báo và xử lý (biết thiết bị nào gửi và nội dung thông báo là gì).
Thiết bị SMBus chờ Host phản hồi hoặc tiếp tục hoạt động bình thường.
Tin nhắn gửi đến Host gồm 3 phần:
• Địa chỉ của Host (0001 000b, tức 0x08).
• Địa chỉ thiết bị gửi thông báo (để Host biết ai đang báo).
• 16-bit dữ liệu trạng thái (nội dung cảnh báo).
9. Write 32 bits từ bộ điều khiển
Dùng khi cần gửi tối đa 32 bits (4 byte) dữ liệu đến một thiết bị trên SMBus. Nếu dữ liệu ít hơn 32 bits, thì phải đệm thêm bit 0 để đủ 4 byte.

Controller gửi địa chỉ thiết bị (7-bit) + bit ghi (Write).
Thiết bị xác nhận (ACK).
Controller gửi mã lệnh (Command Code).
Thiết bị xác nhận (ACK).
Controller gửi 4 byte dữ liệu, nếu dữ liệu ngắn hơn thì đệm thêm bit 0 vào đầu.
Thiết bị xác nhận từng byte rồi kết thúc giao tiếp.
10. Đọc 32 bits từ bộ điều khiển
Dùng khi cần đọc tối đa 32 bit (4 byte) dữ liệu từ một thiết bị trên SMBus. Nếu dữ liệu ít hơn 32 bit, thiết bị phải đệm thêm bit 0 vào các bit cao để đủ 4 byte.

Controller gửi địa chỉ thiết bị (7-bit) + bit ghi (Write).
Thiết bị xác nhận (ACK).
Controller gửi mã lệnh (Command Code).
Thiết bị xác nhận (ACK).
Controller gửi điều kiện lặp lại START (Repeated START) + bit đọc (Read).
Thiết bị gửi lại 4 byte dữ liệu (có thể có bit 0 đệm).
Controller xác nhận từng byte, gửi NACK sau byte cuối cùng.
Controller kết thúc giao tiếp bằng STOP.
11. Ghi 64 bits từ bộ điều khiển
Dùng để gửi tối đa 64 bit (8 byte) dữ liệu đến một thiết bị trên SMBus. Nếu dữ liệu ít hơn 64 bit, phải đệm thêm bit 0 vào các bit cao để đủ 8 byte.

Controller gửi địa chỉ thiết bị (7-bit) + bit ghi (Write).
Thiết bị xác nhận (ACK).
Controller gửi mã lệnh (Command Code).
Thiết bị xác nhận (ACK).
Controller gửi 8 byte dữ liệu (có thể có bit 0 đệm).
Thiết bị xác nhận mỗi byte, rồi kết thúc với STOP.
Xem thêm: Tìm hiểu về Universal Serial Bus (USB)
12. Nhận 64 bits từ bộ điều khiển
Dùng để đọc tối đa 64 bit (8 byte) dữ liệu từ thiết bị trên SMBus. Nếu dữ liệu ngắn hơn 64 bit, thiết bị sẽ đệm bit 0 vào các bit cao để đủ 8 byte.

Bộ điều khiển gửi địa chỉ thiết bị (7-bit) + bit ghi (Write).
Thiết bị xác nhận (ACK).
Bộ điều khiển gửi mã lệnh (Command Code) (để yêu cầu dữ liệu).
Thiết bị xác nhận (ACK).
Bộ điều khiển gửi lệnh đọc (Read) với một điều kiện START lặp lại.
Thiết bị gửi 8 byte dữ liệu (có thể có bit 0 đệm).
Bộ điều khiển gửi NACK và STOP để kết thúc giao dịch.
So sánh SMBus và I²C – Điểm khác biệt chính
1. Khác biệt về Timing (Thời gian)
Yếu tố | I²C | SMBus |
Tần số xung nhịp | Không quy định tần số tối thiểu. Hỗ trợ 100 KHz (Standard Mode) và 400 KHz (Fast Mode). | Xác định rõ ràng tối thiểu 10 KHz và tối đa 100 KHz. |
Clock Low Time-out | Không quy định. | Có quy định rõ ràng. Nếu clock bị giữ mức thấp quá lâu, thiết bị sẽ reset. |
Clock Stretching | Cho phép giữ clock thấp để kiểm soát luồng dữ liệu. | Giới hạn tổng thời gian giữ clock thấp của master/slave để tránh treo bus. |
Thời gian giữ dữ liệu (Data Hold Time) | 0 ns (không yêu cầu giữ dữ liệu). | 300 ns, đảm bảo dữ liệu ổn định lâu hơn. |
2. ACK và NACK – Cơ chế xác nhận
Yếu tố | I²C | SMBus |
ACK khi nhận địa chỉ | Slave có thể không ACK địa chỉ của nó. | Slave luôn phải ACK địa chỉ để xác định sự có mặt của thiết bị. |
NACK | Slave gửi NACK khi không thể nhận thêm dữ liệu. | Slave gửi NACK khi gặp lệnh hoặc dữ liệu không hợp lệ. |
Xem thêm: Controller Area Network (CAN) bus – Hệ Thần Kinh Của Ô Tô Hiện Đại
3. Khác biệt về Giao thức (Protocol)
Yếu tố | I²C | SMBus |
Lệnh giao tiếp | Không giới hạn, có thể tùy chỉnh. | Chỉ cho phép các lệnh đã quy định trong chuẩn SMBus. |
Loại dữ liệu truyền | Tự do, có thể truyền bất kỳ dữ liệu nào. | Được chuẩn hóa với các lệnh Write Byte, Read Byte, Block Read, Process Call… |
Cấu trúc lệnh | Tùy thuộc vào thiết bị. | Được chuẩn hóa để dễ tương thích giữa các thiết bị SMBus. |
4. Ứng dụng thực tế
I²C | SMBus |
Dùng phổ biến trong vi điều khiển, cảm biến, EEPROM… | Chủ yếu dùng để quản lý hệ thống như giám sát pin, nhiệt độ, quạt tản nhiệt, VRM… |
Linh hoạt hơn, không có quá nhiều ràng buộc về giao thức. | Có quy định chặt chẽ hơn để đảm bảo tính ổn định trong hệ thống. |
Do đó: SMBus có tính ổn định cao hơn do có các giới hạn nghiêm ngặt, trong khi I²C linh hoạt hơn, dễ dùng với nhiều loại thiết bị khác nhau.
SMBus là một biến thể của I²C, được thiết kế với các tiêu chuẩn nghiêm ngặt hơn để đảm bảo tính ổn định và khả năng tương thích giữa các thiết bị quản lý hệ thống, chẳng hạn như giám sát pin, nhiệt độ, và nguồn điện. Mặc dù có nhiều điểm tương đồng với I²C, SMBus có các quy định cụ thể về tần số, thời gian giữ dữ liệu, cách sử dụng ACK/NACK, và các giao thức truyền dữ liệu. Những điều này giúp SMBus trở nên đáng tin cậy hơn trong các hệ thống yêu cầu độ chính xác cao. Tuy nhiên, chính những giới hạn này cũng làm SMBus kém linh hoạt hơn so với I²C. Do đó, việc lựa chọn giữa SMBus và I²C sẽ phụ thuộc vào yêu cầu cụ thể của ứng dụng – nếu cần tính tương thích và ổn định cao, SMBus là lựa chọn tối ưu; còn nếu cần sự linh hoạt và tốc độ cao hơn, I²C sẽ phù hợp hơn.
Xem thêm: Hiểu về Direct Memory Access (DMA)