Giới thiệu chung về giao tiếp I2C

I2C là tên viết tắt của cụm từ tiếng anh “Inter-Integrated Circuit”. Nó là một
giao thức giao tiếp được phát triển bởi
Philips Semiconductors
để truyền dữ liệu giữa một bộ xử lý trung tâm với nhiều
IC trên
cùng một board mạch chỉ sử dụng hai đường truyền tín hiệu.

Do tính đơn giản của nó nên loại giao thức này được sử dụng rộng
rãi cho giao tiếp giữa vi điều khiển và mảng cảm biến, các thiết bị hiển thị,
thiết bị IoT, EEPROMs, v.v …

Đây là một loại giao thức giao tiếp nối
tiếp đồng bộ. Nó có nghĩa là các bit dữ liệu được truyền từng bit một theo các
khoảng thời gian đều đặn được thiết lập bởi một tín hiệu đồng hồ tham chiếu.

Đặc trưng

Sau đây là một số đặc điểm quan trọng của giao thức giao tiếp I2C:

  • Chỉ cần có hai đường bus (dây) chung để điều khiển bất kỳ thiết bị / IC
    nào trên mạng I2C
  • Không cần thỏa thuận trước về tốc độ truyền dữ liệu như trong giao tiếp
    UART. Vì vậy, tốc độ truyền dữ liệu có thể được điều chỉnh bất cứ khi nào
    cần thiết
  • Cơ chế đơn giản để xác thực dữ liệu được truyền
  • Sử dụng hệ thống địa chỉ 7 bit để xác định một thiết bị / IC cụ thể trên
    bus I2C
  • Các mạng I2C dễ dàng mở rộng. Các thiết bị mới có thể được kết nối đơn
    giản với hai đường bus chung I2C

Phần cứng

Bus vật lý I2C

Bus I2C (dây giao tiếp) chỉ gồm hai dây và
được đặt tên là Serial Clock Line (SCL) và Serial Data Line (SDA). Dữ liệu
được truyền đi được gửi qua dây SDA và được đồng bộ với tín hiệu đồng hồ
(clock) từ SCL. Tất cả các thiết bị / IC trên mạng I2C được kết nối với cùng
đường SCL và SDA như sau:

Cả hai đường bus I2C (SDA, SCL) đều hoạt động như các bộ lái cực máng hở
(open drain). Nó có nghĩa là bất kỳ thiết bị / IC trên mạng I2C có thể lái SDA
và SCL xuống mức thấp, nhưng không thể lái chúng lên mức cao. Vì vậy, một điện
trở kéo lên (khoảng 1 kΩ đến 4,7 kΩ) được sử dụng cho mỗi đường bus, để giữ
cho chúng ở mức cao (ở điện áp dương) theo mặc định.

Lý do sử dụng
một hệ thống cực máng hở (open drain) là để không xảy ra hiện tượng ngắn mạch,
điều này có thể xảy ra khi một thiết bị cố gắng kéo đường dây lên cao và một
số thiết bị khác cố gắng kéo đường dây xuống thấp.

Thiết bị chủ (Master) và tớ (Slave)

Các thiết bị kết nối với
bus I2C được phân loại hoặc là thiết bị Chủ (Master) hoặc là thiết bị Tớ
(Slave). Ở bất cứ thời điểm nào thì chỉ có duy nhất một thiết bị Master ở
trang thái hoạt động trên bus I2C. Nó điều khiển đường tín hiệu đồng hồ SCL và
quyết định hoạt động nào sẽ được thực hiện trên đường dữ liệu SDA.

Tất
cả các thiết bị đáp ứng các hướng dẫn từ thiết bị Master này đều là Slave. Để
phân biệt giữa nhiều thiết bị Slave được kết nối với cùng một bus I2C, mỗi
thiết bị Slave được gán một địa chỉ vật lý 7-bit cố định.

Khi một
thiết bị Master muốn truyền dữ liệu đến hoặc nhận dữ liệu từ một thiết bị
Slave, nó xác định địa chỉ thiết bị Slave cụ thể này trên đường SDA và sau đó
tiến hành truyền dữ liệu. Vì vậy, giao tiếp có hiệu quả diễn ra giữa thiết bị
Master và một thiết bị Slave cụ thể.

