打印
[N32G45x]

求助例程I2C地址问题

[复制链接]
739|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
控制空荡荡|  楼主 | 2025-4-3 10:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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位地址左移一位后,最低位用于指示读写操作。

使用特权

评论回复
5
suncat0504| | 2025-5-28 18:27 | 只看该作者
B0位专门用做读写的标志位,地址中是补考阔这个标志位的。实际应用的时候,地址左移1位(相当于乘以2了),再加上标志读写的位。

使用特权

评论回复
6
g0d5xs| | 2025-6-4 11:42 | 只看该作者
在I2C通信中,主机地址(I2C_MASTER_ADDR)和从机地址(I2C_SLAVE_ADDR)实际写入硬件寄存器时需要“除以2”(即右移1位),这与I2C协议的地址编码规则及硬件实现机制密切相关

使用特权

评论回复
7
d1ng2x| | 2025-6-4 13:02 | 只看该作者
标准I2C协议规定设备地址为7位(0b0000000~0b1111111),但实际传输时需与读写位(R/W)组合成8位数据帧(0bA6A5A4A3A2A1A0R/W)。

使用特权

评论回复
8
lamanius| | 2025-6-4 14:01 | 只看该作者
用户定义的地址(如0x30、0x80)通常是7位地址,但写入硬件寄存器时需处理为8位格式。

使用特权

评论回复
9
l1uyn9b| | 2025-6-4 15:22 | 只看该作者
I2C控制器(如MCU的I2C外设)内部寄存器通常要求写入8位地址,其中:高7位:用户定义的7位地址(A6~A0)。最低位(LSB):读写位(R/W),由软件通过指令区分(0=写,1=读)。

使用特权

评论回复
10
tax2r6c| | 2025-6-4 16:32 | 只看该作者
硬件自动拼接,用户仅需提供7位地址,硬件会在发送时自动左移1位并补入读写位。

使用特权

评论回复
11
w2nme1ai7| | 2025-6-4 18:13 | 只看该作者
左移1位等价于×2:在代码中,若硬件要求写入8位地址(含读写位),而用户仅提供7位地址,则需手动左移1位(或×2)以填充最高位。

使用特权

评论回复
12
q1ngt12| | 2025-6-4 19:14 | 只看该作者
若从机地址0x80左移1位后为0x100(9位),可能超出8位寄存器范围。此时需确认硬件是否支持扩展地址模式(10位地址),或用户实际使用的是7位地址的0x40(0x80 >> 1)。

使用特权

评论回复
13
y1n9an| | 2025-6-5 08:25 | 只看该作者
部分厂商文档可能直接提供8位地址(含读写位),此时用户无需左移。例如:文档标注0x60为写地址,0x61为读地址,则用户直接使用0x60和0x61,无需左移。

使用特权

评论回复
14
zhizia4f| | 2025-6-5 10:06 | 只看该作者
库函数差异,不同I2C库对地址的处理方式不同:HAL库,通常要求用户提供7位地址,库函数内部左移并补入读写位。

使用特权

评论回复
15
ex7s4| | 2025-6-5 12:00 | 只看该作者
裸机寄存器操作,需用户手动左移并拼接读写位。

使用特权

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

本版积分规则

2

主题

4

帖子

0

粉丝