控制空荡荡 发表于 2025-4-3 10:19

求助例程I2C地址问题

#define I2C_MASTER_ADDR   0x30
#define I2C_SLAVE_ADDR    0x80
为什么实际主机和从机的地址都是除以2的?

神话编织者 发表于 2025-4-22 22:55

这个和I2C外设地址寄存器相关。
I2C地址寄存器最低位为发送接收方向位,故寄存器写入的值为左移1位的数值。而楼主所谓的实际地址为I2C的7位地址表示方法,即不含低位的发送接收方向位。

flycamelaaa 发表于 2025-5-27 11:10

在I2C通信协议中,主机(Master)和从机(Slave)的地址通常以7位或10位形式表示,但实际在数据传输过程中,这些地址会左移一位(即乘以2),以腾出最低位用于读写(R/W)操作指示。

powerantone 发表于 2025-5-27 11:12

I2C协议规定,地址传输时需要腾出最低位给R/W标志。
7位地址左移一位后,最低位用于指示读写操作。

suncat0504 发表于 2025-5-28 18:27

B0位专门用做读写的标志位,地址中是补考阔这个标志位的。实际应用的时候,地址左移1位(相当于乘以2了),再加上标志读写的位。

g0d5xs 发表于 2025-6-4 11:42

在I2C通信中,主机地址(I2C_MASTER_ADDR)和从机地址(I2C_SLAVE_ADDR)实际写入硬件寄存器时需要“除以2”(即右移1位),这与I2C协议的地址编码规则及硬件实现机制密切相关

d1ng2x 发表于 2025-6-4 13:02

标准I2C协议规定设备地址为7位(0b0000000~0b1111111),但实际传输时需与读写位(R/W)组合成8位数据帧(0bA6A5A4A3A2A1A0R/W)。

lamanius 发表于 2025-6-4 14:01

用户定义的地址(如0x30、0x80)通常是7位地址,但写入硬件寄存器时需处理为8位格式。

l1uyn9b 发表于 2025-6-4 15:22

I2C控制器(如MCU的I2C外设)内部寄存器通常要求写入8位地址,其中:高7位:用户定义的7位地址(A6~A0)。最低位(LSB):读写位(R/W),由软件通过指令区分(0=写,1=读)。

tax2r6c 发表于 2025-6-4 16:32

硬件自动拼接,用户仅需提供7位地址,硬件会在发送时自动左移1位并补入读写位。

w2nme1ai7 发表于 2025-6-4 18:13

左移1位等价于×2:在代码中,若硬件要求写入8位地址(含读写位),而用户仅提供7位地址,则需手动左移1位(或×2)以填充最高位。

q1ngt12 发表于 2025-6-4 19:14

若从机地址0x80左移1位后为0x100(9位),可能超出8位寄存器范围。此时需确认硬件是否支持扩展地址模式(10位地址),或用户实际使用的是7位地址的0x40(0x80 >> 1)。

y1n9an 发表于 2025-6-5 08:25

部分厂商文档可能直接提供8位地址(含读写位),此时用户无需左移。例如:文档标注0x60为写地址,0x61为读地址,则用户直接使用0x60和0x61,无需左移。

zhizia4f 发表于 2025-6-5 10:06

库函数差异,不同I2C库对地址的处理方式不同:HAL库,通常要求用户提供7位地址,库函数内部左移并补入读写位。

ex7s4 发表于 2025-6-5 12:00

裸机寄存器操作,需用户手动左移并拼接读写位。
页: [1]
查看完整版本: 求助例程I2C地址问题