Tất cả các thiết bị Slave khác
không phản hồi trừ khi địa chỉ của chúng được chỉ định bởi thiết bị Master
trên dòng SDA.

Giao thức truyền dữ liệu

Giao thức sau đây (tập hợp
các quy tắc) được theo sau bởi thiết bị Master và các thiết bị Slave để truyền
dữ liệu giữa chúng.

Dữ liệu được truyền giữa thiết bị Master và các
thiết bị Slave thông qua một đường dữ liệu SDA duy nhất, thông qua các chuỗi
có cấu trúc gồm các số 0 và 1 (bit). Mỗi chuỗi số 0 và 1 được gọi là giao dịch
(transaction) và dữ liệu trong mỗi giao dịch có cấu trúc như sau:

Điều kiện bắt đầu (Start Condition)

Bất cứ khi nào một
thiết bị chủ / IC quyết định bắt đầu một giao dịch, nó sẽ chuyển mạch SDA từ
mức điện áp cao xuống mức điện áp thấp trước khi đường SCL chuyển từ cao xuống
thấp.

Khi điều kiện bắt đầu được gửi bởi thiết bị Master, tất cả
các thiết bị Slave đều hoạt động ngay cả khi chúng ở chế độ ngủ (sleep mode)
và đợi bit địa chỉ.

Khối địa chỉ

Nó bao gồm 7 bit và được lấp đầy với địa chỉ
của thiết bị Slave đến / từ đó thiết bị Master cần gửi / nhận dữ liệu. Tất cả
các thiết bị Slave trên bus I2C so sánh các bit địa chỉ này với địa chỉ của
chúng.

Bit Read / Write

Bit này xác định hướng
truyền dữ liệu. Nếu thiết bị Master / IC cần gửi dữ liệu đến thiết bị Slave,
bit này được thiết lập là ‘0’. Nếu IC Master cần nhận dữ liệu từ thiết bị
Slave, bit này được thiết lập là ‘1’.

Bit ACK / NACK

ACK / NACK là viết tắt của Acknowledged/Not-Acknowledged. Nếu địa
chỉ vật lý của bất kỳ thiết bị Slave nào trùng với địa chỉ được thiết bị
Master phát, giá trị của bit này được set là ‘0’ bởi thiết bị Slave. Ngược
lại, nó vẫn ở mức logic ‘1’ (mặc định).

Khối dữ liệu

Nó bao gồm 8 bit và chúng được thiết lập bởi bên gửi, với các bit
dữ liệu cần truyền tới bên nhận. Khối này được theo sau bởi một bit ACK / NACK
và được set thành ‘0’ bởi bên nhận nếu nó nhận thành công dữ liệu. Ngược lại,
nó vẫn ở mức logic ‘1’.

Sự kết hợp của khối dữ liệu theo sau bởi
bit ACK / NACK được lặp lại cho đến quá trình truyền dữ liệu được hoàn tất.

Điều kiện kết thúc (Stop condition)

Sau khi các khung dữ liệu cần thiết được truyền qua đường SDA,
thiết bị Master chuyển đường SDA từ mức điện áp thấp sang mức điện áp cao
trước khi đường SCL chuyển từ cao xuống thấp.

Giao tiếp I2C hoạt động như thế nào?

Giao tiếp I2C được bắt đầu bởi thiết bị Master hoặc để gửi dữ liệu đến thiết bị Slave hoặc nhận dữ liệu từ thiết bị đó. Chúng ta hãy tìm hiểu về cách làm việc của cả hai kịch bản một cách chi tiết.

Gửi dữ liệu đến thiết bị Slave

