OpenEdv-开源电子网

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

【求助】AT24C256读写单字节正确,但写入多字节异常

[复制链接]

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2017-6-27
在线时间
22 小时
发表于 2022-12-9 15:35:32 | 显示全部楼层 |阅读模式
5金钱


用原子哥的程序I2C读写AT24C256,单字节读写永远正确。但读写两个以上字节的时候,前面写入的数据会被后面写入的数据影响。
比如下面这段例子,写在0位置的0x35读出来之后就变成了0x04,而写在40位置的数据读取出来是正确的。。。
而且还有更加诡异的事情,两个数据写入的地址相隔4096以上,那么就彼此互不影响,完全正确。。。
感觉写入数据的时候把周围一大片地址里面的数据全部擦掉了。。。
原因不明,求教诸位大神。。。


                                AT24C256_WriteOneByte(0,0x35);
                                delay_ms(50);

                                AT24C256_WriteOneByte(40,0x04);
                                delay_ms(50);

                                program13_buf[0]=AT24C256_ReadOneByte(0);
                                program13_buf[1]=AT24C256_ReadOneByte(40);

最佳答案

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

破案了,at24c08的地址线只有a2有效,导致和at24c256的地址冲突。。。 谢谢诸位了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2017-6-27
在线时间
22 小时
 楼主| 发表于 2022-12-9 15:35:33 | 显示全部楼层
破案了,at24c08的地址线只有a2有效,导致和at24c256的地址冲突。。。 谢谢诸位了
回复

使用道具 举报

0

主题

103

帖子

0

精华

高级会员

Rank: 4

积分
632
金钱
632
注册时间
2016-3-30
在线时间
67 小时
发表于 2022-12-10 13:36:20 | 显示全部楼层
每个字节写入完成后的延时时间要足够。所以你先试下把延时的50ms略微增大点?也许你的那个50ms不到50ms呢?
回复

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2017-6-27
在线时间
22 小时
 楼主| 发表于 2022-12-10 17:30:32 | 显示全部楼层
改成500ms都没用,不是延时不够导致的。。。
回复

使用道具 举报

0

主题

103

帖子

0

精华

高级会员

Rank: 4

积分
632
金钱
632
注册时间
2016-3-30
在线时间
67 小时
发表于 2022-12-10 17:59:59 | 显示全部楼层
那你就看看你的IIC写函数,是不是应答没有做好?
回复

使用道具 举报

12

主题

129

帖子

0

精华

高级会员

Rank: 4

积分
910
金钱
910
注册时间
2018-4-5
在线时间
69 小时
发表于 2022-12-12 10:06:19 | 显示全部楼层
这个写单个字节都要擦除的吗?我记得擦除都是按页擦除的,但是如果每次都擦除的话,前面的数据应该被恢复成默认的才对,如果输出的和后面的一样的话,有没有可能是你程序里面输出的值调用错了呢。。。你可以多试试,例如写入3个单字节,地址不同,数值不同,然后将一片区域内的值全部读取,然后输出,看看是不是被影响了,包括没有写的地址。
保守秘密,守望共济,等价交换,尊重知识,探求真知。
回复

使用道具 举报

3

主题

117

帖子

0

精华

高级会员

Rank: 4

积分
559
金钱
559
注册时间
2018-10-3
在线时间
107 小时
发表于 2022-12-12 12:30:40 | 显示全部楼层
如果是4096没问题的话。 估计是按页擦除的。 比如你写一个字节他会擦除整页。写4096个字节也会擦除整页。所以你先写了一个字节,后面又写了一个,前面那个写的就被擦掉了。
回复

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2017-6-27
在线时间
22 小时
 楼主| 发表于 2022-12-12 14:26:55 | 显示全部楼层
wklhwkl 发表于 2022-12-12 12:30
如果是4096没问题的话。 估计是按页擦除的。 比如你写一个字节他会擦除整页。写4096个字节也会擦除整页。所 ...

即便按页擦除,那这芯片的一页才64个字节,不可能擦这么多。。。
回复

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2017-6-27
在线时间
22 小时
 楼主| 发表于 2022-12-12 14:34:53 | 显示全部楼层
TheHellc 发表于 2022-12-12 10:06
这个写单个字节都要擦除的吗?我记得擦除都是按页擦除的,但是如果每次都擦除的话,前面的数据应该被恢复成 ...

确实,后写入的单字节把这一片区域都写入了同样的数据,那这是什么原因呢?并不是输出的值调用错了。。。
回复

使用道具 举报

4

主题

