#1_Chuẩn giao tiếp I2C

Chuẩn giao tiếp I2C

Nắm rõ lý thuyết về chuẩn giao tiếp I2C sẽ giúp chúng ta hiểu rõ bản chất và thuận lợi cho thực hiện các dự án sau này…

Chúng ta sẽ cùng tìm hiểu phần lý thuyết dài lê thê trước thực hành trên vi điều khiển…

Phần cơ bản

Giới thiệu về chuẩn giao tiếp I2C

Khi bắt đầu tìm hiểu 1 chút về mạch điện tử, hoặc đọc các bài báo kỹ thuật chuyên sâu, có thể ta sẽ bắt gặp thuật ngữ “chuẩn giao tiếp I2C”, thật vậy, đây là 1 chuẩn giao tiếp rất thông dụng do tính đơn giản và hiệu quả của nó.

Chuẩn giao tiếp I2C
Chuẩn giao tiếp I2C
Về cơ bản, trong giao tiếp I2C, có 2 dây kết nối là SDA và SCL. Dây SDA để truyền dữ liệu nối tiếp. Dây SCL để tạo tín hiệu đồng hồ (CLK) chung cho cả hệ thống (truyền đồng bộ)

 Khái quát về truyền dữ liệu trong chuẩn giao tiếp I2C

Khi truyền dữ liệu, có Khung địa chỉ có 7 bit để gán cho mỗi thiết bị. Theo lý thuyết thì 1 thiết bị sẽ kết nối được với 127 (27 – 1) thiết bị khác, nhưng trong thực tế không làm được như vậy. Nguyên nhân là do công suất, tiêu hao…

Khi bắt đầu 1 chu trình truyền/nhận, sẽ có bit bắt đầu để khởi tạo quá trình truyền nhận dữ liệu. Bit địa chỉ để trỏ đến thiết bị tớ (Slave) mong muốn, bit đọc/ghi để để chọn chế độ nhận hay truyền dữ liệu.

Sau đó dữ liệu mới được đẩy lên đường truyền, và cuối cùng là bit ACK/NACK để xác nhận truyền dữ liệu thành công. Tiếp theo sẽ lại là dữ liệu rồi đến ACK/NACK, cứ như vậy cho đến khi có bit kết thúc để dừng lại quá trình truyền này.

Vâng, về cơ bản chuẩn giao tiếp I2C là như thế, để tìm hiểu sâu hơn, ta sẽ đi xem xét kỹ lưỡng ở phần nâng cao bên dưới.

Phần nâng cao

Các thành phần trong chuẩn giao tiếp I2C

Chuẩn giao tiếp I2C

Chuẩn giao tiếp I2C (Inter-Integrated Circuit) là một loại bus nối tiếp hai chiều với hai dây tín hiệu được phát triển bởi hãng sản xuất linh kiện điện tử Philips (nay là hãng NXP Semiconductors) cho quá trình giao tiếp giữa các IC. Đây là 1 trong các chuẩn giao tiếp vi điều khiển thưởng gặp.

Giao tiếp I2C là quá trình truyền thông đồng bộ nối tiếp, hỗ trợ nhiều master (thiết bị chủ) và slave (thiết bị tớ) trên đường truyền. I2C phù hợp với các ngoại vi mà sự ưu tiên về kết nối đơn giản và chi phí sản xuất thấp quan trọng hơn là yêu cầu về tốc độ truyền như giao tiếp giữa vi điều khiển và mảng cảm biến, các thiết bị hiển thị, thiết bị IoT, EEPROMs, v.v …

Giao tiếp I2C

Chuẩn giao tiếp I2C sử dụng 2 dây để truyền dữ liệu giữa các thiết bị:

  1. SDA (Serial Data) – Đường truyền cho chủ và tớ để gửi và nhận dữ liệu.
  2. SCL (Serial Clock) – Dòng mang tín hiệu xung nhịp.

Đây là một giao thức truyền thông nối tiếp, vì vậy dữ liệu được truyền từng bit dọc theo một dây duy nhất (đường SDA).

Đặc điểm giao tiếp I2C

Giống như giao tiếp SPI, giao tiếp I2C là đồng bộ, do đó đầu ra của các bit được đồng bộ hóa với việc lấy mẫu các bit bởi một tín hiệu đồng hồ được chia sẻ giữa master và slave. Tín hiệu đồng hồ luôn được điều khiển bởi master.

Thiết bị chính (Master) và thiết bị phụ (Slave)

  • Một master với nhiều slave

