I2C là tên viết tắt của cụm từ Inter-Intergrated Circuit. Đây là đường bus giao tiếp giữa các IC với nhau. Bus I2C được sử dụng làm bus giao tiếp ngoại vi rất nhiều loại IC khác nhau như các loại vi điều khiển 8051, PIC, AVR, ARM… chip nhớ như: Ram tĩnh (Static Ram), EEPROM, bộ chuyển đổi tương tự số (ADC), số tương tự (DAC), IC điều khiển LCD, LED….
I2C sử dụng hai đường truyền tín hiệu
- Một đường xung nhịp đồng hồ (SCL) chỉ do Master (Arduino trung tâm) phát đi (Thông thường ở 100kHz và 400kHz. Mức cao nhất là 1 MHz và 3.4 MHz).
- Một đường dữ liệu (SDA) theo 2 hướng gửi và nhận.
Có rất nhiều thiết bị có thể cùng được kết nối vào một bus I2C, tuy nhiên sẽ không xảy ra chuyện nhầm lẫn giữa các thiết bị, bởi mỗi thiết bị sẽ được nhận ra bởi một địa chỉ duy nhất với mối quan hệ chủ/tớ (Master/Slave) tồn tại trong suốt thời gian kết nối. Mỗi thiết bị có thể hoạt động như là thiết bị nhận hoặc truyền dữ liệu hay cũng có thể vừa truyền vừa nhận. Hoạt động truyền hay nhận còn tùy thuộc vào việc thiết bị đó là chủ (Master) hay tớ (Slave). Một thiết bị hay một IC khi kết nối với bus I2C, ngoài một địa chỉ duy nhất để phân biệt, nó còn được cấu hình là thiết bị chủ (Master) hay tớ (Slave) có sự phân biệt quan hệ này do trên một bus I2C thì quyền điều khiển thuộc về thiết bị chủ đóng vai trò cung cấp xung đồng hồ cho toàn hệ thống. Khi giữa hai thiết bị giao tiếp thông qua bus I2C thì thiết bị chủ có vai trò tạo xung đồng hồ và quản lý địa chỉ của thiết bị tớ trong suốt
40 quá trình giao tiếp. Thiết bị chủ đóng vai trò chủ động, còn thiết bị tớ giữ vai trò bị động trong việc giao tiếp
Hình 2.41 Sơ đồ giao tiếp I2C
Như vậy ta có thể dùng 1 board Arduino trung tâm (Board Master) để điều khiển rất nhiều board Arduino khác (board slave) chỉ cần thông qua 2 dây SCL và SDA. Với mỗi board slave ta đặt cho nó một địa chỉ riêng (là một số bất kì cố định).
Cách thức giao tiếp với nhiều thiết bị thông qua giao thức I2C
Như đã nói ở trên, mỗi thiết bị có một địa chỉ được cài đặt sẵn hoặc một địa chỉ thiết bị duy nhất để thiết bị chủ (Master) có thể giao tiếp. Hai chân SDA và SCL là hai chân của giao tiếp I2C, trong đó, chân SCL là chân Clock có tác dụng đồng bộ hóa việc truyền dữ liệu giữa các thiết bị, và việc tạo ra xung Clock do thiết bị chủ đảm nhận. Chân còn lại là chân SDA hay còn gọi là chân truyền dữ liệu (DATA). Hai chân này luôn hoạt động ở chế độ mở. Vì vậy, để sử dụng được cần phải có trở kéo (Pull resistor) tức là nối theo thứ tự VCC -> Điệnt trở -> thiết bị I2C bởi các thiết bị trên bus I2C hoạt động ở mức thấp. Giá trị thường được sử dụng cho các điện trở từ 2KΩ cho tốc độ vào khoảng 400 KBps, và 10KΩ cho tốc độ thấp hơn khoảng 100 KBps.
41 Dưới đây là cách kết nối 2 module với Arduino, ở đây không có điện trở kéo như đã nói ở trên vì bản thân bên trong cách module đều đã có điện trở kéo do nhà sản xuất tích hợp sẵn nên không cần nữa.
Hình 2.42 Sơ đồ minh họa kết nối giữa các thiết bị với nhau qua giao thức I2C