打印
[PIC®/AVR®/dsPIC®产品]

查询I2C总线上设备地址的方法-扫描法

[复制链接]
275|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小灵通2018|  楼主 | 2025-7-17 17:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
核心方法:地址扫描(I2C Bus Scanning)
这是最常用、最直接的方法。原理很简单:主控制器(如你的单片机、开发板或PC上的I2C适配器)尝试向所有可能的I2C地址(0x00 - 0x7F)发送一个探测信号(通常是发送START条件后跟地址字节+写位,然后观察是否有ACK响应)。

使用特权

评论回复
沙发
小灵通2018|  楼主 | 2025-7-17 17:04 | 只看该作者
准备硬件:

确保I2C总线连接正确:SCL(时钟线)、SDA(数据线)、GND(地线)。

确保所有设备都已正确上电(VCC/VDD)。

确保总线有合适的上拉电阻(通常在SCL和SDA线上拉到VCC,阻值范围在1KΩ - 10KΩ,常见4.7KΩ)。

断开或移除任何你已知地址的设备(如果它们可能干扰扫描过程或造成地址冲突)。

选择扫描工具/方法:

使用微控制器/开发板(如Arduino, Raspberry Pi Pico, STM32):

编写一个简单的扫描程序。

伪代码/Arduino示例 (基于Wire库):
#include <Wire.h>

void setup() {
  Wire.begin();        // 加入I2C总线作为主设备
  Serial.begin(9600);  // 启动串口用于输出结果
  while (!Serial);     // 等待串口连接(仅限Leonardo/Micro等)
  Serial.println("\nI2C Scanner");
}

void loop() {
  byte error, address;
  int nDevices;

  Serial.println("Scanning...");
  nDevices = 0;
  for (address = 1; address < 127; address++) { // 标准I2C地址范围是0x08(8)到0x77(119)
    Wire.beginTransmission(address);
    error = Wire.endTransmission();

    if (error == 0) { // 收到ACK
      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("Scan complete\n");
  }
  delay(5000); // 每5秒扫描一次
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

157

主题

1723

帖子

4

粉丝