I2C从入门到精通之四:I2C从设备的地址address
0赞0,引言
在上一篇文章我们讲解了《I2C从入门到精通之三:I2C信号的特性和操作》,今天我们继续接着介绍I2C从设备的地址address。Master主设备没有地址,只有从设备才有地址address,地址address是区分不同从设备的唯一标识。
所有I2C主题的文章都会收录在《深入浅出聊I2C》合集里,欢迎评阅。通过这个专集的阅读,你将成为I2C专家。

百度网盘分享的文件
上如是I2C学习资料和标准(pdf格式),需要下载的朋友,请关注本微信公众号“硬件工程师宝典”,在对话框内回复“I2C”,将获取标准下载链接。其中“I2C_Spec_Rev7_2021_UM10204.pdf”这份文件是最新的I2C specification, 希望大家重点阅读。
一、 I2C从设备为什么需要地址(怎么区别不同的I2C设备)
I2C(Inter-Integrated Circuit)从设备需要地址,主要原因是为了实现多主多从的总线通信机制,并确保数据能够准确地发送到目标设备。
多设备共享总线: I2C总线设计为允许多个主设备和多个从设备共享同一对通信线(SDA和SCL)。如果没有地址,主设备将无法知道它正在与哪个从设备通信,从设备也无法知道主设备发送的数据是给自己的。
选择目标设备: 地址是主设备用来“点名”特定从设备的唯一标识。当主设备想要与某个从设备通信时,它会首先广播该从设备的地址。只有地址匹配的从设备才会响应并参与后续的数据交换。
避免冲突: 在一个总线上有多个从设备时,地址机制可以防止数据冲突和混淆。每个从设备只响应自己的地址,从而确保通信的有序性。
协议要求: I2C协议本身就规定了在每次通信开始时,主设备必须发送从设备的地址,这是协议的基本组成部分。
二、 I2C从设备的地址有哪些类型
I2C(Inter-Integrated Circuit)设备的地址设置主要有以下几种类型,这些设置决定了主设备如何识别和选择总线上的从设备。
1. 7位地址 (7-bit Addressing)
这是I2C总线上最常见的地址类型。
构成: 一个7位的地址,加上一个读/写 (R/W) 位(第8位),共同构成一个字节(8位)。R/W位为0表示写操作,为1表示读操作。如图1所示。
因此,I2C地址要左移动一位给读写位。

图1. I2C从设备地址格式
地址范围: 理论上可以寻址128个设备(2^7),但其中有一些保留地址用于特殊功能(如通用呼叫地址、CBUS地址等),所以实际可用地址数量会少一些。
1) 设置方式:
固定地址 (Fixed Address):
许多不同类型的I2C设备(例如,温度传感器、EEPROM、实时时钟芯片等)由制造商分配了不同的默认7位I2C地址。
举例: 一个温度传感器的地址可能是0x48,而大多数EEPROM(如AT24C02)可能有一个固定的基础地址,例如0x50(二进制1010000)。由于它们的地址不同,主设备可以通过发送不同的地址来选择与哪个设备通信。
硬件可配置地址 (Hardware Configurable Address):
芯片上会提供一个或多个地址引脚(通常标记为A0, A1, A2等),用户可以通过将这些引脚连接到VCC(高电平)或GND(低电平)来设置地址的低位。这允许在同一I2C总线上连接多个相同型号的设备。
例子:
AT24C02 EEPROM: 常见的地址范围是0x50到0x57。它通常有3个地址引脚A0、A1、A2,如图2所示。

图2. AT24C02 EEPROM的地址pin脚
通过将这些引脚连接到高电平或低电平,可以设置地址的最后三位。例如,如果A0=GND, A1=GND, A2=GND,地址就是0x50;如果A0=VCC, A1=GND, A2=GND,地址就是0x51。以此类推,可以得到0x50到0x57共8个不同的地址,如图3所示。