Bởi vì chuẩn giao tiếp I2C sử dụng địa chỉ, nên nhiều slave có thể được điều khiển từ một master duy nhất. Với địa chỉ 7 bit, 128 (27) địa chỉ duy nhất có sẵn. Sử dụng địa chỉ 10 bit là không phổ biến, nhưng cung cấp 1.024 (210) địa chỉ duy nhất. Để kết nối nhiều slave với một master duy nhất, như hình vẽ bên dưới, 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:

Một master với nhiều slave
  • Nhiều master với nhiều slave
Nhiều master với nhiều slave

Nhiều master có thể được kết nối với một slave hoặc nhiều slave. Vấn đề với nhiều master trong cùng một hệ thống xảy ra khi hai master cố gắng gửi hoặc nhận dữ liệu cùng một lúc qua đường SDA. Để giải quyết vấn đề này, mỗi master cần phát hiện xem đường SDA thấp hay cao trước khi truyền dữ liệu. Nếu dòng SDA ở 0, điều này có nghĩa là một master khác có quyền điều khiển bus và master này phải đợi để gửi dữ liệu. Nếu dòng SDA ở mức cao, thì việc truyền dữ liệu sẽ an toàn. Để kết nối nhiều master với nhiều slave, 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:

Address bit, Start condition của chuẩn giao tiếp I2C

Chuẩn giao tiếp I2C không có các dòng chọn slave như giao tiếp SPI, vì vậy nó cần một cách khác để cho slave biết rằng dữ liệu đang được gửi tới nó chứ không phải slave khác. Nó thực hiện điều này bằng việc gán địa chỉ cho các slave. Khung địa chỉ (Adress bit) luôn là khung đầu tiên sau bit bắt đầu trong điều kiện khởi động (Start condition).

Chuẩn giao tiếp I2C
Sơ đồ nối dây (Click để phóng to)

Điều kiện khởi động (Start condition) gồm 1 bit bắt đầu cho quá trình truyền dữ liệu trong chuẩn giao tiếp I2C. Lúc này đường SDA chuyển điện áp từ mức cao xuống mức thấp trước đường SCL (ngược với điều kiện dừng).

Điều kiện khởi động (Start condition)

Khung địa chỉ là một chuỗi 7 hoặc 10 bit duy nhất cho mỗi slave để xác định slave khi master muốn liến lạc với nó. Master gửi địa chỉ của slave mà nó muốn liên lạc với mọi slave được kết nối với nó. Sau đó, mỗi slave sẽ so sánh địa chỉ được gửi từ master với địa chỉ của chính nó.

  • Nếu địa chỉ phù hợp, nó sẽ gửi một bit ACK điện áp thấp trở lại master.
  • Nếu địa chỉ không khớp, slave không làm gì và dòng SDA giữa 2 thiết bị đó vẫn sẽ ở mức cao.

Read / Write bit

Bit Read/Write gồm một bit duy nhất ở sau khung địa chỉ. Nó cho slave biết master muốn ghi dữ liệu vào nó hay nhận dữ liệu từ nó.

 bit đọc / ghi 
Master gửi dữ liệu đến slave0
Master yêu cầu nhận dữ liệu từ slave1

ACK / NACK bit

ACK / NACK bit (bit xác nhận) có trong mỗi lần liên lạc. Bit này có nhiệm vụ đảm bảo việc truyền nhận dữ liệu bằng cách thay đổi mức điện áp trên dòng SDA. Nếu một khung địa chỉ hoặc khung dữ liệu được nhận thành công. Lúc này một bit ACK sẽ được trả lại cho người gửi từ thiết bị nhận (bit 0 khi nhận xong dữ liệu).

Data Frame, Stop condition (Khung dữ liệu, điều kiện dừng)

Sau khi master phát hiện bit ACK từ slave, khung dữ liệu đầu tiên đã sẵn sàng được gửi.

Khung dữ liệu luôn dài 8 bit và được gửi với bit quan trọng nhất trước (MSB). Mỗi khung dữ liệu ngay lập tức được theo sau bởi một bit ACK / NACK để xác minh rằng khung đã được nhận thành công (bit 0 ở dòng SDA). Bit ACK phải được nhận bởi master hoặc slave (tùy thuộc vào thiết bị đang gửi dữ liệu) trước khi khung dữ liệu tiếp theo có thể được gửi.

Sau khi tất cả các khung dữ liệu đã được gửi đi, master có thể gửi điều kiện dừng (Stop condition) đến slave để tạm dừng quá trình truyền.

