嵌入式之路 发表于 2024-2-18 00:16:18

关于IIC的地址

请问下各位佬,我这边使用89c51和32G扫描IIC地址从0x00 到 0x127 来扫描挂载在总线的一个AT24C256。得到的地址是0xa0. 然后我使用Arduino nano对这个IIC重新进行扫描,得到的地址是0x50.
Nano的可以正常读取和写入。 32G和C51的可能存在点问题,有时候可以正常读取有时候不能。 我用STM32 也读取了这个0xa0 也是有时候可以有时候不可以。 0x50是绝对不可以在STM32上的。但是可以在Nano上或者esp32上。
有没有大佬知道这到底是一个什么情况。


王昱顺 发表于 2024-2-18 01:41:40

首先你要明白,iic的有效地址是高七位。
这里就产生了一个问题,如何表示这个地址
有将地址放在高七位,最低位补零的。也有把地址放在低七位,最高位补零的。
比如说你的这个0xa0,换算二进制是10100000,显然是高七位存法
同样的,0x50则是01010000,相比上面的向右移动了一位,是低七位存法。
本质上这两个没什么区别
具体使用为什么不行呢?是因为上面两种存法转换成读地址和写地址的算法过程不一样,当然是不能乱用的了

电子DIY小家 发表于 2024-2-18 08:06:37

1.“我这边使用89c51和32G扫描IIC地址从0x00 到 0x127 来扫描挂载在总线的一个AT24C256”,这里的设备地址应该是0-127扫描,不应该会到16位的地址吧
2.至于地址0X50和0XA0,IIC的地址是如下定义的


实际上发送的第一个字节的前面七位就是设备地址,最后一个读写位,0XA0是 0x50<<1 | 0的结果了,器件地址是0X50(七位二进制数),但是这个七位要放到高七位,所以左移一下,最后一位写0是写入器件,写1是读取器件

21cnsound 发表于 2024-2-18 09:04:45

IIC的有效地址或者协议中规定的地址是7位,8位地址(7位标准地址左移1位再加读写位)是不规范的说法。
所以,猜测 “使用89c51和32G扫描AT24C256得到的地址是0xa0”,这里的0xa0就是不规范的8位地址,扫描结果没问题。这个可以从代码分析出来。

至于32G和C51读写这个AT24C256不稳定,可能和时序有关,可以调整晶振频率或代码中的延迟试试,最好是用逻辑分析仪看时序。

嵌入式之路 发表于 2024-2-18 19:47:35

电子DIY小家 发表于 2024-2-18 08:06
1.“我这边使用89c51和32G扫描IIC地址从0x00 到 0x127 来扫描挂载在总线的一个AT24C256”,这里的设备地址 ...

谢谢老师

嵌入式之路 发表于 2024-2-18 19:48:10

21cnsound 发表于 2024-2-18 09:04
IIC的有效地址或者协议中规定的地址是7位,8位地址(7位标准地址左移1位再加读写位)是不规范的说法。
所以 ...

我抓一下详细分析下
页: [1]
查看完整版本: 关于IIC的地址