关于24C04的地址问题

chenjing1986   2009-3-26 17:10 楼主
  我用的是S3C410的开发板,想通过IIC往24C04里写点东西,我开发板附带的文档里说24C04的地址是1010,可我怎么写都写不进去,我十分怀疑这个地址的真实性,然后我看网上说2410的板子还有个24C02寄存器,地址是0X50,于是我往0X50这个地址写数据,结果成功了,现在我疑惑的是0X50这个地址真的是24C02的地址吗,有什么确认的方法没,还有为什么24C04的地址会是1010啊,总觉得这个地址怪怪的,为什么办法办附带的文档上并没有24C02的资料呢,2410板子上一共有哪些寄存器呢?他们的地址是多少呢,用什么方式能查看这些寄存器及其地址呢?
  呵呵,哪位达人帮我解解惑,感激不尽!!

回复评论 (7)

24C04的地址是1010,这个地址是IIC器件的设备地址,也就是说,所有的24C04的器件地址都是1010;
但是24C04的地址是7位(IIC总线的7位地址模式,第八位为读写位)的,厂商生产时只是制定了前4位(1010),后3位的地址决定于24C04几个管脚的接高接低;

找个24C04的Datasheet看看,就明白了。
点赞  2009-3-26 18:17
  有点糊涂,能结合代码解释下吗?怎么我写地址的时候是直接往0X50写的呢,这么以来1010这个地址有什么用呢?
点赞  2009-3-27 09:23
如果如你所说,那么一定是S3C410芯片I2C控制器的原因,可能有个I2C地址寄存器,而这个寄存器需要写的地址是不包括R/W位的地址。
而当向slave设备发送地址字节时会在最后一位加上读写位,
0xA0 | R/W = (0x50 << 1) | R/W; 红色操作可能是芯片I2C控制器自动完成的。
不管怎么说,slave设备看到一定是和自己地址匹配的地址。

这只是CPU I2C控制器处理上的细微差异,有的CPU就是这么约定,Microchip好像也是这样。
点赞  2009-3-27 09:51
引用: 引用 3 楼 zyzhang365 的回复:
如果如你所说,那么一定是S3C410芯片I2C控制器的原因,可能有个I2C地址寄存器,而这个寄存器需要写的地址是不包括R/W位的地址。
而当向slave设备发送地址字节时会在最后一位加上读写位,
0xA0 | R/W = (0x50 < < 1) | R/W; 红色操作可能是芯片I2C控制器自动完成的。
不管怎么说,slave设备看到一定是和自己地址匹配的地址。

这只是CPU I2C控制器处理上的细微差异,有的CPU就是这么约定,Microchip好像也是这样。

看看芯片手册应该就清楚了。
点赞  2009-3-27 09:52
  是这样的,我是再linux做的IIC读写,驱动程序是开发板自带的,已成功加载,我的程序如下:
#include
#include

#include
#include

#define CHIP_ADDR         0x50
#define PAGE_SIZE        0x06

#define I2C_DEV_PATH   "/dev/i2c-0"

static int read_eeprom(int fd, char buff[], int addr, int count)
{
        int res;
        if(write(fd, &addr, 1) != 1)
                return -1;

        res=read(fd, buff, count);
       

        return res;
}



int main(void)
{
        int fd, n, res;
        unsigned char buf[PAGE_SIZE];
       
        fd = open(I2C_DEV_PATH,  O_RDWR);
        if(fd < 0)
        {
                printf("####i2c test device open fail####\n");
                return (-1);
        }
        printf("success, i2c open file device %d \n",fd);
       

        res = ioctl(fd, I2C_TENBIT,0);                                                        //do not use 10bit address mode
        res = ioctl(fd, I2C_SLAVE_FORCE,CHIP_ADDR);                        //set slave device address
        printf("ioctl I2C_SLAVE_FORCE msg NO:%d\n",res);

        for(n=0; n                

       
        read_eeprom(fd, buf, 0, sizeof(buf));
           。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
我并没有用到1010的地址啊?
点赞  2009-3-27 11:10
#define CHIP_ADDR 0x50
0x50=0b10100000 >> 1;
你看看EEPROM的手册吧,这个1010只是器件高4位的地址。
点赞  2009-3-27 11:45
   英雄,太感谢了!!醍醐灌顶啊。。。。。。。。。。!!!!!!
点赞  2009-3-27 12:03
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复