Giải Pháp  IoT Internet of Things
 
Lý thuyết về I2C – Một chuẩn giao tiếp Serial.
17:23 | 03/05/2016

Giới thiệu

Bài viết này mô tả về giao thức truyền nhận Inter-integrated Circuit (I2C), các ứng dụng của I2C, và cách triển khai sử dụng giao thức I2C.

I2C là một giao thức kiểu Multi-Master và Multi-Slave được tích hợp sẵn trong các IC để tiện việc giao tiếp. Tương tự như SPI, giao thức I2C chỉ phù hợp cho giao tiếp khoảng cách ngắn, và giao tiếp với 1 thiết bị tại một thời điểm. I2C chỉ dùng 2 dây (clock và data) để truyền nhận dữ liệu.

Thế mạnh của I2C

Để tìm hiểu tại sao bạn dùng I2C, trước tiên bạn phải so sánh I2C với các giao thức khác để xem nó khác nhau như thế nào.

Khuyết điểm của UART

 

UART model
UART model
Vì UART sử dụng cách giao tiếp serial bất đồng bộ(không có xung clock). Các thiết bị kết nối phải “thoả thuận” trước tốc độ truyền nhận. Hai thiết bị này cũng cần phải có xung clock gần giống nhau, nếu không dữ liệu sẽ bị “cắt xén” trong lúc truyền nhận.

 

Việc truyền nhận bất đồng bộ yêu cầu phần cứng UART khá phức tạp ở hai device và cả việc viết phần mềm để chạy cho chính xác cũng là vấn đề phức tạp. Từng frame data(8 bits) truyền nhận, UART tốn thêm 2 bits, một cho start và một cho end. Tổng cộng là 10 bits. Xét về hiệu xuất, nó đã lãng phí ít nhất là 20% băng thông.

Một vấn đề khác ở UART là việc xung đột bus khi có nhiều hơn 2 devices nối vào. Về lý thuyết, chúng ta có thể nối nhiều hơn 2 device vào UART bus, tuy nhiên nếu không cẩn thận, các thiết bị này có thể gây hư hỏng lẩn nhau trên các chân Clock và Data.

Cuối cùng là vấn đề về tốc độ truyền nhận. Về lý thuyết, UART không có giới hạn về tốc độ, tuy nhiên hầu hết các thiết bị UART chỉ hỗ trợ một số các baud-rate cố định, tốc độ cao nhất thường là 230,400 bps.

Khuyết điểm của SPI

 

SPI Model
SPI Model
Khuyết điểm đầu tiên của SPI là cần ít nhất 4 dây cho truyền nhận. Và trên mỗi Slave, lại có thêm một tín hiệu SS (Slave Selected) để Master chọn Slave mong muốn. Việc cần nhiều dây là một bất lợi trong việc thiết kế một hệ thống nhỏ gọn.
Thứ hai, SPI chỉ có một Master nên chỉ không phù hợp với kiểu kết nối phân tán độc lập mà ở đó, từng device có thể chủ động liên lạc với nhau.

 

I2C loại bỏ 2 khuyết điểm của UART và SPI

 

I2C model
I2C model
I2C chỉ cần 2 dây, 1 cho clock và 1 cho data. I2C có thể hỗ trợ lên đến 1008 Slave. Hơn nữa, I2C còn hỗ trợ multi-Master. Đây là điểm mạnh của I2C đối với SPI và UART. Về tốc độ truyền nhận, I2C nhanh hơn UART nhưng chậm hơn SPI. Đây là điểm cân bằng của I2C. Các thiết bị I2C có thể giao tiếp ở 100kHz hoặc 400kHz. Mỗi frame data, I2C chỉ tốn thêm 1 bit (ACK/NACK), ít hơn 1 bit so với UART.

 

Phần cứng của I2C

Tín hiệu

Mỗi I2C bus có hai tín hiệu: SCL và SDA. SCL là tín hiệu xung clock, và SDA là tín hiệu dữ liệu. Xung Clock được tạo ra bởi Master hiện đang giữ bus. Một số Slave có thể kéo SCL xuống thấp để delay việc truyền nhận dữ liệu (hoặc để yêu cầu thêm thời gian để chuẩn bị dữ liệu trước khi Master đọc). Hoạt động này được gọi là “clock stretching”(câu giờ).

Các chân clock và data trên từng device là dạng “open-drain” (một transistor nối mass), nghĩa là nó có thể được kéo xuống mức thấp, chứ không thể lái lên mức cao. Vì thế sẽ không gây tranh chấp bus khi có một thiế bị đang cố “kéo lên” mà một thiết bị khác lại muốn kéo xuống mức thấp. Điều này đã loại bỏ khả năng gây hư hại lẩn nhau giữa các thiết bị kết nối vào I2C. Mỗi chân tín hiệu có một điện trở kéo lên (Pull-up resistor) để kéo signal lên mức cao khi không có device nào kéo nó chân signal đó xuống thấp.

sơ đồ mạch của hệ thống I2C
sơ đồ mạch của hệ thống I2C

