OpenEdv-开源电子网

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

关于IIC器件地址的问题!!

[复制链接]

26

主题

34

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2012-4-20
在线时间
13 小时
发表于 2012-5-6 16:43:19 | 显示全部楼层 |阅读模式

u8 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;
}红色部分是什么意思啊,如果我用24C08(最大容量1K)这个芯片现在我要向304这个单元写数据,难道发送的地址就应该是10100010嘛?我查了一下芯片手册,手册上列出如下:                     1K/2K: 1010A2A1A0R/W    4K:1010A2A1P0R/W   8K:1010A2P1P0R/W  16K:1010P2P1P0.其中A2A1A0对应的管脚应该是和实际电路连接有关,P2\P1\P0的值应该是任意,R/W表示读还是写,用1/0区分。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-5-6 18:53:59 | 显示全部楼层
回复【楼主位】hanhan0519:
---------------------------------
P0,P1不是任意呢.是地址的高位.
后面还有一句 IIC_Send_Byte(ReadAddr%256);   //发送低地址
发送低位地址.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2012-9-28
在线时间
0 小时
发表于 2012-10-10 10:32:02 | 显示全部楼层
回复【楼主位】hanhan0519:
u8 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
......
---------------------------------
你搞明白了吗?我也困惑这个问题
回复 支持 反对

使用道具 举报

4

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2012-9-28
在线时间
0 小时
发表于 2012-10-10 10:33:59 | 显示全部楼层
回复【楼主位】hanhan0519:
---------------------------------
楼主求解答啊!
回复 支持 反对

使用道具 举报

221

主题

501

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1238
金钱
1238
注册时间
2013-1-9
在线时间
121 小时
发表于 2013-1-30 14:33:39 | 显示全部楼层
也搞不明白这句话,顶起来求解,谢谢
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2013-1-30 15:53:37 | 显示全部楼层
我的程序跟这个差不多, 可能看的更清楚一些

分解开来就这个意思:

addr 是要访问的地址 , 而 IC_Address是硬件地址(P2\P1\P0的值) , rw是读写选择
<ageNum 是后面处理要用到的>
^^^^^^^^
……………………………………
case AT24C01:
case AT24C02:
StartByte = (0xA0|(IC_Address<<1)|rw);
PageNum = 8;
break;
case AT24C04:
StartByte = (0xA0|(IC_Address<<2)|((addr>>8)<<1)|rw);
PageNum = 16;
break ;

case AT24C08:
StartByte = (0xA0|(IC_Address<<3)|((addr>>8)<<2)|rw);
PageNum = 16;
break ;

case AT24C16:
StartByte = (0xA0|((addr>>8)<<3)|rw);
PageNum = 16;
break ;

case AT24C32:
                case AT24C64: 
PageNum = 32;
break ;
case AT24C128:
case AT24C256:
case AT24C512:
PageNum = 64;
break;
……
后面的 处理 如果 芯片型号是 24C16一下,则 数据为一个字节, &0xff就行 了
如果容量更大的 则 外部地址没用了, 两个字节的数据
回复 支持 反对

使用道具 举报

221

主题

501

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1238
金钱
1238
注册时间
2013-1-9
在线时间
121 小时
发表于 2013-1-30 20:39:42 | 显示全部楼层
u8 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,写数据    ,这句话改为else IIC_Send_Byte(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;
}

else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));   //发送器件地址0XA0,写数据 ,这句话改为else IIC_Send_Byte(0xA0);可以吗?

回复 支持 反对

使用道具 举报

221

主题

501

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1238
金钱
1238
注册时间
2013-1-9
在线时间
121 小时
发表于 2013-1-31 06:42:55 | 显示全部楼层
把 else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); 改成 else IIC_Send_Byte(0XA0);后,测试了一下读写也没问题
另外从24C04开始地址就要16位了,需要先给高八位,后给低八位,程序中为什么要从24C16开始判断呢?不解
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-1-31 10:38:34 | 显示全部楼层
回复【8楼】anazel:
---------------------------------
8个字节,能表示多宽的地址?
是不是只有256个?256个地址,容量是多少?是不是2K,也就是24C02
24C16是多大?2K字节.
AX是24Cxx的地址.
1楼也列出了,AX=1010    A2   A1   A0   R/W
也就是这个地址可以有3个位(A2,A1,A0)来表示字节地址,8+3=11.最大表示的范围是多少?是不是2的11次方?是不是2048,2K字节?
那么大于2K的时候,还能用AX+1个字节表示所有的地址么?明显不能了.
不能怎么办?
那就用2个字节表示地址!
2个字节可以表示多大?2的16次方,65536,最大可以表示到24C512.
也就是全系列了. 
所以2个字节就可以记录所有地址了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

221

主题

501

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1238
金钱
1238
注册时间
2013-1-9
在线时间
121 小时
发表于 2013-1-31 13:31:26 | 显示全部楼层
有点儿明白了,原子编的软件是针对全部8个IIC设备的,我以前编的都是只针对一个设备的,A2,A1,A0就是000,思维定式了,呵呵,是这个意思吗
回复 支持 反对

使用道具 举报

221

主题

