[PIC®/AVR®/dsPIC®产品] 查询I2C总线上设备地址的方法-扫描法

[复制链接]
 楼主| 小灵通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库):
  1. #include <Wire.h>

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

  8. void loop() {
  9.   byte error, address;
  10.   int nDevices;

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

  16.     if (error == 0) { // 收到ACK
  17.       Serial.print("I2C device found at address 0x");
  18.       if (address < 16) Serial.print("0");
  19.       Serial.print(address, HEX);
  20.       Serial.println(" !");
  21.       nDevices++;
  22.     } else if (error == 4) { // 收到其他错误(地址保留?)
  23.       Serial.print("Unknown error at address 0x");
  24.       if (address < 16) Serial.print("0");
  25.       Serial.println(address, HEX);
  26.     }
  27.   }
  28.   if (nDevices == 0) {
  29.     Serial.println("No I2C devices found\n");
  30.   } else {
  31.     Serial.println("Scan complete\n");
  32.   }
  33.   delay(5000); // 每5秒扫描一次
  34. }
稳稳の幸福 发表于 2025-7-27 19:03 | 显示全部楼层
这个方法好。
mintspring 发表于 2025-7-28 09:11 | 显示全部楼层
拉高拉低,测试。
穷得掉渣大侠 发表于 2025-7-28 10:03 | 显示全部楼层
这种扫描法确实直观,但效率如何?是否适用于所有I2C设备?
作业天敌在此 发表于 2025-7-28 18:29 | 显示全部楼层
这种方法确实直观,但要注意扫描时可能会对总线上的其他设备造成干扰。
734774645 发表于 2025-7-29 10:13 | 显示全部楼层
扫描法是一种常用的方法。
734774645 发表于 2025-7-29 10:13 | 显示全部楼层
比如设备上用到的哪些外设,可以根据扫描到的地址确认是哪个设备。
私藏人间 发表于 2025-8-6 11:09 | 显示全部楼层
有几个优势
I2C 总线设备地址扫描法的优势主要包括:

操作简便:无需提前知晓设备地址,通过遍历可能地址即可快速识别总线上的设备。
适用性广:适用于各种 I2C 设备,不受设备类型和品牌限制。
效率较高:能在短时间内完成对总线上所有设备地址的探测,节省人工排查时间。
便于调试:在电路设计或系统调试阶段,可快速确认设备是否正确连接到 I2C 总线。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

157

主题

1727

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部