Giao Thức I2C: Tìm Hiểu Chi Tiết Về Giao Tiếp Nối Tiếp Đồng Bộ

Giao thức I2C (Inter-Integrated Circuit) là một chuẩn giao tiếp nối tiếp đồng bộ được sử dụng rộng rãi trong các hệ thống nhúng. I2C kết hợp những ưu điểm của cả SPI (Serial Peripheral Interface) và UART (Universal Asynchronous Receiver/Transmitter), mang lại sự linh hoạt và hiệu quả trong việc kết nối các thiết bị. Với I2C, bạn có thể kết nối nhiều slave (thiết bị tớ) với một master (thiết bị chủ) duy nhất, tương tự như SPI. Đồng thời, bạn cũng có thể có nhiều master điều khiển một hoặc nhiều slave, điều mà UART không hỗ trợ. Điều này đặc biệt hữu ích trong các ứng dụng như ghi dữ liệu từ nhiều vi điều khiển vào một thẻ nhớ hoặc hiển thị thông tin trên một màn hình LCD.

Sơ đồ giao tiếp I2CSơ đồ giao tiếp I2C

I2C Hoạt Động Như Thế Nào?

Tương tự như giao tiếp UART, I2C chỉ sử dụng hai dây dẫn để truyền dữ liệu giữa các thiết bị:

  • SDA (Serial Data): Đường truyền dữ liệu hai chiều, cho phép cả master và slave gửi và nhận dữ liệu.
  • SCL (Serial Clock): Đường truyền tín hiệu xung nhịp, được sử dụng để đồng bộ hóa việc truyền dữ liệu. Tín hiệu xung nhịp này luôn được điều khiển bởi master.

I2C là một giao thức truyền thông nối tiếp, nghĩa là dữ liệu được truyền từng bit một dọc theo một đường duy nhất (đường SDA). Vì I2C là đồng bộ, nên việc xuất các bit dữ liệu được đồng bộ hóa với việc lấy mẫu các bit bằng tín hiệu xung nhịp chung giữa master và slave.

Cấu Trúc Tin Nhắn I2C

Trong I2C, dữ liệu được truyền dưới dạng các tin nhắn (message). Mỗi tin nhắn được chia thành các khung (frame) dữ liệu. Một tin nhắn I2C bao gồm:

  1. Điều kiện START (Start Condition): Báo hiệu bắt đầu truyền dữ liệu.
  2. Khung địa chỉ (Address Frame): Chứa địa chỉ nhị phân của slave mà master muốn giao tiếp.
  3. Bit đọc/ghi (Read/Write bit): Xác định hướng truyền dữ liệu (master gửi đến slave hay master nhận từ slave).
  4. Một hoặc nhiều khung dữ liệu (Data Frame): Chứa dữ liệu thực tế được truyền.
  5. Bit ACK/NACK (Acknowledge/Not Acknowledge bit): Được sử dụng để xác nhận việc nhận dữ liệu thành công.
  6. Điều kiện STOP (Stop Condition): Báo hiệu kết thúc truyền dữ liệu.

Cấu trúc tin nhắn I2CCấu trúc tin nhắn I2C

Chi Tiết Về Các Thành Phần Trong Tin Nhắn I2C:

  • Điều kiện START: Đường SDA chuyển từ mức cao xuống mức thấp trong khi đường SCL vẫn ở mức cao.
  • Điều kiện STOP: Đường SDA chuyển từ mức thấp lên mức cao trong khi đường SCL vẫn ở mức cao.
  • Khung địa chỉ: Là một chuỗi 7 hoặc 10 bit duy nhất, được gán cho mỗi slave để master có thể xác định slave mà nó muốn giao tiếp. Master gửi địa chỉ này đến tất cả các slave được kết nối. Mỗi slave sẽ so sánh địa chỉ này với địa chỉ của chính nó. Nếu trùng khớp, slave sẽ gửi lại một bit ACK. Nếu không, slave sẽ bỏ qua tin nhắn.
  • Bit Đọc/Ghi: Bit này cho slave biết master muốn ghi dữ liệu vào nó (bit ở mức thấp) hay nhận dữ liệu từ nó (bit ở mức cao).
  • Khung dữ liệu: Luôn có độ dài 8 bit và được gửi với bit có nghĩa quan trọng nhất (MSB) trước. Mỗi khung dữ liệu được theo sau bởi một bit ACK/NACK để xác minh việc nhận thành công.