55

帖子

0

精华

高级会员

Rank: 4

积分
538
金钱
538
注册时间
2019-5-14
在线时间
231 小时
发表于 2022-12-12 15:31:48 | 显示全部楼层
应该是读函数写的不对  你每次读的都是最后写进去的那个地址的数据
回复

使用道具 举报

4

主题

55

帖子

0

精华

高级会员

Rank: 4

积分
538
金钱
538
注册时间
2019-5-14
在线时间
231 小时
发表于 2022-12-12 15:33:21 | 显示全部楼层
把你的读和写的代码 贴出来 才能看出来问题
回复

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2017-6-27
在线时间
22 小时
 楼主| 发表于 2022-12-12 15:48:37 | 显示全部楼层
读写函数完全跟原子哥一样

u8 AT24C256_ReadOneByte(u16 ReadAddr2)
{                                  
        u8 temp=0;                                                                                                                                                               
    IIC_Start();  
        if(EE_TYPE2>AT24C16)
        {
                IIC_Send_Byte(0XA6);           // 发送写命令
                IIC_Wait_Ack();
                IIC_Send_Byte((ReadAddr2>>8));//发送高地址
                
        }
       
        else IIC_Send_Byte(0XA6+((ReadAddr2/256)<<1));   //发送器件地址0XA6 写数据

        IIC_Wait_Ack();
    IIC_Send_Byte(ReadAddr2%256);   //发送低地址
        IIC_Wait_Ack();            
        IIC_Start();                     
        IIC_Send_Byte(0XA7);           //进入接收模式                          
        IIC_Wait_Ack();         
    temp=IIC_Read_Byte(0);
   
    IIC_Stop();//2úéúò???í£?1ì??t            
        return temp;
}


void AT24C256_WriteOneByte(u16 WriteAddr2,u8 DataToWrite2)
{                                                                                                                                                                                          
    IIC_Start();  
        if(EE_TYPE2>AT24C16)
        {
                IIC_Send_Byte(0XA6);            // 发送写命令
                IIC_Wait_Ack();
                IIC_Send_Byte((WriteAddr2>>8));//发送高地址            
        }
       
        else
        {
                IIC_Send_Byte(0XA6+((WriteAddr2/256)<<1));    //发送器件地址0XA6 写数据
        }         
        IIC_Wait_Ack();          
    IIC_Send_Byte(WriteAddr2%256);   //发送低地址
        IIC_Wait_Ack();                                                                                                              
        IIC_Send_Byte(DataToWrite2);     //发送字节                                                  
        IIC_Wait_Ack();                                
    IIC_Stop();//2úéúò???í£?1ì??t
        delay_ms(100);         
}
回复

使用道具 举报

4

主题

55

帖子

0

精华

高级会员

Rank: 4

积分
538
金钱
538
注册时间
2019-5-14
在线时间
231 小时
发表于 2022-12-12 16:05:13 | 显示全部楼层
.h里的  #define EE_TYPE AT24C02           这个你改了么
回复

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2017-6-27
在线时间
22 小时
 楼主| 发表于 2022-12-12 16:43:21 | 显示全部楼层
南枯123 发表于 2022-12-12 16:05
.h里的  #define EE_TYPE AT24C02           这个你改了么

改了
回复

使用道具 举报

4

主题

55

帖子

0

精华

高级会员

Rank: 4

积分
538
金钱
538
注册时间
2019-5-14
在线时间
231 小时
发表于 2022-12-12 16:45:49 | 显示全部楼层

那就真的有点讲不通了
回复

使用道具 举报

5

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2017-6-27
在线时间
22 小时
 楼主| 发表于 2022-12-13 15:11:56 | 显示全部楼层

我发现同一iic总线上的at24c08器件会对它产生影响,把at24c08拆掉,at24c256读写就正常了,这是怎么回事???求教诸位大神。。。
回复

使用道具 举报

12

主题

129

帖子

0

精华

高级会员

Rank: 4

积分
910
金钱
910
注册时间
2018-4-5
在线时间
69 小时
发表于 2022-12-14 16:42:50 | 显示全部楼层
paishen 发表于 2022-12-13 17:02
破案了,at24c08的地址线只有a2有效,导致和at24c256的地址冲突。。。 谢谢诸位了

不过最简单的办法还是,找个IIC数据监听器,直接把数据全部读出来,问题很快就能解决了,一般这种错误大概率是发送错误或者驱动错误。不过解决了就好。
保守秘密,守望共济,等价交换,尊重知识,探求真知。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 19:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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