Trình tự hoạt động sau đây diễn ra khi một thiết bị Master gửi dữ liệu đến một thiết bị Slave cụ thể thông qua bus I2C:

  • Thiết bị Master gửi điều kiện bắt đầu đến tất cả các thiết bị Slave
  • Thiết bị Master gửi 7 bit địa chỉ của thiết bị Slave mà thiết bị Master muốn giao tiếp cùng với bit Read/Write
  • Mỗi thiết bị Slave so sánh địa chỉ được gửi từ thiết bị Master đến địa chỉ riêng của nó. Nếu địa chỉ trùng khớp, thiết bị Slave gửi về một bit ACK bằng cách kéo đường SDA xuống thấp và bit ACK / NACK được thiết lập là ‘0’,. Nếu địa chỉ từ thiết bị Master không khớp với địa chỉ riêng của thiết bị Slave thì đường SDA ở mức cao và bit ACK / NACK sẽ ở mức ‘1’ (mặc định).
  • Thiết bị Master gửi hoặc nhận khung dữ liệu. Nếu thiết bị Master muốn gửi dữ liệu đến thiết bị Slave, bit Read / Write là mức điện áp thấp. Nếu thiết bị Master đang nhận dữ liệu từ thiết bị Slave, bit này là mức điện áp cao.
  • Nếu khung dữ liệu được thiết bị Slave nhận được thành công, nó sẽ thiết lập bit ACK / NACK thành ‘0’, báo hiệu cho thiết bị Master tiếp tục
  • Sau khi tất cả dữ liệu được gửi đến thiết bị Slave, thiết bị Master gửi điều kiện dừng để báo hiệu cho tất cả các thiết bị Slave biết rằng việc truyền dữ liệu đã kết thúc.

Hình dưới đây thể hiện toàn bộ các bit dữ liệu được gửi trên đường SDA và thiết bị điều khiển chúng khi thiết bị Master gửi dữ liệu đến thiết bị Slave.

Hình dưới đây thể hiện toàn bộ các bit dữ liệu được gửi trên đường SDA và thiết bị điều khiển chúng khi thiết bị Master nhận dữ liệu đến thiết bị Slave.

Các chế độ hoạt động của I²C

Dựa vào tốc độ ta chia làm 2 loại

  • Chế độ chuẩn (standard mode) hoạt động ở tốc độ 100 Kbit/s.
  • Chế độ tốc độ thấp (low-speed mode) hoạt động ở tốc độ 10 Kbit/s.

Nếu chia theo quan hệ chủ tớ:

  • Một Master một Slave.
  • Một Master nhiều Slave.
  • Nhiều Master nhiều Slave.

Một Master nhiều Slave

Bởi vì I2C sử dụng địa chỉ, nhiều thiết bị Slave có thể được điều
khiển từ một thiết bị Master duy nhất. Với 7 bit địa chỉ tương ứng 128 (27)
địa chỉ duy nhất có sẵn. Để kết nối nhiều thiết bị Slave với một một thiết
bị Master duy nhất, hãy nối dây như hình bên dưới, với các điện trở kéo lên
4.7 kΩ kết nối các đường SDA và SCL với Vcc:

Nhiều Master nhiều Slave.

Nhiều thiết bị Master có thể
được kết nối với một thiết bị Slave đơn hoặc nhiều thiết bị Slave. Vấn đề với
nhiều thiết bị Master trong cùng một hệ thống xuất hiện khi hai thiết bị
Master cố gắng gửi hoặc nhận dữ liệu cùng một lúc trên dòng SDA. Để giải quyết
vấn đề này, mỗi thiết bị Master cần phát hiện xem đường SDA thấp hay cao trước
khi truyền một thông điệp. Nếu đường SDA thấp, điều này có nghĩa là một thiết
bị Master khác có quyền điều khiển bus và thiết bị Master còn lại phải đợi để
gửi tin nhắn. Nếu đường SDA cao thì an toàn để truyền tải thông điệp. Để kết
nối nhiều thiết bị Master với nhiều thiết bị Slave, hãy sử dụng sơ đồ sau đây,
với điện trở kéo lên 4.7 kΩ kết nối các đường SDA và SCL với Vcc:




www.truongcongly.com

0 bình luận trong “Chuẩn Giao Tiếp I2C – TWI

Trả lời fabianaignatius Hủy

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *