UnoRP2040 I2C扫描
December 13, 2023About 3 min
I2C扫描
许多传感器、显示器和设备可以通过I2C连接。I2C是一个双路“总线”,允许多个设备在一组引脚上连接,因此,布线非常方便!使用主板时,您可能需要连接I2C设备,第一次可能会有点棘手。调试I2C的最佳方法是检查清单,然后执行I2C扫描。
常见的I2C连接问题
- 您是否为每个I2C设备连接了四根电线(至少)?
用微控制器板的任何逻辑电平(可能是3.3V)为设备供电,然后是接地线、SCL时钟线和SDA数据线。 - 如果你使用的是STEMMA QT板
请检查电源LED是否亮了,它通常是板右侧的红色LED。 - STEMMA QT/I2C端口是否有可切电源或下拉?
为了减少功率,一些电路板能够切断I2C设备或上拉电阻的电源。如果您必须做一些特殊的事情来打开电源或上拉。 - 如果您使用的是DIY I2C设备,您有上拉电阻吗?
许多电路板没有内置上拉电阻,它们是必需的!我们建议任何常见的2.2K到10K电阻。您需要两个:一个从SDA连接到正功率,从SCL连接到正功率。同时,正功率(又指VCC、VDD、或V+)通常是3.3V。 - 你有地址冲突吗?
每个地址只能有一个板子。 因此,你不能,比如说,将两个AHT20连接到一个I2C端口,因为它们具有相同的地址,并且会干扰。 检查传感器或文档中的地址。 有时有办法调整地址。 - 您的电路板有多个I2C端口吗?
从历史上看,木板只带一个。但现在你可以有两个甚至三个!这可以帮助解决“嘿,但如果我想要两个地址相同的设备”的问题:只需在每条总线上放一个。 - 你是热插拔设备吗?
I2C不支持动态重新连接,您无法随意连接和断开传感器。它们都应该在启动时连接,而不是更改。(唯一的例外是,如果您使用的是热插拔助理,但这会花费您)。 - 你保持通信总长度合理吗?
I2C的设计长度可能为6英寸。我们喜欢用即插即用电缆推动它,但真的,请尽可能缩短它们!(唯一的例外是,如果您使用的是活动总线扩展器)。
硬件连接
按照如下硬件连接将 0.96 OLED显示屏 连接到 UnoRP2040。
UnoRP2040 | 0.96寸 OLED |
---|---|
3V3 | VCC |
GND | GND |
SCL | SCL |
SDA | SDA |
执行I2C扫描
步骤1.安装TestBed库
要扫描I2C,使用Adafruit TestBed库。这个库和示例只是使扫描更容易运行,因为它处理了一些基础知识。您需要通过安装库来添加支持。好消息:做这件事很容易。转到Arduino库管理器。
步骤2.搜索TestBed并安装Adafruit TestBed库
步骤3.现在打开I2C扫描示例
或将以下代码复制并粘贴到 Arduino IDE 中
#include <Adafruit_TestBed.h>
extern Adafruit_TestBed TB;
#define DEFAULT_I2C_PORT &Wire
// Some boards have TWO I2C ports, how nifty. We should scan both
#if defined(ARDUINO_ARCH_RP2040) \
|| defined(ARDUINO_ADAFRUIT_QTPY_ESP32S2) \
|| defined(ARDUINO_ADAFRUIT_QTPY_ESP32S3_NOPSRAM) \
|| defined(ARDUINO_ADAFRUIT_QTPY_ESP32S3) \
|| defined(ARDUINO_ADAFRUIT_QTPY_ESP32_PICO) \
|| defined(ARDUINO_SAM_DUE) \
|| defined(ARDUINO_ARCH_RENESAS_UNO)
#define SECONDARY_I2C_PORT &Wire1
#endif
void setup() {
Serial.begin(115200);
// Wait for Serial port to open
while (!Serial) {
delay(10);
}
delay(500);
Serial.println("Adafruit I2C Scanner");
#if defined(ARDUINO_ADAFRUIT_QTPY_ESP32S2) || \
defined(ARDUINO_ADAFRUIT_QTPY_ESP32S3_NOPSRAM) || \
defined(ARDUINO_ADAFRUIT_QTPY_ESP32S3) || \
defined(ARDUINO_ADAFRUIT_QTPY_ESP32_PICO)
// ESP32 is kinda odd in that secondary ports must be manually
// assigned their pins with setPins()!
Wire1.setPins(SDA1, SCL1);
#endif
#if defined(ARDUINO_ADAFRUIT_FEATHER_ESP32S2)
// turn on the I2C power by setting pin to opposite of 'rest state'
pinMode(PIN_I2C_POWER, INPUT);
delay(1);
bool polarity = digitalRead(PIN_I2C_POWER);
pinMode(PIN_I2C_POWER, OUTPUT);
digitalWrite(PIN_I2C_POWER, !polarity);
#endif
#if defined(ARDUINO_ADAFRUIT_FEATHER_ESP32S2_TFT)
pinMode(TFT_I2C_POWER, OUTPUT);
digitalWrite(TFT_I2C_POWER, HIGH);
#endif
#if defined(ARDUINO_ADAFRUIT_FEATHER_ESP32S2_REVTFT)
pinMode(TFT_I2C_POWER, OUTPUT);
digitalWrite(TFT_I2C_POWER, HIGH);
#endif
#if defined(ADAFRUIT_FEATHER_ESP32_V2)
// Turn on the I2C power by pulling pin HIGH.
pinMode(NEOPIXEL_I2C_POWER, OUTPUT);
digitalWrite(NEOPIXEL_I2C_POWER, HIGH);
#endif
}
void loop() {
Serial.println("");
Serial.println("");
Serial.print("Default port (Wire) ");
TB.theWire = DEFAULT_I2C_PORT;
TB.printI2CBusScan();
#if defined(SECONDARY_I2C_PORT)
Serial.print("Secondary port (Wire1) ");
TB.theWire = SECONDARY_I2C_PORT;
TB.printI2CBusScan();
#endif
delay(3000); // wait 3 seconds
}
现象
串口会打印出扫描的I2C
疑难解答
更多问题及有趣的应用,请访问论坛 或加入QQ技术交流群:522420541