Master: Thiết bị điều khiển trung tâm, đưa ra các yêu cầu tới Slave
Slave: Ngoại vi, đáp ứng các yêu cầu Slave

Trong 1 hệ thống bus I2C, một hoặc nhiều Master truyền, nhận dữ liệu với một hoặc nhiều Slave thông qua 2 dây:
- SCL: Clock, được điều khiển bởi Master
- SDA: truyền nhận dữ liệu
Cần điện trở kéo lên (khoảng 1kΩ - 4.7kΩ) cho SDA và SCL, để đẩm bảo luôn ở mức HIGH.
Tại 1 thời điểm, chỉ có 1 master hoạt động.
Data: 1 hoặc nhiều byte
ACK: giá trị LOW, Slave xác nhận rằng mình nhận được 1 loại dữ liệu mà Master gửi
NACK: giá trị HIGH, được gửi đi trong trường hợp:
- Phía nhận bận, không thể nhận hay truyền dữ liệu vì đang thực hiện tính năng khác
- Dữ liệu/địa chỉ không hợp lệ, không tồn tại
- Phía nhận không thể nhận thêm các byte dữ liệu nữa
- Master nhận đủ và không nhận thêm dữ liệu

Tín hiệu START: SCL = 1 và SDA chuyển từ 1 về 0
Tín hiệu STOP: SCL = 1 và SDA chuyển từ 0 lên 1
Trường hợp 1: Master gửi dữ liệu cho Slave

Hình 2: Khung truyền SDA khi Master gửi dữ liệu cho Slave
Gửi dữ liệu: Read = 0, Write = 1
- ACK(1): Slave (có địa chỉ là địa chỉ master vừa gửi) xác nhận rằng mình rảnh.
- ACK(2): Slave xác nhận mình có địa chỉ thanh ghi này (địa chỉ thanh ghi mà Master vừa gửi), Slave sẵn sàng nhận dữ liệu
- ACK(3): Slave xác nhận nhận dữ liệu thành công
Trường hợp 2: Master nhận dữ liệu từ Slave

Hình 3. Khung truyền SDA khi Master nhận dữ liệu từ Slave
Nhận dữ liệu: Read = 1, Write = 0
Bắt đầu
Master gửi địa chỉ của Slave đến Slave cần đọc (chỉ định Slave mà Master muốn đọc)
Master cần gửi địa chỉ thanh ghi trong Slave đến Slave (để biết Master cần đọc địa chỉ thanh ghi nào trong Slave)
Bắt đầu lại
Master gửi địa chỉ của Slave
Slave gửi dữ liệu: 1 hoặc nhiều byte