Chuẩn Giao Tiếp I2C Là Gì - Giao Tiếp I2C Với Nhiều Module

-

I2C phối kết hợp các tính năng cực tốt của SPI và UART. Cùng với I2C, bạn có thể kết nối những slave với cùng 1 master độc nhất (như SPI) và chúng ta cũng có thể có những master tinh chỉnh một hoặc nhiều slave. Điều này thực sự có ích khi bạn muốn có nhiều hơn thế một vi tinh chỉnh và điều khiển ghi dữ liệu vào một thẻ nhớ tốt nhất hoặc hiển thị văn phiên bản trên một screen LCD.

Bạn đang xem: Giao tiếp i2c là gì

*

Giống như tiếp xúc UART, I2C chỉ áp dụng hai dây nhằm truyền tài liệu giữa những thiết bị:

 

SDA (Serial Data) - mặt đường truyền đến master cùng slave để gửi với nhận dữ liệu.

 

SCL (Serial Clock) - con đường mang biểu thị xung nhịp.

 

I2C là một trong giao thức truyền thông nối tiếp, vì chưng vậy dữ liệu được truyền từng bit dọc theo một con đường duy tuyệt nhất (đường SDA).

 

Giống như SPI, I2C là đồng bộ, cho nên vì thế đầu ra của các bit được đồng hóa hóa với câu hỏi lấy mẫu những bit bởi vì một biểu hiện xung nhịp được chia sẻ giữa master và slave. Tín hiệu xung nhịp luôn luôn được tinh chỉnh và điều khiển bởi master.

 

Cách hoạt động của I2C

Với I2C, tài liệu được truyền trong số tin nhắn. Tin nhắn được tạo thành các size dữ liệu. Mỗi tin nhắn bao gồm một khung địa chỉ cửa hàng chứa add nhị phân của địa chỉ cửa hàng slave cùng một hoặc nhiều khung tài liệu chứa dữ liệu đang rất được truyền. Thông điệp cũng bao gồm điều kiện khởi đụng và điều kiện dừng, các bit đọc / ghi và các bit ACK / NACK thân mỗi khung dữ liệu:

*

Điều kiện khởi động: Đường SDA đưa từ mức điện áp cao xuống tới mức điện áp thấp trước khi đường SCL đưa từ nút cao xuống đến mức thấp.

 

Điều kiện dừng: Đường SDA chuyển từ mức điện áp rẻ sang mức năng lượng điện áp cao sau khoản thời gian đường SCL gửi từ mức thấp lên tới mức cao.

 

 

Bit Đọc / Ghi: Một bit duy nhất chỉ định master sẽ gửi dữ liệu đến slave (mức năng lượng điện áp thấp) giỏi yêu cầu dữ liệu từ nó (mức điện áp cao).

 

Bit ACK / NACK: Mỗi khung trong một tin nhắn được theo sau vày một bit xác thực / ko xác nhận. Nếu một khung add hoặc size dữ liệu được trao thành công, một bit ACK sẽ được trả lại mang lại thiết bị gửi từ thứ nhận.

 

Địa chỉ

I2C không tồn tại các mặt đường Slave Select như SPI, vày vậy bắt buộc một cách khác khiến cho slave hiểu được dữ liệu đang rất được gửi mang lại slave này chứ chưa hẳn slave khác. Nó thực hiện điều này bằng cách định địa chỉ. Khung địa chỉ luôn là khung thứ nhất sau bit khởi hễ trong một tin nhắn mới.

 

Master gửi add của slave nhưng nó muốn tiếp xúc với các slave được liên kết với nó. Sau đó, từng slave đang so sánh địa chỉ cửa hàng được gởi từ master với địa chỉ cửa hàng của bao gồm nó. Nếu địa chỉ phù hợp, nó đã gửi lại một bit ACK năng lượng điện áp thấp cho master. Nếu showroom không khớp, slave không làm cái gi cả và con đường SDA vẫn ở tầm mức cao.

 

