OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4307|回复: 7

关于IIC实验里面我的一点小疑惑

[复制链接]

5

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
366
金钱
366
注册时间
2016-6-2
在线时间
46 小时
发表于 2016-9-14 11:16:18 | 显示全部楼层 |阅读模式
2金钱
8 AT24CXX_ReadOneByte(u16 ReadAddr)
{                                  
        u8 temp=0;                                                                                                                                                               
    IIC_Start();  
        if(EE_TYPE>AT24C16)
        {
                IIC_Send_Byte(0XA0);           //发送写命令
                IIC_Wait_Ack();
                IIC_Send_Byte(ReadAddr>>8);//发送高地址            
        }else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));   //发送器件地址0XA0,写数据           
        IIC_Wait_Ack();
    IIC_Send_Byte(ReadAddr%256);   //发送低地址
        IIC_Wait_Ack();            
        IIC_Start();                     
        IIC_Send_Byte(0XA1);           //进入接收模式                          
        IIC_Wait_Ack();         
    temp=IIC_Read_Byte(0);                  
    IIC_Stop();//产生一个停止条件            
        return temp;
}
这段代码里面if条件判断是不是应该是EE_TYPE>AT24C02,对于24c02来说容量已经达到了256个字节,是八位数据地址所能表示的最大容量,在后面的容量更大的应该数据地址都不止八位了吧,也就会有高地址了。

最佳答案

查看完整内容[请看2#楼]

但是执行发送高地址的那一步有个判断条件啊,我就是觉得这个判断条件不够合理,超过了24C02之后就要发送高地址了,但是程序里面是大于24C16之后才会发送高地址
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
366
金钱
366
注册时间
2016-6-2
在线时间
46 小时
 楼主| 发表于 2016-9-14 11:16:19 | 显示全部楼层
xuande 发表于 2016-9-14 11:29
你说的只是“低地址”字节,
“高地址”字节也有几位是“地址”。

但是执行发送高地址的那一步有个判断条件啊,我就是觉得这个判断条件不够合理,超过了24C02之后就要发送高地址了,但是程序里面是大于24C16之后才会发送高地址
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11549
金钱
11549
注册时间
2014-4-1
在线时间
1316 小时
发表于 2016-9-14 11:29:59 | 显示全部楼层

你说的只是“低地址”字节,
“高地址”字节也有几位是“地址”。


回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11549
金钱
11549
注册时间
2014-4-1
在线时间
1316 小时
发表于 2016-9-18 13:58:28 | 显示全部楼层
本帖最后由 xuande 于 2016-9-18 14:01 编辑

你可能搞错了,
24c16以下(含16)最多需要11位地址,不需要“高地址”。
超出8位的包含到“写命令”里面了。

所以,你复制的代码基本没错。
说“基本”,因为只支持到大概24C512,但还有更高容量的芯片。


回复

使用道具 举报

5

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
366
金钱
366
注册时间
2016-6-2
在线时间
46 小时
 楼主| 发表于 2016-9-18 15:34:03 | 显示全部楼层
xuande 发表于 2016-9-18 13:58
你可能搞错了,
24c16以下(含16)最多需要11位地址,不需要“高地址”。
超出8位的包含到“写命令”里面 ...

谢谢,我在另一个帖子里面已经弄懂了,视频里面没讲清楚,非常感谢
回复

使用道具 举报

32

主题

230

帖子

0

精华

高级会员

Rank: 4

积分
508
金钱
508
注册时间
2016-4-14
在线时间
113 小时
发表于 2016-10-8 15:55:07 | 显示全部楼层
sky1234 发表于 2016-9-18 15:34
谢谢,我在另一个帖子里面已经弄懂了,视频里面没讲清楚,非常感谢

我跟你是一样的疑惑~24c16以下最多需要11位地址,不需要高地址?什么意思?怎么理解。。。包含到写命令里面?
回复

使用道具 举报

5

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
366
金钱
366
注册时间
2016-6-2
在线时间
46 小时
 楼主| 发表于 2016-10-9 12:22:20 | 显示全部楼层
Ldd69stm32 发表于 2016-10-8 15:55
我跟你是一样的疑惑~24c16以下最多需要11位地址,不需要高地址?什么意思?怎么理解。。。包含到写命令里 ...

在AT24C01/02里面A0 A1 A2是片选地址,在AT24C04/C08/C16里面,那些不连接的引脚,把它们用作空间寻址用的地址了,最多刚好可以到11位,实现对所有数据地址的寻址。这也是为什么AT24C16最多只能接一个的原因,再多了就没有位来实现片选管理了。
回复

使用道具 举报

32

主题

230

帖子

0

精华

高级会员

Rank: 4

积分
508
金钱
508
注册时间
2016-4-14
在线时间
113 小时
发表于 2016-10-11 13:38:02 | 显示全部楼层
sky1234 发表于 2016-10-9 12:22
在AT24C01/02里面A0 A1 A2是片选地址,在AT24C04/C08/C16里面,那些不连接的引脚,把它们用作空间寻址用 ...

搞明白了~谢谢你哈~看了原子那个例子以为全接地呢~好吧~
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-13 17:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表