Giao tiếp I2C là gì?

I²C, viết tắt của từ tiếng Anh“Inter-Integrated Circuit”, làmột loạibus nối tiếpđược phát triển bởi hãng sản xuất linh kiện điện tửPhilips. Banđầu, loại bus này chỉ được dùng trong cáclinh kiện điện tửcủa Philips. Sau đó, do tínhưu việt vàđơn giản của nó,I²Cđãđược chuẩn hóa vàđược dùng rộng rãi trong các môđuntruyền thông nối tiếpcủavi mạch tích hợpngày nay.Bạn đang xem: Giao tiếp i2c là gì

Đây là một chuẩn kết nối ngắn sử dụng cặp dây SCL, SDA. Giao tiếp đến các ngoại vi bằng cách gọi địa chỉ . Một Master có thể kết nối với nhiều slave, mỗi Slave trên đường truyền có địa chỉ không giống nhau.

Đang xem: Giao Tiếp I2C — Tài Liệu Esp32 1

*

Tốc độ:

*

Độ dài bus:

*

Ví dụ trong Arduino, dùng chung bus I2C DS1307 với màn hình LCD I2C 1602:

*

Cấu tạo

I²C sử dụng hai đường truyền tín hiệu:

Một đường xung nhịp đồng hồ Clock (SCL) chỉ do Master phát đi ( thông thường ở 100kHz và 400kHz. Mức cao nhất là 1Mhz và 3.4MHz).Một đường dữ liệu(SDA) theo 2 hướng.Sơ đồ kết nối như hình dưới.

*

Có một lưu ý nhỏ về xung clock. Bản chất của I2C là dữ liệu trên đường SDA chỉ được ghi nhận ở sườn lên của chân CLK. Do vậy xung clock có thể không cần chính xác tốc độ là 1MHz hay 3.4Mhz. Lợi dụng điểm này có thể sử dụng 2 chân GPIO để làm chân giao tiếp I2Cmềmmà không nhất thiết cần một chân CLK tạo xung với tốc độ chính xác (có thể chỉ cần dùng delay và bật tắt mức logic)

SCL vàSDA luônđược kéo lên nguồn bằng mộtđiện trở kéo lên cógiátrị xấp xỉ 4,7 KOhm(tùy vào từng thiết bị và chuẩn giao tiếp, có thể daođộng trong khoảng 1KOhmđến 4.7 Kohm. Chú ý rằng theo cấu hình này, một thiết bị có thể ở mức logic LOW hay cao trở nhưng ko thể ở dạng HIGH => Chính trở pull up tạo ra mức logic HIGH).

Lý do là các chân này có dạng opendrain để có thểhoạt động ở các mức điệnáp logic khác nhau => Dùng cho nhiều loại vi điều khiển, vi xử lý

Việc lựa chọn trở pull up phù hợp sẽđược trình bàyở phần sau.

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 chủ một tớ.Một chủ nhiều tớ.Nhiều chủ nhiều tớ.

Quá trình truyền dữ liệu

Thiết bị A (chủ) xác địnhđúng địa chỉ của thiết bị B (Tớ), cùng với việc xác địnhđịa chỉ, thiết bị A sẽ quyếtđịnhđọc hay ghi vào thiết bị tớ.Thiết bị A gửi gữi liệu tới thiết bị BThiết bị A kết thúc quá trình truyền dữ liệu.Khi A muốn nhận dữ liệu từ B, quá trình diễn ra tương tự, chỉ khác A sẽ nhận dữ liệu từ B.

Cách đánh địa chỉ

I²C sử dụng 7 bit để định địa chỉ, do đó trên một bus có thể định địa chỉ tới 112 nút, 16 địa chỉ còn lại được sử dụng vào mục đích riêng. Bit còn lại quy định việc đọc hay ghi dữ liệu (1 là write, 0 là read)

Ví dụ:

– Địa chỉ của một thiết bị là 0x20. Khi cần đọc vào thiết bị này thì thanh ghi sẽ có giá trị 0x40 (thêm bit 0) còn khi ghi thì giá trị là 0x41 (thêm vào 0).

Điểm mạnh của I²C chính là hiệu suất và sự đơn giản của nó: một khối điều khiển trung tâm có thể điều khiển cả một mạng thiết bị mà chỉ cần hai lối ra điều khiển.

Định dạng dữ liệu truyền

DữliệuđượctruyềntrênbusI2Ctheotừngbit,bitdữliệuđượctruyềnđitạimỗi sườn lêncủaxung clock trên SCKL , Quá trình thay đổi bit dữ liệu xảy ra khi SCL ở mức thấp.

Xem thêm: Ổ Cứng Ssd Và Hdd Tosiba Báo Lỗi Interface Crc Error Count Là Gì

Start = HIGH to LOW on SDA when SCL is HIGHStop = LOW TO HIGH on SDA when SCL is HIGHOther when SCL low => Data!