Bit đọc / ghi

Khung địa chỉ bao gồm một bit tốt nhất ở cuối tin nhắn đến slave biết master mong ghi tài liệu vào nó xuất xắc nhận tài liệu từ nó. Ví như master muốn gửi dữ liệu đến slave, bit phát âm / ghi tại mức điện áp thấp. Nếu master đang yêu thương cầu dữ liệu từ slave, thì bit ở mức điện áp cao.

 


*

Khung dữ liệu

Sau lúc master phát hiện tại bit ACK trường đoản cú slave, khung dữ liệu thứ nhất đã sẵn sàng được gửi.

 

Khung dữ liệu luôn có độ dài 8 bit và được nhờ cất hộ với bit đặc biệt quan trọng nhất trước. Từng khung tài liệu ngay tiếp đến là một bit ACK / NACK để xác minh rằng khung đã được trao thành công. Bit ACK phải được nhận bởi master hoặc slave (tùy trực thuộc vào chiếc nào sẽ gửi dữ liệu) trước khi khung tài liệu tiếp theo có thể được gửi.

 

Sau khi tất cả các khung dữ liệu đã được gửi, master hoàn toàn có thể gửi một điều kiện dừng mang đến slave để tạm dừng quy trình truyền. Điều kiện ngừng là sự đổi khác điện áp từ thấp lên cao trên đường SDA sau khi chuyển tiếp từ bỏ thấp lên rất cao trên đường SCL , với đường SCL vẫn tại mức cao.

Xem thêm: In Ảnh Treo Tường Và 7 Cách Trang Trí Ảnh Trên Tường Phong Cách Hiện Đại

 

Các cách truyền tài liệu I2C

Master gửi đk khởi rượu cồn đến những slave được kết nối bằng phương pháp chuyển đường SDA từ mức năng lượng điện áp cự phách mức điện áp thấp trước khi chuyển mặt đường SCL tự mức cao xuống tới mức thấp.

 

Master gửi cho từng slave showroom 7 hoặc 10 bit của slave mà lại nó mong mỏi giao tiếp, cùng rất bit gọi / ghi.

 

từng slave vẫn so sánh địa chỉ cửa hàng được giữ hộ từ master với add của thiết yếu nó. Nếu add trùng khớp, slave sẽ trả về một bit ACK bằng cách kéo cái SDA xuống thấp cho 1 bit. Nếu showroom từ master không hợp với địa chỉ cửa hàng của slave, slave rời ra khỏi đường SDA cao. Master giữ hộ hoặc nhấn khung dữ liệu.

 

sau khi mỗi khung dữ liệu được chuyển, thiết bị dấn trả về một bit ACK khác cho thiết bị gởi để chứng thực đã nhận thành công xuất sắc khung.

 

Để ngừng truyền dữ liệu, master gửi đk dừng đến slave bằng phương pháp chuyển đổi mức cao SCL trước khi chuyển mức cao SDA.

 

Một master với rất nhiều slave

Vì I2C thực hiện định địa chỉ nên những slave rất có thể được tinh chỉnh từ một master duy nhất. Với showroom 7 bit sẽ có 128 (2 mũ 7) showroom duy nhất. Việc sử dụng địa chỉ 10 bit không phổ biến, nhưng lại nó cung ứng 1.024 (2 nón 10) địa chỉ duy nhất. Để kết nối nhiều slave mang lại một master duy nhất, bạn có thể đấu dây như thế này, với điện trở đẩy lên 4,7K Ohm kết nối đường SDA với SCL cùng với Vcc:

*

Nhiều master với tương đối nhiều slave

