I²C, viết tắt của từ tiếng Anh “Inter-Integrated Circuit”, làmột loại bus nối tiếpđược phát triển bởi hãng sản xuất linh kiện điện tử Philips. Ban đầu, loại bus này chỉ được dùng trong cáclinh kiện điện tửcủa Philips. Sau đó, do tínhưu việt vàđơn giản của nó,I²Cđã được chuẩn hóa vàđược dùng rộng rãi trong các môđun truyền thông nối tiếp của vi mạch tích hợp ngày nay.
I²C-bus là một bus với 2 đường tín hiệu, dùng để kết nối nhiều vi mạch với nhau. Đây là một bus dùng quan hệ master/slave, với master khởi đầu mọi thao tác truyền dữ liệu, và tạo xung clock cho bus. I²C hỗ trợ nhiều master cùng tồn tại trên bus, có phát hiện xung đột và phân xử bus để tránh trường hợp có từ 2 master trở lên cùng khởi đầu việc truyền dữ liệu (vì ở mỗi thời điểm chỉ có thể có một master điều khiển việc truyền dữ liệu trên bus).
I²C-bus hỗ trợ truyền dữ liệu theo hai chiều, bán song công (nghĩa là master đang phát thì không thu và ngược lại), với các tốc độ khác nhau như đến 100 kbps ở Standard- mode, đến 400 kbps ở Fast-mode, và đến 3.4 Mbps (megabit/s) ở High-speed mode.
Số lượng vi mạch được nối vào bus chỉ bị giới hạn bởi điện dung bus tối đa là 400 pF. Do đó, tùy vào chiều dài vật lý của cáp, điện dung của cáp, và điện dung ngõ vào của các vi mạch nối vào bus mà chúng ta có thể xác định được có thể nối bao nhiêu vi mạch vào một bus cụ thể.
Các vi mạch nối vào I²C-bus có các chân SDA và SCL ở dạng cực thu/cực máng hở. Do đó các đường SDA và SCL cần có các điện trở kéo lên, giá trị của các điện trở phụ thuộc vào điện áp nguồn, tốc độ truyền và điện dung của bus (vì nó liên quan đến thời gian lên của các đường tín hiệu). Với điện áp nguồn, tốc độ truyền, và điện dung bus đã biết, tồn tại một phạm vi cho phép đối với các điện trở kéo lên: Rpmin < Rp < Rpmax. Các nhà sản xuất vi mạch thường có các khuyến cáo đối với giá trị điện trở kéo lên dành cho vi mạch cụ thể.
Các điều kiện START, và STOP được định nghĩa như sau. Điều kiện START: một sự chuyển mức từ cao xuống thấpở đường SDA khi đường SCL ở trạng thái cao. Điều kiện STOP: một sự chuyển mức từ thấp lên cao ở đường SDA khi đường SCL ở trạng thái cao. Các điều kiện này luôn luôn do master tạo ra.
Khi master ghi dữ liệu, trình tự sau được tiến hành: START, địa chỉ của slave cùng với bit trạng thái ghi, nhận ACK từ slave, ghi các byte dữ liệu vào slave, nhận ACK/NACK từ slave cho mỗi byte được ghi, STOP. Trong trình tự này, chiều truyền dữ liệu là không đổi.
Để tạo ACK, chân SDA sẽ được kéo xuống mức thấp bởi vi mạch chịu trách nhiệm tạo tín hiệu ACK/NACK. Trạng thái NACK do đó tương ứng với việc chân SDA được thả ở mức cao.
Khi master đọc dữ liệu, trình tự sau được tiến hành: START, địa chỉ của slave cùng với bit trạng thái đọc, đọc các byte dữ liệu từ slave, tạo ACK nếu tiếp tục đọc và NACK cho byte dữ liệu sau cùng, STOP. Trong trình tự này, chiều truyền dữ liệu là không đổi.
Nếu master cần thực hiện ghi/đọc dữ liệu kết hợp trong một thông điệp (bắt đầu bằng START và kết thúc bằng STOP), các RESTART có thể được dùng để đổi chiều
dữ liệu. Ở những phần mà dữ liệu chỉ truyền theo một chiều nhất định, các trình tự đã được mô tả ở trên có thể được áp dụng.
I²C sử dụng hai đường truyền tín hiệu:
Một đường xung nhịp đồng hồ(SCL) chỉ do Master phát đi ( thông thường ở 100kHz và 400kHz. Mức cao nhất là 1Mhz và 3.4MHz).
Một đường dữ liệu(SDA) theo 2 hướng. Sơ đồ kết nối như hình dưới.
Hình 3.20 Sơ đồ kết nối chuẩn I2C
Có một lưu ý nhỏ về xung clock. Bản chất của I²C là dữ liệu trên đường SDA chỉ được ghi nhận ở sườn lên của chân CLK. Do vậy xung clock có thể không cần chính xác tốc độ là 1MHz hay 3.4Mhz. Lợi dụng điểm này có thể sử dụng 2 chân GPIO để làm chân giao tiếp I²Cmềmmà không nhất thiết cần một chân CLK tạo xung với tốc độ chính xác (có thể chỉ cần dùng delay và bật tắt mức logic, tham khảo phần code ở cuối bài :D)
SCL vàSDA luônđược kéo lên nguồn bằng mộtđiện trở kéo lên cógiá trị xấp xỉ 4,7K (tùy vào từng thiết bị và chuẩn giao tiếp, có thể dao động trong khoảng 1K đến 4,7 K. Chú ý rằng theo cấu hình này, một thiết bị có thể ở mức logic LOW hay mức trở khángcao nhưng ko thể ở dạng HIGH vì chính trở pull up tạo ra mức logic HIGH.