Bus I2C ban đầu thực chất được phát triển như một bus multi-master (nhiều chủ). Có nghĩa là có hơn 1 thiết bị có thể chủđộng trong hệ thống.
Nếu ta chỉ dùng 1 master thì trên bus thực sự không có sự xung đột dữ liệu.Tuy nhiên nếu có từ 2 master trở lên như hình 3.4.
Hình 3.3. Khung truyền dữ liệu I2C.
Chương 3. Thu thập số liệu thực nghiệm và xử lý số liệu
-18- http://www.ebook.edu.vn
Khi Master 1 phát ra tín hiệu bắt đầu (Start condition) và gửi 1 địa chỉ, tất cả Slave
đều lắng nghe, bao gồm cả CPU 2 ngay thời gian này cũng được xem như là 1 slave.Nếu
địa chỉ không khớp với địa chỉ của CPU2, CPU2 sẽ phải dừng mọi hoạt động của nó trên bus cho tới khi bus trở lại trạng thái IDLE sau điều kiện Stop của CPU1.
Miễn là 2 CPU (hay là Pic) quan sát được tình trạng của bus (start và stop) thì không có rắc rối nào xảy ra.Tuy nhiên giả sử rằng một con Pic không quan sát được điều kiện Start và nghĩ rằng bus đang IDLE (tức là rãnh), hay là nó nghĩ bus mới Reset thì nó sẽ
gửi tín hiệu lên bus, từđó sẽ gây ra rắc rối.
Phát hiện bus bận:
Tính chất vật lý của bus I2C đã hỗ trợ ta điều này. Bởi vì cấu trúc của bus là một bus nối các thiết bị nối tiếp lại với nhau (giống kiểu And), chúng ta có thể kiểm tra bus như
sau: nếu có 1 thiết bị nào đó kéo bus xuống mức thấp LOW thì nó sẽở mức thấp LOW. Khi một Master thay đổi trạng thái của dây lên cao HIGH, nó phải luôn kiểm tra là
đường dây đã lên HIGH. Nếu đường dây vẫn ở mức thấp như vậy sự tranh chấp đã xảy ra và chỉ ra rằng có 1 thiết bị nào đó đã kéo đường dẩy xuống LOW.
Do đó luật chung để nhận biết là: Nếu một master không thể đưa một đường dây lên mức HIGH tức là nó mất quyền kiểm soát, nó phải lặp chờ cho tới khi có điều kiện stop xảy ra trên bus thì nó mới được truyền dữ liệu.