I²C

I²C (viết tắt của từ tiếng Anh "Inter-Integrated Circuit", phát âm tiếng Anh I-two-C, hoặc cũng có thể viết là IIC) 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. Truyền thông với bus I²C là quá trình truyền thông đồng bộ nối tiếp, hỗ trợ nhiều master và slave trên đường truyền. I²C 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. SMBus (System Management Bus), là một "chuẩn con" của I²C, được giới thiệu bởi Intel vào năm 1995, với đặc tính sử dụng nghiêm ngặt hơn. SMBus nổi bật bởi tính ổn định và độ tương thích cao. Do đó, các hệ thống I²C ngày nay đã sử dụng một số chính sách và nguyên tắc của SMBus, và đôi khi hỗ trợ cả I²C và SMBus, thông qua việc sử dụng câu lệnh (command) hoặc thay đổi kết nối các chân linh kiện. Bus I²C được phát triển vào những năm 1980. Ban đầu, loại bus này chỉ được dùng trong các linh 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 module truyền thông nối tiếp của vi mạch tích hợp ngày nay. Từ ngày 10 tháng 10 năm 2006, việc triển khai giao thức I²C trong quá trình sản xuất, thương mại sẽ không bị tính phí. Tuy nhiên, việc sở hữu địa chỉ I²C cho các thiết bị slave cung cấp bởi NXP sẽ bị tính phí. Các đối thủ cạnh tranh của NXP như Siemens AG (sau này là Infineon Technologies AG, và hiện tại là Intel mobile communications), NEC, Texas Instruments, STMicroelectronics (trước đó là SGS-Thomson), Motorola (sau này là Freescale, hiện tại đã sáp nhập vào NXP), Nordic Semiconductor và Intersil, đã giới thiệu các sản phẩm tích hợp bus I²C từ giữa những năm 1990. Các thiết bị tương thích với bus I²C đều tích hợp một giao diện trên chip (on-chip interface) cho phép các thiết bị đó giao tiếp với nhau thông qua bus I²C. Các tính năng của một bus I²C: Chỉ sử dụng hai đường bus: SDA (serial data line, tạm dịch: đường truyền dữ liệu nối tiếp) và SCL (serial clock line, tạm dịch: đường xung nhịp nối tiếp). Hoạt động theo cơ chế master-slave với cả master và slave đều có thể truyền-nhận dữ liệu. Hỗ trợ nhiều master với cơ chế phát hiện va chạm trên đường truyền (collision detection) và phân xử (arbitration) khi có va chạm tín hiệu để ngăn ngừa mất dữ liệu nếu hai hoặc nhiều master truyền tín hiệu cùng lúc. Mỗi thiết bị kết nối vào bus được định một địa chỉ duy nhất bằng phần mềm. Quá trình truyền dữ liệu nối tiếp hai chiều 8-bit có định hướng có thể đạt tốc độ lên đến 100 kbit/giây với Standard-mode (tạm dịch: chế độ tiêu chuẩn), 400 kbit/giây với Fast-mode (tạm dịch: chế độ nhanh), 1 Mbit/giây với Fast-mode Plus (Fm+) hoặc đến 3.4 Mbit/s với High-speed mode. Ultra Fast-mode là chế độ chỉ truyền đơn hướng với tốc độ có thể lên đến 5Mbit/giây. Lọc nhiễu các xung nhọn trên đường bus để đảm bảo tính toàn vẹn dữ liệu. Số lượng IC tối đa có thể kết nối được trên I²C bus chỉ phụ thuộc vào sức chứa tối đa của bus. I²C sử dụng 2 đường dây 2 chiều là SCL và SDA với cực thu hở và cực máng hở, 2 dây này 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,7 kΩ. Khi bus ở trạng thái rảnh (free), cả 2 dây SDA và SCL đều ở mức logic cao. Không gian địa chỉ (7-bit hoặc 10-bit địa chỉ) và thông số điện dung của bus sẽ giới hạn số lượng thiết bị hoặc node có thể kết nối vào bus. Bus I²C sử dụng 7 bit để định địa chỉ. Các node trên bus sẽ đóng 2 vai trò là master hoặc slave: Master node: node phát xung clock và khởi tạo giao tiếp với slave. Slave node: node nhận xung clock và phản hồi khi được định địa chỉ bởi master. Có 4 chế độ hoạt động cho một thiết bị trên bus I²C, bao gồm: master transmit: Node master đang gởi dữ liệu đến slave master receive: Node master đang nhận dữ liệu từ slave slave transmit: Node slave đang gởi dữ liệu đến master slave receive: Node slave đang nhận dữ liệu từ master Bus I²C có thể là một bus có nhiều master (multi-master bus). Tức là có thể có nhiều hơn một thiết bị có thể điều khiển các thiết bị khác kết nối vào bus I²C đó. Về hoạt động tổng quan giữa master và slave, xét 2 ví dụ sau: Với hình minh họa, xét trường hợp vi điều khiển master (µC Master trên hình) muốn gởi thông tin đến vi điều khiển slave (µC Slave) trên hình, toàn bộ quá trình diễn ra như sau: µC Master định địa chỉ (address) µC Slave µC Master (khi đó là master-transmitter) sẽ gởi dữ liệu đến µC Slave (khi đó là slave-receiver) µC Master hủy quá trình truyền Với hình minh họa, xét trường hợp vi điều khiển master (µC Master trên hình) muốn nhận thông tin từ vi điều khiển slave (µC Slave) trên hình, toàn bộ quá trình diễn ra như sau: µC Master định địa chỉ (address) µC Slave µC Master (khi đó là master-receiver) nhận dữ liệu từ µC Slave (khi đó là slave-transmitter) µC Master hủy quá trình truyền Tần số xung nhịp đồng hồ có thể xuống 0 Hz. Trên một bus I²C có thể định địa chỉ tới 112 nút, 16 địa chỉ còn lại được sử dụng vào mục đích riêng. Hệ điều hành AmigaOS hỗ trợ component i2c.resource cho AmigaOS 4.x và MorphOS 3.x hoặc shared library i2c.library (phát triển bởi Wilhelm Noeker) cho các hệ thống cũ hơn. Nền tảng Arduino với thư viện Wire Maximite hỗ trợ giao tiếp I2C trong thành phần của MMBasic. TWI (Two-Wire Interface) hoặc TWSI (Two-Wire Serial Interface) về cơ bản là một dạng I²C bus triển khai trên các bộ xử lý system-on-chip của Atmel và các nhà phân phối khác. Trên thực tế, bus I²C ngày nay đã trở thành một tiêu chuẩn thế giới được triển khai trong hơn 1000 loại IC khác nhau bởi hơn 50 nhà sản xuất IC. Các bus I²C đa tính năng được dùng trong nhiều kiến trúc điều khiển, như SMBus (System Management Bus), PMBus (Power Management Bus), IPMI (Intelligent Platform Management Interface), DDC (Display Data Channel) và ATCA (Advanced Telecom Computing Architecture). Một điểm mạnh khác của I²C nằm ở khả năng vi điều khiển có thể điều khiển được một mạng lưới các thiết bị khác mà chỉ thông qua 2 chân của vi điều khiển. Với một số công nghệ bus nối tiếp khác cho cùng yêu cầu này, như SPI, thì việc điều khiển sẽ yêu cầu nhiều chân kết nối và dây tín hiệu hơn để kết nối nhiều thiết bị. SMBus NXP (2014). I²C-bus specification and user manual, Rev. 6 - 4 April 2014 (PDF). NXP. Bản gốc (PDF) lưu trữ ngày 26 tháng 4 năm 2021. Truy cập ngày 14 tháng 2 năm 2021. ^ a b c d NXP 2014, tr. 1, "Abstract". ^ “I2C – What's That?”. Truy cập ngày 14 tháng 2 năm 2021. ^ “"I²C Licensing Information"” (PDF). 10 tháng 1 năm 2017. Bản gốc (PDF) lưu trữ ngày 10 tháng 1 năm 2017. Truy cập ngày 14 tháng 2 năm 2021. ^ NXP 2014, tr. 3, "2. I2C-bus features". ^ NXP 2014, tr. 3-4, "2. I2C-bus features". ^ a b c NXP 2014, tr. 8, "3.1.1 SDA and SCL signals" ^ a b c d NXP 2014, tr. 6, "3. The I2C-bus protocol": In addition to transmitters and receivers, devices can also be considered as masters or slaves when performing data transfers ^ a b NXP 2014, tr. 7 ^ “i2c.resource for Sam440ep and Sam460ex boards”. OS4Depot. Bản gốc lưu trữ ngày 24 tháng 7 năm 2011. Truy cập ngày 27 tháng 5 năm 2021. ^ “How I2C Communication Works and How To Use It with Arduino”. ^ “avr-libc: Example using the two-wire interface (TWI)”. nongnu.org. Truy cập ngày 27 tháng 5 năm 2021. ^ a b NXP 2014, tr. 3, "1. Introduction".