OpenEdv-开源电子网

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

本实验是24c02 ,所以if(EE_TYPE>AT24C16)一定不会成立,所以是不是只有比24c16大的存储器时才执行if里边语句?

[复制链接]

111

主题

265

帖子

0

精华

高级会员

Rank: 4

积分
740
金钱
740
注册时间
2014-3-4
在线时间
6 小时
发表于 2014-3-7 21:03:36 | 显示全部楼层 |阅读模式
问题一:本实验是24c02  ,所以if(EE_TYPE>AT24C16)一定不会成立,所以是不是只有比24c16大的存储器时才执行if里边语句?


问题二:else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));   //发送器件地址0XA0,写数据 
这句0xa0是24c02的地址吧?   从那能看到这个板子24c02是这个地址,还是说24c02在什么板子都是这个地址??

问题三: IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));   //发送器件地址0XA0,写数据     这一句再详细解释一下+((ReadAddr/256)<<1这个怎么回事

问题四:IIC_Send_Byte(ReadAddr%256);   //发送低地址      这里%256)为什么??

//在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);//发送高地址    
}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;
}


问题一:本实验是24c02  ,所以if(EE_TYPE>AT24C16)一定不会成立,所以是不是只有比24c16大的存储器时才执行if里边语句?


问题二:else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));   //发送器件地址0XA0,写数据 
这句0xa0是24c02的地址吧?   从那能看到这个板子24c02是这个地址,还是说24c02在什么板子都是这个地址??

问题三: IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));   //发送器件地址0XA0,写数据     这一句再详细解释一下+((ReadAddr/256)<<1这个怎么回事

问题四:IIC_Send_Byte(ReadAddr%256);   //发送低地址      这里%256)为什么??

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-3-7 21:29:11 | 显示全部楼层
1,是
2,如果24C02的A0~A2都接GND,地址就是这个。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 3 反对 0

使用道具 举报

11

主题

42

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
356
金钱
356
注册时间
2015-11-28
在线时间
71 小时
发表于 2015-12-28 10:04:24 | 显示全部楼层
原子哥霸气
回复 支持 0 反对 1

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-3-7 21:36:18 | 显示全部楼层
3,这里只有当EEPROM容量大于24C02,小于等于24C16的时候才会有用,这个区间的24Cxx器件,一个字节不足以表示其所有的地址范围,比如24c16,最大地址是2047,也就是:111 1111 1111,去掉8位,刚好还剩3位,所以这个3位就用 0XA0的3:1(最低位用来表示读还是写,所以不能占用),这三个位表示了,(ReadAddr/256)<<1,就是得到这个3位的取值。

4,当容量大于24C16的时候,3位就不够用了,所以,干脆用2个字节表示地址范围,%256,就是取低8位地址啊。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 0 反对 1

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

111

主题

265

帖子

0

精华

高级会员

Rank: 4

积分
740
金钱
740
注册时间
2014-3-4
在线时间
6 小时
 楼主| 发表于 2014-3-8 11:46:41 | 显示全部楼层
回复【3楼】正点原子:

3,这里只有当EEPROM容量大于24C02,小于等于24C16的时候才会有用,这个区间的24Cxx器件,一个字节不足以表示其所有的地址范围,比如24c16,最大地址是2047,也就是:111 1111 1111,去掉8位,刚好还剩3位,所以这个3位就用 0XA0的3:1(最低位用来表示读还是写,所以不能占用),这三个位表示了,(ReadAddr/256)<<1,就是得到这个3位的取值。
4,当容量大于24C16的时候,3位就不够用了,所以,干脆用2个字节表示地址范围,%256,就是取低8位地址啊。

---------------------------------
原子哥辛苦了
那么对于24c02来说else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));  这一句其实里括号里边算完边就还是0XA0吧
回复 支持 反对

使用道具 举报

4

主题

18

帖子

0

精华

高级会员

Rank: 4

积分
741
金钱
741
注册时间
2015-5-9
在线时间
236 小时
发表于 2015-8-10 20:24:54 | 显示全部楼层
好帖子,顶起来,正好最近要用。
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2015-7-22
在线时间
3 小时
发表于 2015-11-12 15:00:34 | 显示全部楼层
学习了。谢谢
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2015-12-6
在线时间
2 小时
发表于 2015-12-6 11:38:10 | 显示全部楼层
明白了
回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2016-8-25
在线时间
2 小时
发表于 2016-11-1 14:31:04 | 显示全部楼层
如果器件改为24C08这个程序要不要改;接线方式一样
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-2-16
在线时间
8 小时
发表于 2017-9-25 23:15:41 | 显示全部楼层
正点原子 发表于 2014-3-7 21:36
3,这里只有当EEPROM容量大于24C02,小于等于24C16的时候才会有用,这个区间的24Cxx器件,一个字节不足以表 ...

