5339|7

74

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于24C04的地址问题 [复制链接]

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

最新回复

   英雄,太感谢了!!醍醐灌顶啊。。。。。。。。。。!!!!!!  详情 回复 发表于 2009-3-27 12:03
点赞 关注

回复
举报

72

帖子

0

TA的资源

一粒金砂(初级)

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

找个24C04的Datasheet看看,就明白了。
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
  有点糊涂,能结合代码解释下吗?怎么我写地址的时候是直接往0X50写的呢,这么以来1010这个地址有什么用呢?
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

4
 
如果如你所说,那么一定是S3C410芯片I2C控制器的原因,可能有个I2C地址寄存器,而这个寄存器需要写的地址是不包括R/W位的地址。
而当向slave设备发送地址字节时会在最后一位加上读写位,
0xA0 | R/W = (0x50 << 1) | R/W; 红色操作可能是芯片I2C控制器自动完成的。
不管怎么说,slave设备看到一定是和自己地址匹配的地址。

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

回复

75

帖子

0

TA的资源

一粒金砂(初级)

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

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

看看芯片手册应该就清楚了。
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

6
 
  是这样的,我是再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的地址啊?
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

7
 
#define CHIP_ADDR 0x50
0x50=0b10100000 >> 1;
你看看EEPROM的手册吧,这个1010只是器件高4位的地址。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

8
 
   英雄,太感谢了!!醍醐灌顶啊。。。。。。。。。。!!!!!!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表