OpenEdv-开源电子网

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

STM32模拟IIC问题

[复制链接]

59

主题

189

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
451
金钱
451
注册时间
2012-4-11
在线时间
1 小时
发表于 2012-4-18 21:14:25 | 显示全部楼层 |阅读模式
最近看不完全手册中的IIC程序有个地方不太明白请各位指教一番谢谢啦!!! 
//在AT24CXX指定地址读出一个数据
//ReadAddr:开始读数的地址
//返回值 :读到的数据
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);//发送高地址
IIC_Wait_Ack();
}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;
}

这段程序中的IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); 这句话怎么理解啊?
我知道要先写入0XA0之后再写入地址,怎么一次写入了2个字节的东西啊?为什么ReadAddr/256)<<1还左移一位啊???我明白ReadAddr/256是地址的高位。

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-4-18 21:16:06 | 显示全部楼层
24Cxx系列兼容的.不只是24C02.你看看24C512的datasheet .
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2012-4-13
在线时间
0 小时
发表于 2012-4-19 16:52:34 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); 这句话怎么理解啊?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-4-19 17:18:14 | 显示全部楼层
看1楼.
回复 支持 反对

使用道具 举报

5

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2012-4-13
在线时间
0 小时
发表于 2012-4-19 19:30:38 | 显示全部楼层
原子哥,还是不理解。IIC_Send_Byte(0XA0+((ReadAddr/256)<<1))这句话到底怎么理解?为什么要加A0?为什么还要左移?麻烦解释一下
回复 支持 反对

使用道具 举报

59

主题

189

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
451
金钱
451
注册时间
2012-4-11
在线时间
1 小时
 楼主| 发表于 2012-4-19 21:48:06 | 显示全部楼层
回复【5楼】坤哥:
---------------------------------
A0是要读数据  还是不太明白左移1位的意思
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-4-19 22:13:49 | 显示全部楼层
很简单,你就当我的代码不存在,自己依照24Cxx的数据手册去写一个代码出来.
就知道为什么这么写了!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

59

主题

189

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
451
金钱
451
注册时间
2012-4-11
在线时间
1 小时
 楼主| 发表于 2012-4-20 20:36:19 | 显示全部楼层
奥。是不是2402不需要左移而24c512需要啊???
我以前写2402的时候确实不需要左移啊
回复 支持 反对

使用道具 举报

5

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2012-4-13
在线时间
0 小时
发表于 2012-4-21 18:49:31 | 显示全部楼层
是不是将高位地址放到A2A1A0上?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-4-21 20:17:02 | 显示全部楼层
回复【8楼】shenhao7752376:
---------------------------------
回复【9楼】坤哥:
---------------------------------
是不是你自己试试可以知道结果呢?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2012-4-13
在线时间
0 小时
发表于 2012-4-22 18:25:37 | 显示全部楼层
按照你的意思,应该是这样的。但是A2A1A0应该都为零呀?
IIC_Send_Byte(0XA0); //发送写命令
IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr>>8);//发送高地址
IIC_Wait_Ack();
应该使用这种方式发送。为什么可以合成一句
IIC_Send_Byte(0XA0+((ReadAddr/256)<<1))?
回复 支持 反对

使用道具 举报

5

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2012-4-13
在线时间
0 小时
发表于 2012-4-22 19:52:29 | 显示全部楼层
原子哥,求详细解答。困扰了好多天。。。。。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-4-23 00:06:06 | 显示全部楼层
回复【11楼】坤哥:
---------------------------------
按照你的想法,把代码修改为你认为正确的样子.然后下载进去.看结果对不对.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2012-4-13
在线时间
0 小时
发表于 2012-4-23 20:19:32 | 显示全部楼层
             IIC_Start();  
//if(EE_TYPE>AT24C16)
//{
IIC_Send_Byte(0XA0);     //发送写命令
IIC_Wait_Ack();
IIC_Send_Byte(WriteAddr>>8);//发送高地址   
//}else IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));   //发送器件地址0XA0,写数据   
IIC_Wait_Ack();    
             IIC_Send_Byte(WriteAddr%256);   //发送低地址