Nhiều master rất có thể được kết nối với một slave hoặc những slave. Sự cố với khá nhiều master trong thuộc một khối hệ thống xảy ra khi nhì master cố gắng gửi hoặc nhận tài liệu cùng một dịp qua mặt đường SDA. Để xử lý vấn đề này, từng master rất cần được phát hiện tại xem con đường SDA thấp giỏi cao trước khi truyền tin nhắn. Nếu con đường SDA thấp, điều này có nghĩa là một master khác có quyền tinh chỉnh bus với master đó buộc phải đợi để gửi tin nhắn. Nếu đường SDA cao thì có thể truyền tin nhắn an toàn. Để kết nối nhiều master với khá nhiều slave, hãy sử dụng sơ thiết bị sau, với những điện trở đẩy lên 4,7K Ohm kết nối những đường SDA với SCL với Vcc:

*

Ưu điểm với nhược điểm của I2C

Có không ít điều sinh sống I2C hoàn toàn có thể khiến nó nghe tất cả vẻ tinh vi so với các giao thức khác, tuy thế có một số lý do chính đáng khiến chúng ta có thể muốn hoặc không thích sử dụng I2C để liên kết với một thiết bị gắng thể:

I. I2C LÀ GÌ?

Tất nhiên là đã có bài viết giới thiệu về I2C trên tarotnlife.edu.vn tuy nhiên bài viết này bản thân xin nói về 1 phía khác. Các bạn quan tâm có thể xem lại những nội dung bài viết về I2C của những tác trả khác nhé!

Đầu năm 1980 Phillips đã cải tiến và phát triển một chuẩn giao tiếp tiếp nối 2 dây được điện thoại tư vấn là I2C. I2C là tên gọi viết tắt của các từ Inter-Intergrated Circuit. Đây là đường Bus tiếp xúc giữa những IC với nhau. I2C tuy vậy được cải cách và phát triển bới Philips, nhưng nó sẽ được không hề ít nhà cung cấp IC trên trái đất sử dụng. I2C trở thành một chuẩn công nghiệp mang đến các tiếp xúc điều khiển, hoàn toàn có thể kể ra đây một vài tên tuổi bên cạnh Philips như: Texas Intrument(TI), Maxim
Dallas, analog Device, National Semiconductor ... Bus I2C được thực hiện làm bus giao tiếp ngoại vi cho không hề ít loại IC khác nhau như các loại Vi điều khiển và tinh chỉnh 8051, PIC, AVR, ARM... Cpu nhớ như: RAM tĩnh (Static Ram), EEPROM, bộ đổi khác tương tự số (ADC), số tương tự(DAC), IC điểu khiển LCD, LED...

Cấu tạo và nguyên lý hoạt động

I2C sử dụng hai tuyến đường truyền tín hiệu:

Một con đường xung nhịp đồng hồ(SCL) chỉ vị Master vạc đi ( thông thường ở 100k
Hz cùng 400k
Hz. Mức tối đa là 1Mhz và 3.4MHz).Một con đường dữ liệu(SDA) theo 2 hướng.

Có không hề ít thiết bị rất có thể cùng được kết nối vào một bus I2C, mặc dù sẽ không xảy ra chuyện nhầm lẫn giữa các thiết bị, vày mỗi thiết bị đã được nhận biết bởỉ một add duy độc nhất vô nhị với một dục tình chủ/tớ lâu dài trong suốt thời gian kết nối. Mỗi thiết bị có thể vận động như là thiết bị dìm hoặc truyền tài liệu hay rất có thể vừa truyền vừa nhận. Vận động truyền hay nhấn còn tùy thuộc vào câu hỏi thiết bị chính là chủ (master) hãy tớ (slave).