Mỗibyteđượctruyềnsẽ chờ tín hiệu phản hồi là mộtbitACKđểbáohiệuđãnhậndữliệu.=>Mỗi lần I2C sẽ truyền 8bit và nhận 1bit. ACK(Acknowledge : thừa nhận) và NACK (Not Acknowledge : Không thừa nhận)

Bitcótrọngsốcaonhất(MSB)sẽđượctruyềnđiđầutiên,cácbítsẽđượctruyềnđilầnlượt.Sau8xungclocktrêndâySCL,8bitdữliệuđãđượctruyềnđi.Lúcnàythiếtbịnhận,saukhiđãnhậnđủ8bítdữliệusẽkéoSDAxuốngmứcthấptạomộtxungACK ứngvớixungclockthứ9trêndâySDAđểbáohiệuđãnhậnđủ8bit.ThiếtbịtruyềnkhinhậnđượcbitACKsẽtiếptụcthựchiệnquátrìnhtruyềnhoặckếtthúc.

Thuật toán truyền nhận dữ liệu:

Bước 1:Host xác định thiết bị cần giao tiếp và chế độ giao tiếp là read hay là write. Việc này được thực hiện bằng cách gửi 7bit địa chỉ thiết bị và thêm bit cuối cùng, 0 nếu read và 1 nếu write.

Bước 2:Reset chế độ bằng cách thực hiện liên tiếp việc start và stop.

Bước 3:Gửiđịachỉthanh ghicần truynhậpcủathiếtbị cũng nhưchế độread hay write.

Bước 4:Gửihoặcnhận 1bytedữ liệu. Sau khitruyền 1bytedữ liệu, bênnhận đcdữ liệusẽ gửilại 1bit ACKđể xácnhậnđã nhậnđượcdữ liệuvà tiếptụctruyềnhoặc bit NACKđể báonhận đcdữ liệu nhưngkếtthúcquá trình truyên.

Chú ý: ASK là bit do slave truyền chứ ko phải do master truyền

MộtbytetruyềnđicókèmtheobitACKlàđiềukiênbắtbuộc,nhằmđảmbảochoquá trìnhtruyềnnhậnđượcdiễnrachínhxác.Khikhôngnhậnđượcđúngđịachỉhaykhi muốnkếtthúcquátrìnhgiaotiếp,thiếtbịnhậnsẽgửimộtxungNot‐ACK(SDAởmức cao)đểbáochothiếtbịchủbiết,thiếtbịchủsẽtạoxungSTOPđểkếtthúchaylặplạimộtxungSTARTđểbắtđầuquátrìnhmới.

Chọn trở Pullup I2C

Do I2C sử dụngđầu ra dạng Opendrain/Open colector nên có thể sử dụng với nhiều dạngđiệnáp khác nhau. Để làm đượcđiều này ta cần sử dụng trở pullupđể kéo lên mứcđiệnáp phù hợp. Giá trị của trở pullup tương đối quan trọng, nếu chọn không phù hợp có thể dẫnđến việc mất mát tín hiệu.

Giá trị trở pull up phù hợp cầnđảm bảo 2 yếu tố:

Thỏa mãn phù hợp mức logic: Rp(min)Đảm bảo rise time của tín hiệu: Rp(max)

Để IC (microcontroller hoặc processor) nhận đúng mức logic thì điện áp chân phải lớn hơn VOL(điện áp cao nhất mức LOW). Ta có công thức tính trở nhỏ nhất min như sau:

Ngoài ra, do đặc thù của I2C có thêm phần rise time. Nếu giá trị trở quá lớn sẽ dẫnđến việc rise time cao. Nhất là với các mode ở tốc độ cao.

Xem thêm: To Fall Through Nghĩa Là Gì Trong Tiếng Việt? Fall Through Fall Through Trong Tiếng Tiếng Việt

Xem kết nối như một mạch RC (C là tụ kháng sinh) thì ta có điệnáp theo thời gian trong mạch RC tính theo công thức sau:

Thông thường, VIH và VIL thường tính lần lượt bằng 0.7*VCC và 0.3*VCC nên ta có:

Giá trị rise time được tính:

Ví dụ về tính trở pull up:

Cho giao tiếp I2C hoạt động ở chế độ Fast-mode, với thông số Cb=200 pF, Vcc=3.3V, các thông số ở Table 1. Tính giá trị điện trở Pull-up:

Sử dụng các công thức tính Rp min, Rp max ở trên ta có:

Kết quả: Chọn giá trị trong khoảng 966.667 Ω đến1.77 kΩ, lựa chọn cân nhắc giữa tốc độ và tiêu thụ nguồn.

Ví dụ khác theo tài liệu AN255 của NXP https://www.nxp.com/docs/en/application-note/AN255.pdf:

Mẹo nhỏ trên internert:

Tài liệu UM10204 của NXP:

Tham khảo: https://kienltb.wordpress.com/SLVA689 I2C Bus Pullup Resistor Calculation

Leave a Reply

Your email address will not be published. Required fields are marked *