OpenEdv-开源电子网

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

24c16写地址超过256,又开始从0地址写数据了!求解决办法

[复制链接]

11

主题

80

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4493
金钱
4493
注册时间
2016-8-2
在线时间
51 小时
发表于 2016-11-1 11:55:28 | 显示全部楼层 |阅读模式
5金钱
使用原子哥的IIC驱动写24c16,0-255地址数据读写都是正常的,但是当写到第256个地址的时候数据又从地址0开始写了!各位有没有遇到过这个问题!写的代码
[mw_shl_code=c,true]void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
{       
        u8 eepaddr;
    IIC_Start();  
        if(EE_TYPE>AT24C16)
        {
                IIC_Send_Byte(0XA0);            //发送写命令
                IIC_Wait_Ack();
                eepaddr = (u8)WriteAddr>>8;
                IIC_Send_Byte(eepaddr);//发送高地址          
        }else IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));   //发送器件地址0XA0,写数据          
        IIC_Wait_Ack();          
        eepaddr = (u8)WriteAddr&0x00ff;
    IIC_Send_Byte(eepaddr);   //发送低地址
        IIC_Wait_Ack();                                                                                                              
        IIC_Send_Byte(DataToWrite);     //发送字节                                                          
        IIC_Wait_Ack();                                
    IIC_Stop();//产生一个停止条件
        delay_ms(10);         
}[/mw_shl_code]




读的代码

[mw_shl_code=c,true]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;
}[/mw_shl_code]

最佳答案

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

IIC_Send_Byte(0XA1); 这句程序改成 : IIC_Send_Byte((0XA0+((ReadAddr/256)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

19

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2015-4-29
在线时间
38 小时
发表于 2016-11-1 11:55:29 | 显示全部楼层

IIC_Send_Byte(0XA1);           
这句程序改成 :
IIC_Send_Byte((0XA0+((ReadAddr/256)<<1)) | 0x01);   就可以了         
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2016-11-1 13:25:48 | 显示全部楼层
对写入地址进行判断限制
回复

使用道具 举报

11

主题

80

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4493
金钱
4493
注册时间
2016-8-2
在线时间
51 小时
 楼主| 发表于 2016-11-1 13:39:28 | 显示全部楼层
龙之谷 发表于 2016-11-1 13:25
对写入地址进行判断限制

没明白 ?能在解释一下吗?
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2016-11-1 13:55:24 | 显示全部楼层
EE_TYPE>AT24C16改成大于等于试试
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

11

主题

80

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4493
金钱
4493
注册时间
2016-8-2
在线时间
51 小时
 楼主| 发表于 2016-11-1 14:01:20 | 显示全部楼层
龙之谷 发表于 2016-11-1 13:55
EE_TYPE>AT24C16改成大于等于试试

完全不知道写哪去了,数据读写全部都是错误!
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2016-3-26
在线时间
3 小时
发表于 2016-11-5 16:02:11 | 显示全部楼层
是不是写完后,要地址换页?到255时,再重新写一下,下一个地址。让它跳过来?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2016-11-6 19:35:42 | 显示全部楼层
直接用我们例程,就可以支持24c16才对,只需要改一个宏定义
回复

使用道具 举报

11

主题

80

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4493
金钱
4493
注册时间
2016-8-2
在线时间
51 小时
 楼主| 发表于 2016-11-8 12:18:12 | 显示全部楼层
正点原子 发表于 2016-11-6 19:35
直接用我们例程,就可以支持24c16才对,只需要改一个宏定义

使用的就是原子哥您列成 我用的芯片 是FMC24Cl16。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2016-11-10 00:10:57 | 显示全部楼层
shaozp 发表于 2016-11-8 12:18
使用的就是原子哥您列成 我用的芯片 是FMC24Cl16。

那就奇怪了
换AT24C16试试
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2012-2-2
在线时间
11 小时
发表于 2016-12-27 16:37:55 | 显示全部楼层
shaozp 发表于 2016-11-8 12:18
使用的就是原子哥您列成 我用的芯片 是FMC24Cl16。

解决了么  我也遇到相似问题了
回复

使用道具 举报

19

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2015-4-29
在线时间
38 小时
发表于 2021-3-24 17:03:27 | 显示全部楼层
没用过AT24C16,我用的是TI的24LC16B,用原子的例程确实有问题,读写0~255没问题,超过这个地址就写不进去了,什么11位地址,高3位放在器件地址用来对页地址/块地址进行操作之类的都试过了,还是无法读写超过255的地址
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2021-3-25 01:47:20 | 显示全部楼层
(u8)WriteAddr>>8,改成:(u8)(WriteAddr>>8)试试看
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

19

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2015-4-29
在线时间
38 小时
发表于 2021-3-25 11:00:29 | 显示全部楼层
正点原子 发表于 2021-3-25 01:47
(u8)WriteAddr>>8,改成:(u8)(WriteAddr>>8)试试看

原子哥,你说的(u8)WriteAddr>>8,改成:(u8)(WriteAddr>>8)在那部分程序里面改?整个程序只有在if(EE_TYPE>AT24C16)时才会有WriteAddr>>8的操作,但是24C16芯片不用这句,能指点一下吗?

  1. void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
  2. {                                                                                                                                                                                          
  3.         IIC_Start();  
  4.         if(EE_TYPE>AT24C16)                                                                               
  5.         {                                                                                                  
  6.                 IIC_Send_Byte(0XA0);            //发送写命令,起始地址为0
  7.                 IIC_Wait_Ack();
  8.                 IIC_Send_Byte(WriteAddr>>8);//发送高地址
  9.         }else
  10.         {
  11.                 IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));   //发送器件地址0XA0,写数据
  12.         }         
  13.         IIC_Wait_Ack();                                          
  14.         IIC_Send_Byte(WriteAddr%256);   //发送低地址
  15.         IIC_Wait_Ack();                                                                                                              
  16.         IIC_Send_Byte(DataToWrite);     //发送字节                                                          
  17.         IIC_Wait_Ack();                                
  18.         IIC_Stop();                                                        //产生一个停止条件
  19.         delay_ms(10);                                                        
  20. }
复制代码
回复

使用道具 举报

19

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2015-4-29
在线时间
38 小时
发表于 2021-3-25 12:59:11 | 显示全部楼层
我找到原子程序中的BUG了,现在用原子的程序完全没有问题
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2021-3-26 01:56:15 | 显示全部楼层
Sunny^o^ 发表于 2021-3-25 12:59
我找到原子程序中的BUG了,现在用原子的程序完全没有问题

分享下?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2021-3-30 02:09:07 | 显示全部楼层
Sunny^o^ 发表于 2016-11-1 11:55
IIC_Send_Byte(0XA1);           
这句程序改成 :
IIC_Send_Byte((0XA0+((ReadAddr/256)

谢谢分享
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2020-2-17
在线时间
1 小时
发表于 2022-7-30 09:45:02 | 显示全部楼层
Sunny^o^ 发表于 2016-11-1 11:55
IIC_Send_Byte(0XA1);           
这句程序改成 :
IIC_Send_Byte((0XA0+((ReadAddr/256)

太感谢了!
折腾了2天了硬生生就没发现这一点
16年的问题22年了依然存在T-T
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-8 01:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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