我有一个 ESP-WROOM-32(I2C 主)和一个 ATmega328p(I2C 从,地址 0x03)使用外部 6k8 上拉在原型 PCB 上组装。我像往常一样使用 ESP 的默认 I2C 引脚 21 (SDA) 和 22 (SCL),但是在运行下面的 I2C 扫描器时,我没有观察到总线上的任何通信。SDA 保持在高位,SCL 保持在低位。当我将它闪存到另一个单独的 ESP32 时,相同的草图按预期工作(在那里我看到总线上的通信,从地址 0x03 处识别出从设备)。我对此非常困惑!我很确定 PCB 上没有硬件问题,因为我在将其提供给制造商之前在面包板上对其进行了验证,并且在组装后我还用万用表测试了电路。在软件中以高频率切换引脚 21 和 22 也按预期工作。
因为我认为这与我的电路没有任何关系,所以我想知道是否有机会,我的 ESP 一直配置错误,或者制造商是否刷新了不同的固件版本......在用我的示波器调试之前,我刷新了使用 Wire.h、drivers/i2c.h 和 /peripherals/i2c.h 的草图,其中 I2C 设置在不同的引脚上(现在由于屏蔽,我无法访问这些引脚,所以我可以' t 检查是否有信号输出)。这些库之一是否将任何 I2C 配置存储到 SPIFFS 或类似的东西?!有没有人经历过 gpios 21 和 22 显示没有使用知名软件的活动,界面似乎甚至没有初始化?我无法想象我的芯片有问题......有什么想法吗?
使用过的 I2C 扫描仪(但我用 Wire.h、drivers/i2c 或外设/i2c.h 做的任何事情都重现了这个问题):
#include <Wire.h>
#define SDA_PIN 21
#define SCL_PIN 22
void setup () {
Wire.begin(SDA_PIN, SCL_PIN);
Serial.begin(115200);
Serial.println("\nI2C Scanner");
}
void loop () {
byte error, address;
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for (address = 1; address < 127; address++ ) {
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0) {
Serial.print("I2C device found at address 0x");
if (address<16) {
Serial.print("0");
}
Serial.print(address,HEX);
Serial.println(" !");
nDevices++;
}
else if (error==4) {
Serial.print("Unknown error at address 0x");
if (address<16) {
Serial.print("0");
}
Serial.println(address,HEX);
}
}
if (nDevices == 0) {
Serial.println("No I2C devices found\n");
}
else {
Serial.println("done\n");
}
delay(1000);
}