Điều kiện dừng (Stop condition) là sự chuyển đổi điện áp từ thấp lên cao trên đường SCL trước khi chuyển điện áp từ thấp lên cao trên đường SDA.

Điều kiện dừng (Stop condition)

Cách truyền dữ liệu của chuẩn giao tiếp I2C

Với chuẩn giao tiếp I2C , dữ liệu được truyền dưới dạng các khung dữ liệu. Mỗi 1 slave có 1 khung địa chỉ khác nhau để master có thể phân biệt. Trong 1 lần truyền dữ liệu cần 1 khung địa chỉ để master xác định slave và một hoặc nhiều khung dữ liệu chứa dữ liệu đang được truyền. Ngoài ra còn có các điều kiện bắt đầu và dừng, các bit Read/Write và các bit ACK / NACK.

Chuẩn giao tiếp I2C
Khung truyền (Click để phóng to)

Master gửi điều kiện khởi động (Start condition)

Master gửi điều kiện khởi động (Start condition) đến mọi slave được kết nối bằng cách chuyển đường SDA từ mức điện áp cao sang mức điện áp thấp trước khi chuyển đường SCL từ mức cao xuống mức thấp.

Master gửi điều kiện khởi động

Master gửi địa chỉ ra mạng lưới (7 hoặc 10 bit)

Master gửi địa chỉ ra mạng lưới 7 hoặc 10 bit trùng với địa chỉ của slave mà nó muốn giao tiếp. Cùng với bit Read/Write (mức 0 khi Master truyền dữ liệu).

Master gửi địa chỉ ra mạng lưới (Click để phóng to)

Slave so sánh địa chỉ được gửi

Các slave so sánh địa chỉ được gửi từ master với địa chỉ của chính nó. Nếu địa chỉ phù hợp, slave sẽ trả về một bit ACK bằng cách kéo dòng SDA xuống thấp trong một bit. Nếu địa chỉ từ master không khớp với địa chỉ của chính slave, slave sẽ vẫn ở mức cao.

Các slave so sánh địa chỉ (Click để phóng to)

Master gửi (hoặc nhận) khung dữ liệu

Master gửi (hoặc nhận) khung dữ liệu

Master gửi lệnh dừng (Stop condition)

Để dừng truyền dữ liệu, master gửi điều kiện dừng (Stop condition) đến slave. Lúc này master sẽ chuyển đổi đường SCL sang mức cao trước khi chuyển đường SDA sang mức cao:

Master gửi lệnh dừng

Ưu, nhược điểm của chuẩn giao tiếp I2C

Ưu điểm 

  • Chỉ sử dụng hai dây
  • Hỗ trợ nhiều master và nhiều slave
  • Bit ACK / NACK xác nhận rằng mỗi khung dữ liệu hay địa chỉ được gửi (hoặc nhận) thành công
  • Phần cứng ít phức tạp hơn với giao tiếp UART
  • Giao thức nổi tiếng và được sử dụng rộng rãi

Nhược điểm

  • Tốc độ truyền dữ liệu giao tiếp I2C chậm hơn so với giao tiếp SPI
  • Kích thước của khung dữ liệu được giới hạn ở 8 bit
  • Cần phần cứng phức tạp hơn để triển khai so với giao tiếp SPI

Phần tổng kết

Ta đã cùng nhau tìm hiểu cơ bản về lý thuyết của chuẩn giao tiếp I2C. Đây là 1 khởi đầu tốt đẹp trước khi bắt đầu thực hành. Kiến thức về giao tiếp I2C được tóm tắt lại như sau:

  • Sử dụng 2 dây SDA và SCL
  • Kiểu truyền dữ liệu nối tiếp (SDA)
  • Phương thức truyền dữ liệu đồng bộ (xung nhịp trên dây SCL)
  • Ngoài dữ liệu ra trong 1 quá trình truyền còn nhét thêm vào 1 số bit. Đó là Start bit, Adress bit, Read/Write bit, Data Frame, ACK/NACK bit, Stop bit. Các bit thêm vào này  có rất nhiều tác dung. Nó giúp chọn đúng slave mong muốn, xác nhận đủ dữ liệu và kết thúc quá trình truyền.

Lúc này ta đã có kiến thức cơ bản về chuẩn giao tiếp i2c. Bạn có thể đọc thêm các chuẩn giao tiếp khác:

Bạn có thắc mắc gì trong bài viết không?

Đánh giá và để lại bình luận bên dưới nhá.

4.5/5 - (8 bình chọn)

Similar Posts

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *