I2C设备地址详解

转自:http://blog.csdn.net/zhijianjingling00/article/details/9294785

结论:

I2C设备的写地址 = I2C设备地址 << 1
I2C设备的读地址 = (I2C设备地址 << 1) + 1

例如:
#define     MAX_17040_BATTERY_I2C_ADDR        (0x36)
#define     MAX_17040_BATTERY_WRITE_ADDR    (MAX_17040_BATTERY_I2C_ADDR << 1)
#define     MAX_17040_BATTERY_READ_ADDR      ((MAX_17040_BATTERY_I2C_ADDR << 1) + 1)

AT24C02有三根地址线来进一步确定I2C设备的地址。说是进一步确定,是因为对于这类的I2C设备来说
其地址的一部分已经是确定好了的。

例如:数据手册上写道:
Device Address
1K/2K              1     0     1     0     A2    A1    A0    R/W

也就是说对于改I2C设备来说,地址的高8位已经确定了为1010,
而低四位则有A2 ----A0来确定  R/W来确定读写方向,读还是写。

例如,我们把A0 --A3全部拉低,则该设备的地址为0xA0.

在ARM中,读写方向是用寄存器的单独一位来确定的,有一个7位的域用来保存设备地址。
所以该I2C设备在ARM  I2C总线上的地址为
0xA0  右移一位 0x50.

如果A0--A2 有其他选择的话,则可以根据上述原则求得设备地址。

 

I2C设备地址

协议格式中第一个字节(为slave address)由7位地址和一位R/W读写位组成的,这字节是个器件地址。

 

常用IIC接口通用器件的器件地址是由种类型号,及寻址码组成的,共7位。

如格式如下:

D7 D6 D5 D4 D3 D2 D1 D0

1、器件类型:D7-D4 共4位决定的。这是由半导公司生产时就已固定此类型的了,也就是说这4位已是固定的。

 

2、用户自定义地址码:D3-D1共3位。这是由用户自己设置的,通常的作法如EEPROM这些器件是由外部IC的3个引脚所组合电平决定的(用常用的名字如A0,A1,A2)。这也就是寻址码。所以为什么同一IIC总线上同一型号的IC只能最多共挂8片同种类芯片的原因了。

 

3、最低一位就是R/W位,,“0”表示写,“1”表示读(通常读写信号中写上面有一横线,表示低电平)。所以I2C设备通常有两个地址,即读地址和写地址。

引用<<i2c 源代码情景分析>>里的话:“i2c 设备的7 位地址是就当前i2c 总线而言的,是“相对地址”。不同的i2c 总线上的设备可以使用相同的7 位地址,但是它们所在的i2c 总线不同。所以在系统中一个i2c 设备的“绝对地址”由二元组(i2c 适配器的ID 和设备在该总线上的7 位地址)表示。”,所以这个函数的作用主要是排除同一i2c总线上出现多个地址相同的设备。



  • 8
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
i2c-tools是一个Linux下的I2C总线工具,它提供了一组用户空间的程序,可以用来与I2C设备进行通信和调试。i2c-tools包含了以下工具: - i2cdetect:扫描I2C总线,查找I2C设备地址; - i2cdump:读取I2C设备的寄存器值; - i2cget:读取I2C设备的一个字节或多个字节; - i2cset:向I2C设备的寄存器写入一个字节或多个字节; - i2cprobe:测试I2C设备是否存在。 其中,i2cdetect是最常用的工具,可以帮助我们快速地扫描I2C总线上的设备,找到它们的地址i2cdump和i2cget可以读取设备的寄存器值,i2cset可以向设备的寄存器写入值。 使用i2c-tools之前,需要先确保I2C总线的驱动程序已经加载,可以使用lsmod命令查看是否已经加载了i2c-dev和i2c-bcm2835模块(如果是树莓派系统,则是i2c-bcm2708)。如果没有加载,可以使用modprobe命令加载。 接下来,我们以i2cdetect为例,介绍一下i2c-tools的使用方法。 i2cdetect命令语法: ``` i2cdetect [-y] [-a] [-q|-r] i2cbus [first last] ``` 参数说明: - -y:不需要确认,直接扫描设备地址; - -a:扫描所有地址,包括保留地址; - -q:以静默模式运行,只输出找到的地址; - -r:以详细模式运行,输出找到的地址设备型号; - i2cbus:I2C总线编号,例如0、1等; - first和last:设备地址范围,可以省略,如果省略,则默认扫描0x03~0x77之间的地址。 使用示例: 1. 扫描I2C总线0上的设备地址: ``` sudo i2cdetect -y 0 ``` 2. 扫描I2C总线1上的设备地址: ``` sudo i2cdetect -y 1 ``` 3. 扫描所有地址: ``` sudo i2cdetect -y -a 1 ``` 4. 扫描指定地址范围: ``` sudo i2cdetect -y 1 0x20 0x27 ``` 注意:使用i2cdetect命令时,需要使用sudo权限。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值