Tất tần tật về giao thức I2C bạn cần biết
Ở các bài viết trước, mình đã giới thiệu đến bạn giao thức SPI và UART. Trong bài này, cùng tìm hiểu về giao thức I2C nhé!
Giao thức I2C là gì?
I2C (Inter-Integrated Circuit) là một giao thức đồng bộ nối tiếp để các thiết bị có thể liên lạc với nhau. Giao thức này được phát triển vào năm 1982 bởi Philips Semiconductor. Giao thức I2C được dùng phổ biến để liên lạc ở khoảng cách gần thông qua 2 đường truyền tín hiệu (Two Wired Interface – TWI).
Cụ thể gồm 2 dây sau:
- SDA (Serial Data): Đường dây để trao đổi dữ liệu giữa các tín hiệu
- SCL (Serial Clock): Đường dây để truyền các tín hiệu đồng hồ
Là một giao thức truyền thông nối tiếp, nên I2C sẽ truyền từng bit dữ liệu dọc theo đường dây SDA. Ngoài ra, tương tự như SPI, giao thức I2C có đầu ra dữ liệu bit được đồng bộ với việc lấy dữ liệu bằng tín hiệu đồng hồ được chia sẻ giữa Master và Slave. Thiết bị Master có vai trò điều khiển tín hiệu đồng hồ này.
Số dây | 2 |
Tốc độ tối đa | Chế độ tiêu chuẩn: 100 kbps |
Chế độ nhanh: 400 kbps | |
Chế độ cực nhanh: 3,4 Mpps | |
Ultra fast: 5 mbos | |
Đồng bộ hay không? | Đồng bộ |
Serial hay Parallel? | Serial |
Số lượng thiết bị Master tối đa | Không giới hạn |
Số lượng thiết bị Slave tối đa | 1008 |
Có thể nói, I2C là sự kết hợp hoàn hảo giữa SPI và UART. Với I2C, bạn có thể kết nối nhiều thiết bị Slave với một máy chủ Master duy nhất (giống giao thức SPI), nhưng bạn cũng có thể kết nối nhiều máy chủ Master với một hoặc nhiều Slave tùy thích để điều khiển. Theo mình thấy thì tính năng này cực kỳ hữu ích, đặc biệt là trong các trường hợp như cần dùng nhiều bộ vi điều khiển khác nhau để ghi dữ liệu vào một thẻ nhớ lưu trữ hoặc hiển thị văn bản trên một màn hình LCD.
Cách hoạt động của giao thức I2C
Với I2C, dữ liệu được truyền qua lại dưới dạng tin nhắn. Các tin nhắn này được chia thành các khung dữ liệu.
Mỗi một tin nhắn sẽ có các địa chỉ khung dữ liệu riêng, trong đó bao gồm:
- Khung dữ liệu chứa địa chỉ nhị phân của thiết bị Slave
- Khung dữ liệu chứa các thông tin dữ liệu được truyền tải
Các tin nhắn cũng bao gồm các điều kiện bắt đầu hoặc dừng, đọc hoặc viết dữ liệu bits cũng như các khung dữ liệu bits ACK/NACK:
Cụ thể:
- Điều kiện bắt đầu: Đường dây SDA chuyển mức điện áp từ cao thành thấp, trước khi đường dây SCL chuyển từ mức cao xuống thấp
- Điều kiện kết thúc: Đường dây SDA chuyển mức điện áp từ thấp thành cao, sau khi đường dây SCL chuyển từ mức thấp lên cao
- Khung địa chỉ: Gồm một chuỗi 7 hoặc 10 bit duy nhất cho mỗi thiết bị Slave, các máy chủ Master sẽ dựa vào đây để xác định thiết bị mà mình cần giao tiếp
- Bit đọc / ghi: Một bit đơn để hệ thống biết rằng Master đang gửi dữ liệu đến Slave (mức điện áp thấp) hay là Master cần nhận dữ liệu từ Slave (mức điện áp cao)
- Bit ACK / NACK: Một một khung dữ liệu bên trong tin nhắn đều được theo dõi bới các bit Acknowledge / No-Acknowledge này. Nếu địa chỉ khung hoặc khung dữ liệu được gửi thành công, bit ACK sẽ được gửi trả về cho người gửi từ thiết bị nhận
Địa chỉ của I2C
Giao thức I2C không có các dòng để chọn thiết bị Slave như giao thức SPI, nên chúng sẽ sử dụng một cách khác để thiết bị Slave biết rằng Master đang gửi dữ liệu đến nó chứ không phải gửi cho Slave nào khác. Đó là lý do cần phải có địa chỉ I2C. Khung địa chỉ luôn là khung đầu tiên sau bit bắt đầu của một tin nhắn mới.
Master sẽ gửi địa chỉ của thiết bị Slave mà nó muốn kết nối đến toàn bộ các Slave. Sau đó, mỗi Slave sẽ so sánh địa chỉ của mình với địa chỉ mà Master gửi đến. Lúc này sẽ có 2 trường hợp:
- Nếu địa chỉ trùng khớp: Slave đó sẽ gửi bit ACK với mức điện áp thấp trở lại cho Master
- Nếu địa chỉ khác nhau: Slave sẽ không làm gì cả. Lúc này, điện áp của đường SDA vẫn là cao
Bit đọc / ghi
Trong khung địa chỉ sẽ bao gồm một bit duy nhất nằm ở cuối cùng, nhằm thông báo cho Slave biết rằng Master đang muốn ghi dữ liệu vào nó hay là muốn nhận dữ liệu từ nó:
- Nếu Master muốn gửi dữ liệu tới Slave: Bit đọc / ghi có mức điện áp thấp
- Nếu Master muốn nhận dữ liệu từ Slave: Bit đọc / ghi có mức điện áp cao
Khung dữ liệu
Khi Master nhận được bit ACK từ Slave, hệ thống sẽ gửi khung dữ liệu đầu tiên đi.
Khung dữ liệu này luôn dài 8 bit, trong đó các bit quan trọng được đặt ở phần đầu. Mỗi một khung dữ liệu đều được đặt đằng sau bit ACK/NACK để xác nhận là khung đã được gửi và nhận thành công chưa. Bit ACK này phải được nhận bởi một Master hoặc Slave tùy theo từng trường hợp, thì khung dữ liệu khác mới được gửi đi.
Sau khi đã gửi đi tất cả các khung dữ liệu, Master có thể gửi điều kiện kết thúc tới Slave để ngừng quá trình truyền dữ liệu, thông qua việc chuyển điện áp từ mức thấp lên mức cao trên SCL và sau đó là trên đường dây SDA.
Các bước truyền dữ liệu trong I2C
Dưới đây là cách truyền tải dữ liệu trong giao tiếp I2C:
- Master gửi điều kiện bắt đầu đến tất cả các thiết bị Slave bằng cách đổi điện áp của đường dây SDA từ mức cao sang mức thấp, trước khi chuyển dây SCL từ cao thành thấp:
- Master gửi địa chỉ của Slave (ở dạng 7bit hoặc 10bit) mà nó muốn liên lạc cùng với bit đọc / ghi cho tất cả các thiết bị Slave
- Mỗi Slave so sánh địa chỉ của mình với địa chỉ được Master gửi đến. Nếu trùng khớp địa chỉ thì Slave sẽ gửi trả bit ACK về, thôn qua việc kéo dây SDA từ mức cao xuống mức thấp 1 bit. Nếu khác địa chỉ thì Slave không làm gì cả
- Master gửi hoặc nhận khung dữ liệu:
- Khi đã gửi khung dữ liệu thành công, các thiết bị nhận dữ liệu sẽ gửi trả một bit ACK cho thiết bị gửi để xác nhận rằng quá trình gửi nhận khung dữ liệu đã thành công:
- Master dừng quá trình truyền dữ liệu bằng cách chuyển dây SCL lên mức cao, trước khi chuyển dây SDA từ thấp lên cao:
Ưu nhược điểm của giao tiếp I2C
Cũng như các giao thức khác, giao tiếp I2C cũng có các ưu nhược điểm riêng, khiến chúng có thể phù hợp với thiết bị này nhưng lại không phù hợp với các thiết bị khác.
Cùng tìm hiểu về ưu nhược điểm của I2C là gì để bạn có thể đưa ra lựa chọn phù hợp hơn cho dự án của mình nhé:
Ưu điểm:
- Chỉ sử dụng 2 dây đường truyền
- Hỗ trợ tốt cho các dự án có mô hình nhiều máy chủ Master và nhiều Slave
- Có bit ACK / NACK để xác nhận rằng khung dữ liệu đã được truyền thành công hay chưa
- Có cấu trúc phần cứng đơn giản hơn so với giao thức UART
- Giao tiếp I2C khá phổ biến và được nhiều người sử dụng rộng rãi
Nhược điểm
- Tốc độ truyền tải dữ liệu chậm hơn so với SPI
- Kích thước mỗi khung dữ liệu tối đa chỉ ở mức 8 bit
- Cấu trúc phần cứng phức tạp hơn so với SPI
Lời kết
Qua bài viết trên, hy vọng bạn đã hiểu hơn về giao thức I2C là gì, cũng như cách hoạt động và ưu nhược điểm của nó. Ngoài ra, bạn có thể tìm hiểu thêm giao thức SPI và giao thức UART để có thể lựa chọn được hình thức phù hợp với mình.
Nếu có bất kỳ thắc mắc nào, bạn có thể liên lạc với chúng tôi hoặc để lại cmt bên dưới để được hỗ trợ nhé!