图3. AT24C02 EEPROM的地址decode
A2 A1 A0 = GND GND GND -> 地址 0x50
A2 A1 A0 = GND GND VCC -> 地址 0x51
...
A2 A1 A0 = VCC VCC VCC -> 地址 0x57
这样,你就可以在同一I2C总线上连接多达8个AT24C02 EEPROM,每个都有唯一的地址。
主设备在通信时,会根据需要选择发送0x50、0x51等地址来与特定的EEPROM进行数据交换。
PCF8574 I/O扩展器: 常见地址范围是0x20到0x27。它也有3个地址引脚A0、A1、A2,通过同样的方式配置。
MPU6050 (陀螺仪/加速度计): 通常有一个AD0引脚。如果AD0接地,地址可能是0x68;如果AD0接VCC,地址可能是0x69。
2. 10位地址 (10-bit Addressing)
10位地址是为了扩展I2C总线的寻址能力而引入的,允许寻址更多的从设备(理论上可达1024个)。
构成: 10位地址需要两个字节来传输。
第一个字节: 包含一个特殊的起始码(11110),接着是10位地址的高2位,以及读/写 (R/W) 位。
第二个字节: 包含10位地址的低8位。
地址范围: 理论上可以寻址1024个设备(2^10)。
设置方式: 通常由制造商在芯片设计时确定,或者通过硬件引脚进行有限的配置。
例子: 某些特定的存储器或高性能传感器可能会使用10位地址。例如,某些高级的EEPROM或ADC(模拟数字转换器)设备可能会支持10位地址。
3. 总结
大多数常见的I2C设备都使用7位地址,并且通过硬件引脚(A0, A1, A2等)来配置地址的低位,以允许在同一总线上连接多个相同型号的设备。了解设备的地址设置方式是进行I2C通信编程的关键一步。
三、 哪些I2C地址被保留不能给从设备使用
在I2C(Inter-Integrated Circuit)通信协议中,为了实现特殊功能和协议的兼容性,有特定的地址被保留,不能分配给普通的从设备使用。这些保留地址确保了总线的正常运行和未来扩展性。
根据I2C规范,主要有两组地址范围被保留,它们是7位地址空间中的 0000 XXX 和 1111 XXX(其中X表示可以是0或1)。这意味着这些地址不能作为普通从设备的唯一地址。如图4所示。

图4 被保留的I2C地址
以下是具体的保留地址及其用途:
1) 0000 000 (0x00) - 通用呼叫地址 (General Call Address):
当主设备向此地址发送数据时,所有支持通用呼叫功能的从设备都会响应并接收数据。
通用呼叫地址的第二个字节通常包含进一步的指令,例如复位或写入可编程地址的部分。
如果R/W位为0,则表示通用呼叫写入。
2) 0000 000 (0x00) - START 字节 (START byte):
当R/W位为1时,此地址用于START字节。
它主要用于那些通过软件轮询SDA和SCL线的设备,允许它们在检测到总线活动时从低功耗模式唤醒并切换到更高的采样率。
3) 0000 001 (0x01) - CBUS 地址 (CBUS Address):
保留用于CBUS兼容性。CBUS是一种不再使用的总线格式。
I2C设备通常会忽略此地址。
4)0000 010 (0x02) - 保留用于不同总线格式 (Reserved for different bus formats):
此地址允许在I2C总线上混合使用I2C和其他协议。
只有那些能够处理这些不同格式和协议的I2C兼容设备才被允许响应此地址。
5) 0000 011 (0x03) - 保留用于未来用途 (Reserved for future purposes):
此地址被保留,以备I2C协议未来可能的扩展和新功能。
6) 0000 1XX (0x04 - 0x07) - 高速模式主设备代码 (High-Speed Master Code):
这些地址用于高速模式(Hs-mode)控制器代码,而不是作为从设备地址。
它们用于通知总线上的设备,即将进入高速模式,并“劝退”不兼容高速模式的设备。
7) 1111 0XX (0x78 - 0x7B) - 10位从设备寻址 (10-bit Slave Addressing):
此地址范围用作10位地址模式的第一个字节的起始码。
它不是一个从设备地址本身,而是指示接下来的字节将包含一个10位从设备地址。
8) 1111 1XX (0x7C - 0x7F) - 保留用于未来用途 (Reserved for future purposes):
此地址范围也被保留用于未来用途。
其中 1111 111 (0x7F) 有时也用于设备ID。
由于这些保留地址的存在,7位I2C地址空间中可用于普通从设备的地址数量从理论上的128个减少到112个。
四, 抛砖引玉
在接下来的文章中,我们将深入介绍I2C通信协议Protocol。掌握I2C通信协议Protocol就可以看懂I2C波形的含义,可以decode出数据流的读写操作的内涵。
敬请关注下一篇:《I2C从入门到精通之五:I2C通信协议Protocol-写操作》
五,参考文献:
需要以下参考文献(I2C标准)的朋友,请关注本微信公众号“硬件工程师宝典”,在对话框内回复“I2C”,将获取标准下载连接。其中“I2C_Spec_Rev7_2021_UM10204.pdf”这份文件是最新的I2C specification, 希望大家重点阅读。

百度网盘分享的文件