Chú ý hai điện trở kéo lên trên hai đường truyền.
Việc lựa chọn pull-up resitor tuỳ thuộc vào khoảng cách truyền nhận. Tuy nhiên, trong khoảng cách thông thường giữa các board (không quá 1m), 4.7KOhm là lựa chọn tốt nhất. Khoảng cách càng xa, điện trở pull-up có giá trị càng nhỏ.

Mức tín hiệu

Vì các device không thực sự kéo tín hiệu lên mức cao, I2C cho phép linh hoạt trong việc kết nối các thiết bị với mức điện áp Input/Output khác nhau. Trong một hệ thống mà một device có điện áp cao hơn một số device khác, chúng ta có thể kết nối hai thiết bị thông qua I2C mà không cần bất kỳ mạch chuyển điện áp. Đơn giản là để kết nối các điện trở kéo lên để giảm áp cho thiết bị có điện áp In/Out nhỏ. Thường thì cách làm này áp dụng cho điện áp sai khác không nhiều (ví dụ như 3.3V và 5V). Nếu khác biệt điện áp lớn hơn, chúng ta vẫn cần mạch chuyển điện áp khi nối vào hệ thống để tránh hư hại thiết bị (ví dụ giữa 5V với 2.5V).

Protocol

Việc truyền nhận dùng I2C phức tạp hơn so với UART hoặc SPI. Các tín hiệu phải tuân theo một giao thức nhất định cho các thiết bị trên bus. Tuy nhiên, hầu hết các device đều có sẵn driver thực hiện công việc đó cho bạn.

Khái niệm cơ bản

I2C với 7 bit địa chỉ
I2C với 7 bit địa chỉ

Message được chia thành hai loại frame: address frame, nơi các thầy chỉ ra các nô lệ để mà thông điệp được gửi đi, và data frame, đó là một message 8-bit dữ liệu được truyền từ Master đến Slave hoặc ngược lại. Dữ liệu được truyền trên SDA sau khi đường SCL kéo xuống thấp, và được lấy mẫu sau khi đường SCL lên mức cao. Thời gian giữa clock edge và việc đọc/ghi dữ liệu được xác định bởi các device gắn vào bus.

Start Condition

Để bắt đầu truyền address frame, Master sẽ để SCL ở mức cao và kéo SDA xuống thấp. Điều này nhầm thống báo các Slave rằng có một truyền nhận sắp bắt đầu. Nếu hai Master muốn nắm quyền sở hữu bus tại cùng thời điểm, Master nào kéo SDA thấp trước sẽ giành được quyền truyền nhận trên bus.

Address Frame

Address frame luông được truyền đầu tiên trong mỗi transaction. MSB bit sẽ được truyền đầu tiên, tiếp theo là bit Read/Write, ‘1’ là Read, ‘0’ là Write. Bit thứ 9 của frame là bit NACK/ACK. Cả Address frame và Data frame đều có bit ACK/NACK này. Khi 8 bit đầu tiên của frame được gửi đi, các Slave nhận được trao quyền kiểm soát SDA. Nếu Slave nhận không kéo đường SDA xuống thấp trước khi xung clock thứ 9, có thể suy ra rằng Slave nhận hoặc không nhận được dữ liệu hoặc không biết làm thế nào để phân tích các message. Trong trường hợp đó, việc trao đổi sẽ ngừng, và Master sẽ quyết định nên làm gì kế theo.

Data Frame

Sau khi Address frame được gửi đi thành công, data có thể bắt đầu truyền đi. Các Master chỉ đơn giản là tiếp tục tạo ra xung clock, và dữ liệu sẽ được đặt trên SDA bởi Slave(cho việc Read), hoặc bới Master đó(cho việc Write). Số lượng các khung dữ liệu là tùy ý, Slave sẽ tự đếm số frame nó nhận được.

Stop Condition

Một khi tất cả các Data frame đã được gửi đi, Master sẽ tạo ra một điều kiện dừng. Điều kiện dừng được quy định bởi một sự chuyển tiếp 0-> 1 (thấp đến cao) trên SDA sau một quá trình chuyển đổi 0-> 1 trên SCL, khi SCL còn ở mức cao. Trong thời gian hoạt động bình thường ghi dữ liệu, giá trị trên SDA không nên thay đổi khi SCL còn ở cao, để tránh nhầm lẫn với điều kiện dừng.

I2C model
I2C model
 
Ý kiến phản hồi và bình luận Góp ý kiến của bạn

Các tin mới nhất :
- Hướng dẫn điều khiển động cơ Servo bằng Raspberry Pi
- Lý thuyết về I2C – Một chuẩn giao tiếp Serial.
Các tin liên quan :
Bài nhiều người đọc cùng chuyên mục
Hướng dẫn điều khiển động cơ Servo bằng Raspberry Pi
 
Trang chủ | Giới thiệu | Quảng cáo | Liên hệ
Giấy phép ICP số 199/GP-TTĐT. Bộ Thông tin và Truyền thông cấp.
Cơ quan quản lý  : Công Ty Cổ Phần Kênh Giải Pháp
Bản quyền © 2010-2011 Kenhgiaiphap.vn . Giữ toàn quyền.
Ghi rõ nguồn "Kenhgiaiphap.vn" khi phát hành lại thông tin từ website này.

return false; });