Một thiết bị hay như là 1 IC khi liên kết với bus I2C, ko kể một showroom (duy nhất) để phân biệt, nó còn được thông số kỹ thuật là thiết bị công ty hay tớ.Tại sao lại sở hữu sự rõ ràng này ? Đó bởi vì trên một bus I2C thì quyền điều khiển thuộc về sản phẩm công nghệ chủ. Thiết bị chủ vắt vai trò tạo nên xung đồng hồ thời trang cho toàn hệ thống, khi thân hai thứ chủ-tớ tiếp xúc thì thiết bị chủ có trọng trách tạo xung đồng hồ đeo tay và quản ngại lý địa chỉ cửa hàng của sản phẩm tớ trong suốt quá trình giao tiếp. Thiết bị công ty giữ vai trò công ty động, còn thiết bị tớ giữ lại vai trò tiêu cực trong việc giao tiếp.

Về định hướng lẫn thực tế I²C áp dụng 7 bit để định địa chỉ, cho nên vì vậy trên một bus có thể có cho tới 2^7 địa chỉ tương ứng cùng với 128 thiết bị rất có thể kết nối, tuy thế chỉ có 112 , 16 địa chỉ còn lại được sử dụng vào mục đích riêng. Bit còn sót lại quy định việc đọc tốt ghi dữ liệu (1 là write, 0 là read)

Điểm mạnh mẽ của I²C đó là hiệu suất cùng sự dễ dàng của nó: một khối điều khiển và tinh chỉnh trung tâm có thể điều khiển cả một mạng đồ vật mà chỉ cần hai lối ra điều khiển.

Ngoài ra I2C còn có cơ chế 10bit địa chỉ cửa hàng tương đương với 1024 địa chỉ, tương tự như như 7 bit, chỉ tất cả 1008 thiết bị rất có thể kết nối, sót lại 16 địa chỉ cửa hàng sẽ dùng để làm sử dụng mục tiêu riêng (Mình chưa rõ lắm)

Vậy, làm thay nào nhằm nó rất có thể giao tiếp với nhiều thiết bị?

II. LÀM THẾ NÀO?

Vâng, như mình đã nói làm việc trên, mỗi thiết bị tất cả 1 địa chỉ cửa hàng được mua sẵn hoặc 1 địa chỉ thiết bị duy nhất để thiết bị nhà (Master) rất có thể giao tiếp. 2 chân SDA VÀ SCL là 2 chân của giao tiếp I2C, trong số đó chân SCL là chân Clock, có chức năng đồng cỗ hóa việc truyền dữ liệu giữa những thiết bị, cùng việc tạo nên xung clock đó là vì thiết bị nhà (Master). Chân còn lại là chân SDA là chân truyền tài liệu (DATA). 2 chân này luôn vận động ở cơ chế mở, vày vậy để thực hiện được rất cần phải có trở kéo. Có nghĩa là nối +5v => trở => I2C bởi các thiết bị bên trên bus i2c chuyển động ở mức thấp. Giá trị thường được sử dụng cho các điện trở là từ 2K cho tốc độ vào khoảng tầm 400 kbps, cùng 10K cho vận tốc thấp hơn khoảng chừng 100 kbps.

Hãy tưởng tượng chúng ta là nhân viên phát bưu phẩm, đến 1 thành phố trên tay bao gồm bưu phẩm buộc phải chuyển phát. Công dụng của bạn có thể phát với nhận bưu phẩm để đưa đi cho cả khu phố, tuy nhiên, yếu hèn tố quan trọng đặc biệt là bạn phải có địa chỉ. Mỗi 1 thiết bị sẽ có được 1 địa chỉ riêng nhằm thiết bị chủ rất có thể truy cập để mang dữ liệu 

Hải Đăng PPK

Ví dụ cảm ứng gia tốc ADXL345

Có 1 địa chỉ cửa hàng duy nhất mang lại riêng module với đồng thời bửa xung bên phía trong có 3 địa chỉ riêng biệt cho những trục X,Y,Z. Nếu chúng ta cần đọc những dữ liệu từ trục X, trước hết bọn họ cần đến địa chỉ cửa hàng chính của Module, sau đó mới đến địa chỉ của trục X. Việc tìm kiếm tên các showroom này chúng ta cần tra cứu trong datasheet của linh kiện. Đây là datasheet của cảm biến gia tốc ADXL345 Mở ra gọi tại mục Register maps các chúng ta cũng có thể thấy showroom của trục X là 0x32 và 0x33

