I2C问题

jxz128   2010-4-3 10:35 楼主
大家好,我想问大家一个I2C的问题,下面我贴出程序段:
RMstatus init_i2c_tw( struct RUA *pInstance,
                                  RMuint8 delay,
                                  RMuint8 dev,
                                  RMuint8 i2c_data[][2],
                                  RMuint32 data_size)
{
        RMstatus err=RM_OK;
        RMuint32 i;
       
        struct I2C_DeviceParams_type i2c;
        struct I2C_WriteRMuint8_type i2c_write;
       
        i2c.PioClock = 0;
        i2c.PioData = 1;
        i2c.WrAddr = dev << 1;
        i2c.RdAddr = i2c.WrAddr | 0x01;
        i2c.DelayUs = delay;
上面是dev应该是设备地址,为什么i2c.WrAddr = dev << 1;以及i2c.RdAddr = i2c.WrAddr | 0x01;
呢?I2C的写地址和读地址不是一样的吗?

回复评论 (8)

楼主读写的地址应该是 设备地址+ 寄存器地址,

这里就问下,楼主读写的寄存器地址一样吗、、、
点赞  2010-4-4 15:18
为什么i2c.WrAddr = dev << 1
每个器件都有它自己的读写指令,至于为什么是dev左移1得到,那应该是dev跟写指令刚好有这个关系
i2c.RdAddr = i2c.WrAddr | 0x01;
呢?I2C的写地址和读地址不是一样的吗?
不一样,IIC的写指令是最后一们为0(bit7),读是1
IIC的操作顺序一般是
读/写命令+应答+要操作的寄存器地址+应答+要操作的数据
点赞  2010-4-4 20:02
地址的最低位,表示进行读操作,还是写操作

如果最低位为0 表示要执行写操作
如果最低位为1 表示要执行读操作
点赞  2010-4-5 17:23
设备地址是7位。而i2c内部的地址寄存器是8位。前7位用来存放你要写的设备地址,最后一位存放读写信号。
你的程序意思是写的目标设备地址是dev,读的目标地址也是dev。
点赞  2010-4-5 22:08
引用: 引用 4 楼 djistra 的回复:
设备地址是7位。而i2c内部的地址寄存器是8位。前7位用来存放你要写的设备地址,最后一位存放读写信号。
你的程序意思是写的目标设备地址是dev,读的目标地址也是dev。

ls的对的

有空可以看看iic的时序图。。
点赞  2010-4-6 13:13
谢谢大家~~这几天没得上网!!嗯~~四楼是正解~
点赞  2010-4-16 20:58
问一下为什么要
i2c.PioClock = 0;
i2c.PioData = 1;
这两条语句是什么用
点赞  2013-4-12 10:24
还有i2c.DelayUs = delay;
........
点赞  2013-4-12 10:26
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复