IIC_Wait_Ack();          
IIC_Send_Byte(DataToWrite);     //发送字节    
IIC_Wait_Ack();           
             IIC_Stop(); //产生一个停止条件 
delay_ms(10);


改成这样,为什么不行?麻烦原子哥给个详细的解释
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-4-23 21:19:53 | 显示全部楼层
肯定不行了.
24C02都没有高位地址.你这样>>8位,移什么移....
所以要你认真看手册了.要有点悟性.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2012-8-20
在线时间
1 小时
发表于 2012-9-9 16:26:32 | 显示全部楼层

请问原子哥 EE_TYPE<AT24C16时,IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));这句中(WriteAddr/256)<<1)考虑的是取多个AT24CXX地址吧,左移就是使最低位是低,高三位是地址,是不是这样理解?EE_TYPE>AT24C16时,程序是不是没有考虑,就是默认一个AT24CXX?

 

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-9-9 16:47:25 | 显示全部楼层
因为24C16及以后的EEPROM芯片都没有地址选择位了,故没有判断。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2012-8-20
在线时间
1 小时
发表于 2012-9-9 20:08:36 | 显示全部楼层
24c16的没有我知道,24c512的有吧!


回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-9-9 20:45:23 | 显示全部楼层
还真是。。。
最好都接地吧。不需要一个IIC挂多个512的时候。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2012-8-20
在线时间
1 小时
发表于 2012-9-10 10:40:46 | 显示全部楼层
回复【19楼】正点原子:
还真是。。。
最好都接地吧。不需要一个IIC挂多个512的时候。
---------------------------------
知道了,谢了!
回复 支持 反对

使用道具 举报

9

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2013-9-20
在线时间
6 小时
发表于 2013-11-4 22:23:03 | 显示全部楼层
回复【5楼】坤哥:
原子哥,还是不理解。IIC_Send_Byte(0XA0+((ReadAddr/256)<<1))这句话到底怎么理解?为什么要加A0?为什么还要左移?麻烦解释一下
---------------------------------
回复【15楼】正点原子:
肯定不行了. 24C02都没有高位地址.你这样>>8位,移什么移.... 所以要你认真看手册了.要有点悟性.
---------------------------------
这个问题  听原子哥的  动手试一下就知道了  我也是试了结合数据手册知道的   由于24c02的WriteAddr是8位的,所以这里没有高8位,所以就是0了
回复 支持 反对

使用道具 举报

2

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2013-10-13
在线时间
0 小时
发表于 2013-12-1 13:29:11 | 显示全部楼层


我觉得那句IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));   //应该理解成这样,每个存储阵列只能存储2K的bit。24c04、24c08等就需要用到阵列地址了,向右移一位是因为上图所示,对吗?
回复 支持 反对

使用道具 举报

2

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2013-10-13
在线时间
0 小时
发表于 2013-12-1 13:29:53 | 显示全部楼层
回复【21楼】cyz8320350:
---------------------------------
看楼上
回复 支持 反对

使用道具 举报

25

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-5-10
在线时间
0 小时
发表于 2014-5-19 18:48:26 | 显示全部楼层

不是小于@¥C!^的都是8位字节地址吗
愈挫愈勇
回复 支持 反对

使用道具 举报

25

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-5-10
在线时间
0 小时
发表于 2014-5-19 18:51:08 | 显示全部楼层
回复【19楼】正点原子:
---------------------------------
原子哥,看我下面附的图,不是小于24c16的字地址都是八位吗?怎么是这样的呢?求原子哥帮忙
愈挫愈勇
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-19 21:26:43 | 显示全部楼层
8位怎么能表示24C02以上的芯片的全部容量???
2的8次方等于多少?256吧?
那超过256呢?怎么办?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

42

主题

208

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
383
金钱
383
注册时间
2014-6-12
在线时间
35 小时
发表于 2014-10-12 17:50:14 | 显示全部楼层
回复【3楼】坤哥:
---------------------------------
http://www.openedv.com/posts/list/0/40525.htm#230361
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-30 11:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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