501

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1238
金钱
1238
注册时间
2013-1-9
在线时间
121 小时
发表于 2013-2-2 07:27:08 | 显示全部楼层
1楼也列出了,AX=1010    A2   A1   A0   R/W 
也就是这个地址可以有3个位(A2,A1,A0)来表示字节地址

A2 A1 A0 应该是表示器件地址吧,从000到111,IIC总线可以接8个IIC器件

如果只接一个,而且器件地址是000,那不管是什么型号的EEPROM,最先发送的都是0XA0,然后是发送要读写的地址,只有24C02发一个地址,其他的都要先发个高地址,然后再发低地址



回复 支持 反对

使用道具 举报

221

主题

501

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1238
金钱
1238
注册时间
2013-1-9
在线时间
121 小时
发表于 2013-2-3 00:13:07 | 显示全部楼层
看了datasheet才明白
上图








回复 支持 反对

使用道具 举报

16

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2013-3-17
在线时间
13 小时
发表于 2013-6-23 15:20:19 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
原子哥,是一个字节表示的256个地址吧?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-6-23 16:24:04 | 显示全部楼层
回复【13楼】ejie+:
---------------------------------
一个字节可以表示256个地址.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

16

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2013-3-17
在线时间
13 小时
发表于 2013-6-23 16:34:33 | 显示全部楼层
回复【14楼】正点原子:
---------------------------------
我是看你说的下面这段话:
8个字节,能表示多宽的地址? 
是不是只有256个?256个地址,容量是多少?是不是2K,也就是24C02 
呵呵,是我太较真了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-6-23 20:31:10 | 显示全部楼层
回复【15楼】ejie+:
---------------------------------
没错吧?
256字节,24C02就是256字节容量啊,2K是指2K位.
而一个字节是8个位.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

16

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2013-3-17
在线时间
13 小时
发表于 2013-6-24 11:31:33 | 显示全部楼层
我的意思是在8楼你说的第一行“8个字节”是不是应该改成“1个字节”?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-6-24 16:10:19 | 显示全部楼层
回复【17楼】ejie+:
---------------------------------
是的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2013-10-12
在线时间
0 小时
发表于 2013-10-12 18:23:54 | 显示全部楼层
还好看了下面的评论,不然我想不通。。。回复【15楼】ejie+:

回复【14楼】正点原子:
---------------------------------
我是看你说的下面这段话:
8个字节,能表示多宽的地址? 
是不是只有256个?256个地址,容量是多少?是不是2K,也就是24C02 
呵呵,是我太较真了

---------------------------------
还好看了下面的评论,不然我想不通。。。
是块料吗?
回复 支持 反对

使用道具 举报

42

主题

208

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
383
金钱
383
注册时间
2014-6-12
在线时间
35 小时
发表于 2014-7-10 11:57:53 | 显示全部楼层
回复【12楼】anazel:
---------------------------------
这个不论哪种,从器件位不都是8位吗?看着好迷茫,这个iic
回复 支持 反对

使用道具 举报

69

主题

173

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
469
金钱
469
注册时间
2014-6-21
在线时间
0 小时
发表于 2014-8-24 10:54:59 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
回复【9楼】正点原子:
---------------------------------
A2A1A0表示的是从设备地址吧?怎么可以和AT24C02内存单元地址相混淆?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-8-24 23:49:28 | 显示全部楼层
回复【21楼】mengxiao1980:
---------------------------------
哪里相混淆了?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

69

主题

173

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
469
金钱
469
注册时间
2014-6-21
在线时间
0 小时
发表于 2014-8-25 10:43:10 | 显示全部楼层
回复【22楼】正点原子:
---------------------------------
A2A1A0表示的是从设备地址,你算11位内存地址的时候不是也把A2A1A0算进去了吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-8-25 14:58:39 | 显示全部楼层
回复【23楼】mengxiao1980:
---------------------------------
对于芯片的A0,A1,A2脚:
24C01/02,A0,A1,A2都是从设备地址。
24C04,A1,A2是从设备地址,A0没用
24C08,A2是从设备地址,A0,A1没用
24C16及以上,A0,A1,A2都没用了。

理解不了以上话语,那就回去好好看数据手册。
这问题你问了N个帖子,不知道哪里有这么难懂。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

23

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2014-10-18
在线时间
1 小时
发表于 2014-12-31 11:20:02 | 显示全部楼层
回复【24楼】正点原子:
---------------------------------
这个我也不懂,查了一上午资料,也问了好多人,还是不懂
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-31 23:29:09 | 显示全部楼层
回复【25楼】笨笨的小马驹爱奔跑:
---------------------------------
接着看资料
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

10

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
161
金钱
161
注册时间
2015-1-17
在线时间
16 小时
发表于 2015-9-1 09:28:56 | 显示全部楼层
回复【24楼】正点原子:
---------------------------------
你这句话的另一个意思是不是如果我要用这个芯片.
如果在一条总线上,挂AT24C16只能挂一片了?因为地址不够用.
如果非要挂两片AT24C16,必须在不同的总线上??
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-9-1 21:48:49 | 显示全部楼层
回复【27楼】叶萌球:
---------------------------------
是的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-15 22:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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