0x32 DATAX0 X-Axis Data 0

0x33 DATAX1 X-Axis Data 1

Trong ví dụ sau đây mình sẽ chỉ dẫn 1 trường phù hợp về việc liên kết tarotnlife.edu.vn cùng với 2 cảm biến (Cảm biến tốc độ 10 bậc tự do GY - 80 và cảm ứng gia tốc 6 bậc thoải mái GY521), cả 2 cảm biến đều sử dụng tiếp xúc I2C

Cảm biến tốc độ GY-521 

Cảm biến gia tốc GY-80

Dưới đó là cách liên kết 2 module với tarotnlife.edu.vn, các bạn cũng có thể thấy hơi mâu thuẫn so với thuở đầu mình nói, tại sao không tồn tại điện trở nào kéo làm việc đây? thực tiễn thì bên phía trong module đã bao gồm điện trở kéo, bởi vì thế họ không yêu cầu kéo gì nữa cả 

*

Bây tiếng để giao tiếp với chúng, ta cần biết được showroom của nó là gì, đối với mỗi 1 cảm biến trên 1 module kia sẽ có được 1 showroom riêng. Các bạn phải tìm bọn chúng trong datasheet của mỗi loại. Ở trên đây mình đưa ra các địa chỉ của các cảm ứng để chúng ta tiện theo dõi

Đối với GY-521, chỉ gồm một showroom và đó là 0x68. Các chúng ta cũng có thể kiểm tra và xác định được địa chỉ của chúng bằng phương pháp sử dụng phiên bản sketch mẫu mã I2C Scanner . Nạp code đó vào và nó sẽ tự cho chúng ta biết các địa chỉ có bên trên thiết bị. 

Sau khi sẽ tìm thấy add của các thiết bị, họ cũng rất cần phải tìm ra địa chỉ của những thanh ghi bên phía trong của chúng để phát âm dữ liệu. Ví dụ, nếu chúng ta muốn đọc tài liệu cho trục X trường đoản cú các cảm ứng 3 trục vận tốc của GY-80, họ cần đề xuất tìm địa chỉ nơi tài liệu của trục X được lưu lại trữ. Bằng cách đọc datasheet của các cảm ứng của GY-80 và ở đó là datasheet của cảm ứng 3 trục vận tốc ADXL345 mà mình đã nêu tại vị trí đầu bài bác viết, bạn cũng có thể thấy rằng tài liệu cho trục X được tàng trữ trong nhị thanh ghi, DATAX0 với một add 0x32 với DATAX1 cùng với một địa chỉ 0x33.

Bây giờ chúng ta chỉ việc code và hãy phân tích xem code vẫn làm rất nhiều gì?

