Đầu năm 1980 Phillips đã phát triển một chuẩn giao tiếp nối tiếp 2 dây được gọi là I2C. 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. I2C mặc dù được phát triển bởi Philips, nhưng nó đã được rất nhiều nhà sản xuất IC trên thế giới sử dụng. I2C trở thành một chuẩn công nghiệp cho các giao tiếp điều khiển, có thể kể ra đây một vài tên tuổi ngoài Philips như: Texas Intrument(TI), MaximDallas, analog Device, National Semiconductor ... Bus I2C được sử dụng làm bus giao tiếp ngoại vi cho 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, các cảm biến nhiệt độ, áp suất, bộ chuyển đổi tương tự số (ADC), số tương tự (DAC), IC điểu khiển LCD, LED, IC DS1307 (Real Time Clock)
Cấu tạo và nguyên lý hoạt động: I2C sử dụng hai đường truyền tín hiệu.
Một đường xung nhịp đồng hồ (SCL – Serial Clock Line) 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 – Serial Data Line) theo 2 hướng.
Dữ liệu được truyền đi được gửi qua dây SDA và được đồng bộ với tín hiệu đồng hồ (clock) từ SCL.
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ởỉ một địa chỉ duy nhất với một quan hệ chủ/tớ 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ó 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ủ hay tớ. Trên một bus I2C thì quyền điều khiển thuộc về thiết bị chủ. Thiết bị chủ nắm vai trò tạo xung đồng hồ cho toàn hệ thống, khi giữa hai thiết bị chủ-tớ giao tiếp thì thiết bị chủ có nhiệm vụ tạo xung đồng hồ và quản lý địa chỉ của thiết bị tớ trong suốt quá trình giao tiếp. Thiết bị chủ giữ vai trò chủ động, còn thiết bị tớ giữ vai trò bị động trong việc giao tiếp.
Master: Giữ vai trò điều khiển các tín hiệu đường truyền (Bus I2C).
Tạo xung Clock trong suốt quá trình giao tiếp với Slave. Phát các tín hiệu Start bắt đầu cho quá trình truy xuất.
33 Gửi địa chỉ của thiết bị Slave cần truy xuất
Phát tín hiệu đọc hoặc ghi (R/W) tới Slave. Truyền dữ liệu tới thiết bị Slave.
Nhận dữ liệu từ Slave gửi lên.
Tạo tín hiệu Not-ACK khi kết thúc nhận dữ liệu từ Slave. Tạo tín hiệu Stop kết thúc quá trình truy xuất.
Slave
Nhận địa chỉ và bit R/W từ Master chỉ trả lời khi đúng địa chỉ của Slave . Nhận dữ liệu từ Master gửi tới đồng thời gửi bit ACK sau mỗi 8 Clock. Truyền dữ liệu tới Master, chờ tín hiệu ACK từ Master để tiếp tục gửi đi.
Thực hiện chức năng chuyên dụng của Slave ( EEPROM, Real Time Clock, Driver LCD, IoTs...).
Giao thức truyền dữ liệu:
Dữ liệu được truyền giữa thiết bị Master và các thiết bị Slave thông qua một đường dữ liệu SDA duy nhất, thông qua các chuỗi có cấu trúc gồm các số 0 và 1 (bit). Mỗi chuỗi số 0 và 1 được gọi là giao dịch (transaction) và dữ liệu trong mỗi giao dịch có cấu trúc như sau:
Hình 2.13: Cấu trúc dữ liệu trong mỗi giao dịch
Điều kiện bắt đầu (Start Condition): Bất cứ khi nào một thiết bị chủ / IC quyết
định bắt đầu một giao dịch, nó sẽ chuyển mạch SDA từ mức điện áp cao xuống mức điện áp thấp trước khi đường SCL chuyển từ cao xuống thấp. Khi điều kiện bắt đầu được gửi bởi thiết bị Master, tất cả các thiết bị Slave đều hoạt động ngay cả khi chúng ở chế độ ngủ (sleep mode) và đợi bit địa chỉ.
34
Hình 2.14: Điều kiện bắt đầu trong mỗi giao dịch dữ liệu
Khối địa chỉ: Thiết bị Master gửi 7 bit địa chỉ của thiết bị Slave mà thiết bị Master
muốn giao tiếp cùng với bit Read/Write. Tất cả các thiết bị Slave trên bus I2C so sánh các bit địa chỉ này với địa chỉ của chúng.
Bit Read / Write: Bit này xác định hướng truyền dữ liệu. Nếu thiết bị Master / IC
cần gửi dữ liệu đến thiết bị Slave - read, bit này được thiết lập là ‘0’. Nếu IC Master cần nhận dữ liệu từ thiết bị Slave - write, bit này được thiết lập là ‘1’.
Bit ACK / NACK: ACK/NACK là viết tắt của Acknowledged/NotAcknowledged.
Nếu địa chỉ vật lý của bất kỳ thiết bị Slave nào trùng với địa chỉ được thiết bị Master phát, giá trị của bit này được set là ‘0’ bởi thiết bị Slave. Ngược lại, nó vẫn ở mức logic ‘1’ (mặc định).
Khối dữ liệu: Nó bao gồm 8 bit và chúng được thiết lập bởi bên gửi, với các bit dữ
liệu cần truyền tới bên nhận. Khối này được theo sau bởi một bit ACK / NACK và được set thành ‘0’ bởi bên nhận nếu nó nhận thành công dữ liệu. Ngược lại, nó vẫn ở mức logic ‘1’.
Sự kết hợp của khối dữ liệu theo sau bởi bit ACK / NACK được lặp lại cho đến quá trình truyền dữ liệu được hoàn tất.
Điều kiện kết thúc (Stop condition): Sau khi các khung dữ liệu cần thiết được
truyền qua đường SDA, thiết bị Master chuyển đường SDA từ mức điện áp thấp sang mức điện áp cao trước khi đường SCL chuyển từ cao xuống thấp.
35
Hình 2.15: Điều khiện kết thúc của giao dịch dữ liệu
Hình dưới đây thể hiện toàn bộ các bit dữ liệu được gửi trên đường SDA và thiết bị điều khiển chúng khi thiết bị Master gửi dữ liệu đến thiết bị Slave.
Hình 2.16: Các bit dữ liệu gửi trên đường SDA khi Master gửi đến Slave.
36 Về lý thuyết lẫn thực tế I²C sử dụng 7 bit để định địa chỉ, do đó trên một bus có thể có tới 2^7 địa chỉ tương ứng với 128 thiết bị có thể kết nối, nhưng chỉ có 112, 16 địa chỉ còn lại được sử dụng vào mục đích riêng. Bit còn lại quy định việc đọc hay ghi dữ liệu (1 là write, 0 là read).
Điểm mạnh của I²C chính là hiệu suất và sự đơn giản của nó: Một khối điều khiển trung tâm có thể điều khiển cả một mạng thiết bị mà chỉ cần hai lối ra điều khiển.
Hình 2.18: Giao tiếp I2C giữa Master và Slave
Ngoài ra I2C còn có chế độ 10bit địa chỉ tương đương với 1024 địa chỉ, tương tự như 7 bit, chỉ có 1008 thiết bị có thể kết nối, còn lại 16 địa chỉ sẽ dùng để sử dụng mục đích riêng.
Mỗi thiết bị có 1 địa chỉ được cài sẵn hoặc 1 địa chỉ thiết bị duy nhất để thiết bị chủ (Master) có thể giao tiếp. 2 chân SDA VÀ SCL là 2 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 đó là do thiết bị chủ (Master). Chân còn lại là chân SDA là chân truyền dữ liệu (DATA). 2 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, tức là nối +5V => điện trở => 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ở là từ 2K cho tốc độ vào khoảng 400 kbps, và 10K cho tốc độ thấp hơn khoảng 100 kbps.