Các Bước Truyền Dữ Liệu I2C Chi Tiết

  1. Master phát ra điều kiện START: Master kéo đường SDA xuống mức thấp trong khi SCL ở mức cao. Điều này báo hiệu cho tất cả các slave trên bus rằng một tin nhắn mới sắp bắt đầu.

  2. Master gửi địa chỉ slave và bit đọc/ghi: Master gửi địa chỉ 7 hoặc 10 bit của slave mà nó muốn giao tiếp, sau đó là bit đọc/ghi để chỉ định hướng truyền dữ liệu.

  3. Slave trả lời ACK/NACK: Mỗi slave so sánh địa chỉ nhận được với địa chỉ của chính nó. Nếu địa chỉ trùng khớp, slave kéo đường SDA xuống mức thấp (ACK) để xác nhận rằng nó đã nhận được địa chỉ và sẵn sàng giao tiếp. Nếu địa chỉ không khớp, slave giữ đường SDA ở mức cao (NACK) và bỏ qua phần còn lại của tin nhắn.

  4. Truyền dữ liệu:

    • Ghi (Master gửi dữ liệu đến Slave): Master gửi một hoặc nhiều khung dữ liệu 8 bit đến slave. Sau mỗi khung dữ liệu, slave gửi một bit ACK để xác nhận việc nhận thành công.
    • Đọc (Master nhận dữ liệu từ Slave): Master yêu cầu dữ liệu từ slave. Slave gửi một hoặc nhiều khung dữ liệu 8 bit đến master. Sau mỗi khung dữ liệu, master gửi một bit ACK để xác nhận việc nhận thành công. Nếu master không muốn nhận thêm dữ liệu, nó có thể gửi một bit NACK để báo cho slave dừng truyền.
  5. Master phát ra điều kiện STOP: Sau khi hoàn tất việc truyền dữ liệu, master kéo đường SDA lên mức cao trong khi SCL ở mức cao. Điều này báo hiệu cho tất cả các slave trên bus rằng tin nhắn đã kết thúc.

I2C Với Nhiều Thiết Bị

Một trong những ưu điểm lớn của I2C là khả năng hỗ trợ nhiều thiết bị trên cùng một bus.

Một Master và Nhiều Slave

Với giao thức I2C, một master có thể giao tiếp với nhiều slave thông qua hai dây SDA và SCL. Mỗi slave được gán một địa chỉ duy nhất, cho phép master chọn slave cụ thể để giao tiếp. Sử dụng địa chỉ 7 bit cho phép có tối đa 128 (2^7) địa chỉ duy nhất. Tuy địa chỉ 10 bit ít được sử dụng hơn, nhưng nó cung cấp tới 1024 (2^10) địa chỉ duy nhất. Để kết nối nhiều slave với một master duy nhất, bạn có thể sử dụng sơ đồ sau, với điện trở kéo lên 4,7K Ohm kết nối đường SDA và SCL với Vcc:

Sơ đồ kết nối I2C một master nhiều slaveSơ đồ kết nối I2C một master nhiều slave

Nhiều Master và Nhiều Slave

I2C cũng hỗ trợ cấu hình nhiều master, nơi nhiều thiết bị chủ có thể điều khiển một hoặc nhiều slave. Tuy nhiên, điều này có thể dẫn đến xung đột khi hai master cố gắng truyền dữ liệu cùng một lúc. Để giải quyết vấn đề này, mỗi master cần kiểm tra xem đường SDA có đang ở mức thấp hay không trước khi bắt đầu truyền. Nếu đường SDA đang ở mức thấp, điều đó có nghĩa là một master khác đang sử dụng bus và master đó phải đợi. Nếu đường SDA ở mức cao, master có thể truyền dữ liệu một cách an toàn. Để kết nối nhiều master với nhiều slave, hãy sử dụng sơ đồ sau, với các điện trở kéo lên 4,7K Ohm kết nối các đường SDA và SCL với Vcc:

Sơ đồ kết nối I2C nhiều master nhiều slaveSơ đồ kết nối I2C nhiều master nhiều slave

Ưu Điểm và Nhược Điểm Của I2C

Giống như bất kỳ giao thức truyền thông nào khác, I2C có những ưu điểm và nhược điểm riêng.

Ưu điểm:

  • Chỉ sử dụng hai dây: Giúp giảm thiểu số lượng chân kết nối cần thiết, tiết kiệm không gian và giảm độ phức tạp của mạch.
  • Hỗ trợ nhiều master và nhiều slave: Cho phép xây dựng các hệ thống phức tạp với nhiều thiết bị giao tiếp với nhau.
  • Bit ACK/NACK: Đảm bảo tính toàn vẹn của dữ liệu bằng cách xác nhận việc truyền thành công mỗi khung dữ liệu.
  • Phần cứng ít phức tạp hơn UART: Dễ dàng triển khai và gỡ lỗi hơn so với UART.
  • Giao thức phổ biến: Được hỗ trợ rộng rãi bởi nhiều loại vi điều khiển và cảm biến.

Nhược điểm:

  • Tốc độ truyền dữ liệu chậm hơn SPI: Không phù hợp cho các ứng dụng yêu cầu tốc độ truyền dữ liệu cao.
  • Kích thước khung dữ liệu giới hạn ở 8 bit: Có thể làm tăng độ phức tạp của việc truyền dữ liệu lớn.
  • Cần phần cứng phức tạp hơn SPI: Yêu cầu các điện trở kéo lên và các mạch điều khiển bus phức tạp hơn.

Kết Luận

I2C là một giao thức truyền thông nối tiếp linh hoạt và được sử dụng rộng rãi trong nhiều ứng dụng nhúng. Mặc dù có một số nhược điểm, nhưng những ưu điểm của I2C, chẳng hạn như chỉ sử dụng hai dây, hỗ trợ nhiều thiết bị và tính toàn vẹn dữ liệu cao, khiến nó trở thành một lựa chọn hấp dẫn cho nhiều dự án. Việc hiểu rõ cách thức hoạt động của I2C là rất quan trọng đối với bất kỳ ai làm việc trong lĩnh vực điện tử và hệ thống nhúng.