#include int ADXLAddress = 0x53; // Địa chỉ của cảm ứng gia tốc vào module GY80#define X_Axis_Register_DATAX0 0x32 // showroom của data0 trục X trong cảm biến gia tốc ADXL345 vào module GY-80#define X_Axis_Register_DATAX1 0x33 //địa chỉ của data1 trục X trong cảm biến gia tốc ADXL345 vào module GY-80#define Power_Register 0x2D // thanh ghi điều khiển năng lượng cung cấpint X0,X1,X_out;void setup() Wire.begin(); // Khởi chế tác thư viện WIRE Serial.begin(9600); delay(100); // kích hoạt tính năng thống kê giám sát Wire.begin
Transmission(ADXLAddress);//bắt đầu bài toán truyền cài đặt yêu mong tới các cảm biến Wire.write(Power_Register); // được cho phép đo Wire.write(8); Wire.end
Transmission();void loop() { Wire.begin
Transmission(ADXLAddress); // ban đầu truyền cho cảm biếnr //Thu thập tài liệu từ những thanh ghi Wire.write(X_Axis_Register_DATAX0); Wire.write(X_Axis_Register_DATAX1); Wire.end
Transmission(); // ngừng việc truyền dữ liệu từ 2 thanh ghi Wire.request
From(ADXLAddress,2); // Yêu mong truyền 2 byte từ bỏ 2 thanh ghi if(Wire.available() 

Việc lấy tài liệu từ các cảm biến trên module không giống cũng tương tự. Như vậy chúng ta đã biết phương pháp sử dụng giao tiếp I2C. Và rõ ràng 2 module này còn có vẻ ko được đa số chúng ta quan tâm áp dụng lắm bởi chi phí cũng như thể về vấn đề các bạn cần ứng dụng đến ko nhiều. Chính vì vậy mình xin tiếp tục đưa ra ví dụ thứ 2 mà khá đa số chúng ta còn băn khoăn. Đó là việc thực hiện LCD 1602 module i2c với module thời hạn thực DS1307 với tarotnlife.edu.vn uno.

 

Trước khi đọc tiếp phần này, bản thân lại 1 lần tiếp nữa mong muốn các bạn đọc datasheet của linh kiện.

Ở đây, so với LCD1602 dùng module I2C. Add tùy ở trong vào jump các bạn cắm bên trên module i2c. Các chúng ta có thể đọc datasheet của LCD này tại trên đây Mình rước ví dụ showroom OPEN là 0x27 Hoặc nó bao gồm thể thay đổi từ 0X20 - 0X27

Với module thời hạn thực DS1307 các chúng ta có thể đọc datasheet tại đây. Địa chỉ của module DS1307 là 0x68. Làm nắm nào để hiểu nó là 0X68 thì các bạn hãy phát âm lại phần đầu bài bác viết, phần I2C SCANNER.. Bên phía trong DS1307 sẽ sở hữu các showroom để đọc các giá trị giờ, phút, giây...

Như vậy để kết nối 2 module cùng sử dụng i2c các bạn chỉ yêu cầu gọi địa chỉ cửa hàng của LCD là 0x27, địa chỉ cửa hàng của DS1307 là 0X68 là hoàn toàn có thể sử dụng mặt khác 2 module trên thuộc 2 chân SDA, SCL của tarotnlife.edu.vn

#include #include "RTClib.h"#include Liquid
Crystal_I2C lcd(0x20,16,2); // 0x27 là add của lcd 16x2RTC_DS1307 RTC;void setup () lcd.init(); lcd.backlight(); //đèn nền nhảy // thiết lập số cột cùng số chiếc lcd.begin(16, 2); // được in logo nhãn hiệu lên màn hình hiển thị lcd.print("www.tarotnlife.edu.vn"); lcd.set
Cursor(0, 1); lcd.print("haidangppk"); delay (2500); lcd.clear(); // Serial.begin(9600); Wire.begin();Wire.begin
Transmission(0x68);// địa chỉ của ds1307Wire.write(0x07); // Wire.write(0x10); // Wire.end
Transmission(); RTC.begin(); if (! RTC.isrunning()) Serial.println("RTC is NOT running!"); RTC.adjust(Date
Time(__DATE__, __TIME__)); void loop () Date
Time now = RTC.now(); lcd.set
Cursor(6, 0); lcd.print(now.hour(), DEC); lcd.print(":"); lcd.print(now.minute(), DEC); lcd.print(":"); lcd.print(now.second(), DEC); lcd.print(" "); lcd.set
Cursor(5, 1); lcd.print(now.day(), DEC); lcd.print("/"); lcd.print(now.month(), DEC); lcd.print("/"); lcd.print(now.year(), DEC); lcd.print(""); delay(1000);Bài viết của mình có thể có sai sót, mong các bạn góp ý. Chúc các bạn thành công!