3.23. Kiến thức cơ bản về I2C¶
I2C (Inter-Integrated Circuit, đọc là "I-squared-C" hoặc "I-two-C") là một bus nối tiếp hai dây được thiết kế cho các kết nối tầm ngắn giữa các chip trên cùng một bo mạch. Nó nằm giữa SPI và UART về ưu tiên: chậm hơn SPI nhưng tiết kiệm chân hơn, và có địa chỉ (nhiều thiết bị trên cùng hai dây) trong khi SPI cần một đường CS riêng cho mỗi thiết bị.
I2C là bus được lựa chọn cho các cảm biến tốc độ thấp -- gia tốc kế, cảm biến nhiệt độ, cảm biến độ ẩm, từ kế, đồng hồ thời gian thực, EEPROM -- khi việc tiết kiệm chân và độ phức tạp của bus quan trọng hơn thông lượng thuần túy.
3.23.1. Hai dây, cả hai đều open-drain¶
Bus I2C chỉ có hai tín hiệu:
SCL (đồng hồ nối tiếp). Được lái bởi bộ điều khiển (hầu hết thời gian).
SDA (dữ liệu nối tiếp). Được lái bởi thiết bị nào đang truyền ngay lúc đó -- bộ điều khiển trong quá trình địa chỉ và dữ liệu gửi đi, ngoại vi trong quá trình đọc và bit ACK.
Cả hai đường đều open-drain: mọi thiết bị trên bus đều có thể kéo đường xuống đất nhưng không bao giờ lái nó lên cao. Hai điện trở kéo lên trên bus (thường 2.2 kΩ đến 10 kΩ về thanh cấp nguồn) kéo các đường lên cao khi không ai đang kéo chúng xuống thấp. Hành vi wired-OR xuất phát từ điều này -- bất kỳ thiết bị nào kéo đường xuống thấp đều thắng, và trạng thái cao chỉ là "không ai đang nói".
Các điện trở kéo lên nội bộ của MCU trên các chân SCL và SDA của nó thường không đủ mạnh để hoạt động như các điện trở kéo lên trên bus; thường cần điện trở ngoài trên bus. Nhiều bo mạch breakout cảm biến đã bao gồm chúng; kiểm tra datasheet trước khi thêm.
3.23.2. Giao dịch¶
Mỗi giao dịch I2C đều theo cùng một hình thức:
Một giao dịch I2C: START, địa chỉ 7 bit + R/W, ACK, thanh ghi, ACK, dữ liệu, NACK, STOP.¶
Quá trình trao đổi diễn ra từng bit một:
START. Bộ điều khiển kéo SDA xuống thấp trong khi SCL vẫn cao. Cạnh bất thường này báo cho mọi thiết bị trên bus rằng một giao dịch sắp bắt đầu.
Địa chỉ + R/W. Bộ điều khiển đồng hồ ra một địa chỉ ngoại vi 7 bit theo sau bởi một bit đọc/ghi (
0để ghi,1để đọc).ACK / NACK. Sau mỗi byte, bên nhận lái SDA trong một đồng hồ để ACK (thấp) hoặc NACK (cao). Trên byte địa chỉ, ngoại vi ACK nếu nó nhận ra địa chỉ của mình; nếu không có thiết bị nào ACK, bộ điều khiển thấy NACK và biết địa chỉ đó không có trên bus.
Byte dữ liệu. Mỗi byte theo sau bởi ACK từ bên nhận. Khi ghi, ngoại vi ACK mỗi byte; khi đọc, bộ điều khiển ACK mỗi byte mà nó muốn nhận thêm và NACK byte cuối cùng để báo ngoại vi dừng lại.
STOP. Bộ điều khiển giải phóng SDA lên cao trong khi SCL cao, kết thúc giao dịch.
Repeated start là một START thứ hai được phát ra mà không có STOP ở giữa -- bộ điều khiển chuyển hướng (địa chỉ ghi, sau đó địa chỉ đọc) trên cùng một ngoại vi mà không giải phóng bus.
3.23.3. Đánh địa chỉ¶
Không gian địa chỉ 7 bit bao gồm 0x08 -- 0x77; các giá trị ở hai đầu được dành riêng cho các mục đích đặc biệt. Địa chỉ của mỗi thiết bị được đặt bởi nhà thiết kế chip; nhiều linh kiện cho phép thay đổi một vài bit thấp ở cấp độ bo mạch (bằng cách nối chân lên cao hoặc xuống thấp) để hai cảm biến giống nhau có thể ngồi trên cùng một bus.
Nếu hai thiết bị có cùng địa chỉ thì không có cách nào giao tiếp với một trong số chúng mà không bị cái kia gây nhiễu, vì vậy hãy kiểm tra datasheet trước khi ghép nối linh kiện. i2c.scan() (được đề cập trong I2C trong code) duyệt qua không gian địa chỉ và báo cáo những địa chỉ nào phản hồi, đây là cách tiêu chuẩn để tìm hiểu những gì có trên bus.
3.23.4. Điểm mạnh và điểm yếu¶
Điểm mạnh và điểm yếu của bus xác định vị trí thích hợp của nó:
Hai chân cho nhiều thiết bị. Một cặp SCL/SDA đơn có thể kết nối hàng chục cảm biến. SPI sẽ cần thêm một chân CS cho mỗi thiết bị.
Tốc độ chuẩn.
100 kHz("chế độ chuẩn") và400 kHz("chế độ nhanh") bao phủ hầu hết mọi cảm biến.1 MHzcó thể đạt được nhưng bắt đầu đặt nhiều yêu cầu hơn về điện dung bus và kích thước điện trở kéo lên.Chậm so với SPI. Bất cứ thứ gì di chuyển nhiều hơn vài trăm kilobit mỗi giây đều nên dùng SPI.
Xung đột địa chỉ. Hai thiết bị có cùng địa chỉ trên một bus là lỗi phần cứng mà giao thức không thể giải quyết.