Cách quét địa chỉ I2C trong ESP32 bằng Arduino IDE

Cach Quet Dia Chi I2c Trong Esp32 Bang Arduino Ide



ESP32 là một nền tảng dựa trên vi điều khiển có thể giao tiếp với một số thiết bị để điều khiển các đầu ra khác nhau tùy theo đầu vào. Tất cả các giao thức truyền thông như UART, SPI và I2C đóng một vai trò quan trọng trong truyền thông ESP32. Chúng ta sẽ thảo luận về giao thức truyền thông Inter Integrated Circuit hoặc I2C trong hướng dẫn này và cách quét địa chỉ của thiết bị.

Giới thiệu về truyền thông I2C

I2C còn được gọi là I2C hoặc IIC là một giao thức truyền thông chính-phụ đồng bộ trong đó thiết bị chính tín hiệu có thể điều khiển nhiều thiết bị phụ qua một dây (đường SDA).

I2C kết hợp hoạt động của các giao thức UART và SPI, ví dụ SPI hỗ trợ điều khiển nhiều thiết bị phụ trên một thiết bị chủ, I2C cũng hỗ trợ điều này, mặt khác, UART sử dụng TX và Rx hai dòng để giao tiếp I2C cũng sử dụng SDA và SCL hai dòng cho liên lạc.









Ở đây có thể thấy chúng ta đã sử dụng điện trở pull up với cả 2 đường SDA, SCL. Điều này là do theo mặc định, I2C chỉ xuất ra hai mức THẤP hoặc hở mạch. Theo mặc định, I2C trên tất cả các chip ở chế độ mạch hở, vì vậy để kéo chúng lên CAO, chúng tôi đã sử dụng một điện trở kéo lên.



Sau đây là hai dòng I2C sử dụng:





  • SDA (Dữ liệu nối tiếp) : Đường truyền và nhận dữ liệu từ master đến Slave và ngược lại
  • SCL (Đồng hồ nối tiếp) : Dòng tín hiệu đồng hồ để chọn một thiết bị phụ cụ thể

Giao diện Bus ESP32 I2C

ESP32 có hai giao diện bus I2C sử dụng giao tiếp I2C nào được thực hiện dưới dạng chính hoặc phụ tùy thuộc vào thiết bị được giao tiếp với ESP32. Theo bảng dữ liệu ESP32, giao diện I2C của bảng ESP32 hỗ trợ cấu hình sau:

  • Giao tiếp I2C ở chế độ tiêu chuẩn với tốc độ 100 Kbit/s
  • Giao tiếp I2C ở chế độ nhanh hoặc nâng cao ở tốc độ 400 Kbit/s
  • Chế độ địa chỉ kép 7-bit và 10-bit
  • Người dùng có thể điều khiển giao diện I2C bằng cách lập trình các thanh ghi lệnh
  • Giao diện bus ESP32 I2C linh hoạt hơn trong việc điều khiển

Kết nối thiết bị I2C với ESP32

Việc kết nối các thiết bị với ESP32 bằng giao thức I2C rất đơn giản cũng giống như UART chúng ta chỉ cần 2 đường kết nối SDA và đường clock SCL.



ESP32 có thể được cấu hình ở cả chế độ Master và Slave.

Chế độ chính ESP32 I2C

Trong chế độ này, ESP32 tạo tín hiệu đồng hồ được sử dụng để bắt đầu giao tiếp với các thiết bị nô lệ được kết nối.

Hai chân GPIO trong ESP32 được xác định trước cho giao tiếp I2C:

  • SDA : GPIO PIN 21
  • SCL : GPIO PIN 22

Chế độ nô lệ ESP32 I2C

Ở chế độ nô lệ, đồng hồ được tạo bởi thiết bị chính. Master là thiết bị duy nhất điều khiển dòng SCL trong giao tiếp I2C. Slave là thiết bị phản hồi master nhưng không thể bắt đầu truyền dữ liệu. Trong bus I2C ESP32, chỉ chủ mới có thể bắt đầu truyền dữ liệu giữa các thiết bị.

Hình ảnh hiển thị hai bo mạch ESP32 trong cấu hình chính-phụ.

Đến bây giờ chúng ta đã hiểu hoạt động của chế độ I2C trong ESP32, bây giờ chúng ta có thể dễ dàng tìm thấy địa chỉ I2C của bất kỳ thiết bị nào bằng cách tải lên mã đã cho.

Cách quét địa chỉ I2C trong ESP32 bằng Arduino IDE

Tìm địa chỉ I2C của các thiết bị được kết nối với ESP32 là rất quan trọng vì nếu chúng ta đang sử dụng các thiết bị có cùng địa chỉ I2C thì chúng ta không thể giao tiếp với chúng qua một đường bus.

Mỗi thiết bị I2C phải chứa một địa chỉ duy nhất và phạm vi địa chỉ từ 0 đến 127 hoặc (0 đến 0X7F) trong HEX. Ví dụ: nếu chúng tôi đang sử dụng hai màn hình OLED có cùng số kiểu máy hoặc sản phẩm thì cả hai sẽ có cùng địa chỉ I2C, vì vậy chúng tôi không thể sử dụng cả hai trên cùng một dòng I2C trong ESP32.