还是不太明白,既然地址是11位的,那么为什么不直接分别写高低位地址呢?(ReadAddr/256)<<1 这一句已经把9到11位编程10到12位了呢?
回复 支持 反对

使用道具 举报

3

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2017-9-26
在线时间
9 小时
发表于 2017-10-7 17:49:46 | 显示全部楼层
u8 temp;
        //&Iuml;&Egrave;&ETH;&acute;
        IIC_Star();
        delay_us(2);
        IIC_Sendbyte(0XA0);//send×&acute;&Igrave;&not;&Ograve;&sup2;&frac34;&Iacute;&Ecirc;&Ccedil;&pound;&not;IO&iquest;&Uacute;&Icirc;&ordf;&Ecirc;&auml;&sup3;&ouml;×&acute;&Igrave;&not;
        IIC_wait_ACK();
        //&Ocirc;&Uacute;&para;&Aacute;
        IIC_Star();
        IIC_Sendbyte(0XA1);//send×&acute;&Igrave;&not;&Ograve;&sup2;&frac34;&Iacute;&Ecirc;&Ccedil;&pound;&not;IO&iquest;&Uacute;&Icirc;&ordf;&Ecirc;&auml;&sup3;&ouml;×&acute;&Igrave;&not;
        IIC_wait_ACK();        //
        temp=IIC_Readbyte(0);
        IIC_Stop();
        delay_ms(5);
        return temp;
简化成这样为啥不能用啊?缺少了哪一步吗?
回复 支持 反对

使用道具 举报

7

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2018-7-18
在线时间
37 小时
发表于 2018-12-3 18:59:54 | 显示全部楼层
傻子 发表于 2014-3-8 11:46
回复【3楼】正点原子:

                                                                        3,这里只有当EEPROM容量大于24C02,小于等于24C16的时候才会有用,这个区 ...

是这样吧?
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2019-4-25
在线时间
7 小时
发表于 2019-5-15 11:03:32 | 显示全部楼层
看不懂
回复 支持 反对

使用道具 举报

13

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
288
金钱
288
注册时间
2018-10-30
在线时间
26 小时
发表于 2019-12-18 17:19:49 | 显示全部楼层
正点原子 发表于 2014-3-7 21:36
3,这里只有当EEPROM容量大于24C02,小于等于24C16的时候才会有用,这个区间的24Cxx器件,一个字节不足以表 ...

但是这样有个疑问,比如当要写入的寄存器地址为2047的时候,使用IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)),24C16的器件地址A2 、A1、A0位,被修改成了111,这样选中的还是该芯片吗?
回复 支持 反对

使用道具 举报

1

主题

12

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
263
金钱
263
注册时间
2019-1-6
在线时间
42 小时
发表于 2020-12-28 16:22:11 | 显示全部楼层
看不懂,视频讲得太粗略了
回复 支持 反对

使用道具 举报

15

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2020-12-19
在线时间
20 小时
发表于 2021-2-25 23:07:48 | 显示全部楼层
void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
{                                                                                                                                                                                          
        IIC_Start();  

        IIC_Send_Byte(0XA0);  
        IIC_Wait_Ack();
        IIC_Send_Byte(WriteAddr%256);   
        IIC_Wait_Ack();                                                                                                              
        IIC_Send_Byte(DataToWrite);                                                      
        IIC_Wait_Ack();                                
        IIC_Stop();               
        delay_ms(10);       
}
我是个新手,在网上查阅完各种资料,最后通过理解将程序修改为这样。同理读取的程序也可修改为这样,这个只能应用于24c02.就很好理解了。希望对新手有用
回复 支持 反对

使用道具 举报

0

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2021-1-19
在线时间
37 小时
发表于 2021-8-14 09:43:50 | 显示全部楼层
原子哥牛啊
回复 支持 反对

使用道具 举报

10

主题

39

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2021-12-2
在线时间
26 小时
发表于 2021-12-22 16:40:56 | 显示全部楼层
正点原子 发表于 2014-3-7 21:36
3,这里只有当EEPROM容量大于24C02,小于等于24C16的时候才会有用,这个区间的24Cxx器件,一个字节不足以表 ...

IIC_Send_Byte(0XA0+((WriteAddr/256)<<1))

这个+号改成 | 行不?
回复 支持 反对

使用道具 举报

10

主题

39

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2021-12-2
在线时间
26 小时
发表于 2021-12-22 17:32:08 | 显示全部楼层
正点原子 发表于 2014-3-7 21:29
1,是
2,如果24C02的A0~A2都接GND,地址就是这个。

//初始化IIC接口
void AT24CXX_Init(void)
{
        IIC_Init();
}
//在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的10位寻址吗?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-18 21:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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