Để tìm một địa chỉ IC, hãy lấy một ví dụ.

sơ đồ

Hình ảnh bên dưới hiển thị sơ đồ giao tiếp màn hình OLED với bo mạch ESP32 bằng giao thức truyền thông I2C.

Kết nối của ESP32 với OLED bao gồm:

Màn hình OLED Chân ESP32
VCC 3V3/VIN
GND GND
SCL GPIO 22
SDA GPIO21

Mã số
Mở trình chỉnh sửa Arduino và tải lên mã quét I2C đã cho trong bảng ESP32. Đảm bảo rằng ESP32 được kết nối và cổng COM được chọn.

/******************
******************
linuxhint.com
******************
******************/

#include  /*Đã bao gồm thư viện dây*/

thiết lập vô hiệu ( ) {
dây.bắt đầu ( ) ; /* Giao tiếp I2C bắt đầu */
Nối tiếp.bắt đầu ( 115200 ) ; /* Tốc độ truyền được xác định truyền thông nối tiếp */
Nối tiếp.println ( ' \N Máy quét I2C' ) ; /* máy quét in trên màn hình nối tiếp */
}

vòng lặp trống ( ) {
lỗi byte, địa chỉ;
int nDevices;
Nối tiếp.println ( 'Quét...' ) ; /* ESP32 bắt đầu quét các thiết bị I2C khả dụng */
nThiết bị = 0 ;
( địa chỉ = 1 ; Địa chỉ < 127 ; địa chỉ++ ) { /* vòng lặp để kiểm tra số lượng thiết bị trên 127 Địa chỉ */
Dây.bắt đầuTruyền ( Địa chỉ ) ;
lỗi = Wire.endTransmission ( ) ;
nếu ( lỗi == 0 ) { /* nếu Đã tìm thấy thiết bị I2C */
nối tiếp.print ( 'Đã tìm thấy thiết bị I2C tại địa chỉ 0x' ) ; /* in dòng này nếu Đã tìm thấy thiết bị I2C */
nếu ( Địa chỉ < 16 ) {
nối tiếp.print ( '0' ) ;
}
Nối tiếp.println ( địa chỉ, HEX ) ; /* in giá trị HEX của địa chỉ I2C */
nThiết bị ++;
}
khác nếu ( lỗi == 4 ) {
nối tiếp.print ( 'Lỗi không xác định tại địa chỉ 0x' ) ;
nếu ( Địa chỉ < 16 ) {
nối tiếp.print ( '0' ) ;
}
Nối tiếp.println ( địa chỉ, HEX ) ;
}
}
nếu ( nThiết bị == 0 ) {
Nối tiếp.println ( 'Không tìm thấy thiết bị I2C nào \N ' ) ; /* Nếu không có thiết bị I2C nào được đính kèm, hãy in thông báo này */
}
khác {
Nối tiếp.println ( 'xong \N ' ) ;
}
sự chậm trễ ( 5000 ) ; /* độ trễ nhất định kiểm tra xe buýt I2C mỗi 5 giây */
}

Đoạn mã trên sẽ quét các thiết bị I2C có sẵn. Mã bắt đầu bằng cách gọi thư viện dây để liên lạc I2C. Giao tiếp nối tiếp tiếp theo được bắt đầu bằng tốc độ baud.

Trong phần vòng lặp của mã quét I2C, hai tên biến, lỗi Địa chỉ được định nghia. Hai biến này lưu địa chỉ I2C của thiết bị. Tiếp theo, một vòng lặp for được khởi tạo sẽ quét địa chỉ I2C bắt đầu từ 0 đến 127 thiết bị.

Sau khi đọc địa chỉ I2C, đầu ra được in trên màn hình nối tiếp ở định dạng HEX.

Phần cứng

Ở đây chúng ta có thể thấy màn hình I2C OLED 0,96 inch được kết nối với bảng ESP32 ở chân GPIO 21 và 22. Vcc và GND của màn hình được kết nối với chân ESP32 3V3 và GND.

đầu ra
Ở đầu ra, chúng ta có thể thấy địa chỉ I2C của màn hình OLED được kết nối với bảng ESP32. Ở đây, địa chỉ I2C là 0X3C, vì vậy chúng tôi không thể sử dụng bất kỳ thiết bị I2C nào khác có cùng địa chỉ mà chúng tôi phải thay đổi địa chỉ I2C của thiết bị đó trước.

Chúng tôi đã lấy thành công địa chỉ I2C của màn hình OLED được kết nối với bảng ESP32.

Phần kết luận

Tìm địa chỉ I2C trong khi kết nối nhiều thiết bị với ESP32 là rất quan trọng vì các thiết bị chia sẻ cùng một địa chỉ I2C không thể được kết nối qua một bus I2C. Sử dụng mã ở trên, người ta có thể xác định địa chỉ I2C và nếu địa chỉ của hai thiết bị bất kỳ khớp với nhau thì địa chỉ đó có thể được thay đổi tương ứng tùy thuộc vào thông số kỹ thuật của thiết bị.