OpenEdv-开源电子网

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

AT24C02掉电前后读回来的数,有些正确,有些不正确,怎么回事?

[复制链接]

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
660
金钱
660
注册时间
2013-11-22
在线时间
131 小时
发表于 2014-1-16 09:59:21 | 显示全部楼层 |阅读模式
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-1-16 11:08:06 | 显示全部楼层
没遇到过,是不是底层驱动问题,IIC读取一个字节的时候移动多一位的话就出错了,这个问题我就遇到过,呵呵
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
660
金钱
660
注册时间
2013-11-22
在线时间
131 小时
 楼主| 发表于 2014-1-16 11:24:34 | 显示全部楼层
回复【2楼】Badu_Space:
没遇到过,是不是底层驱动问题,IIC读取一个字节的时候移动多一位的话就出错了,这个问题我就遇到过,呵呵
---------------------------------
呵呵……谢谢你!你说的问题,我会仔细看看,不过我用的驱动是原子哥的标准程序,现在读写字节都可以,就是掉电后,有些字节读回来变了,有些没变,不知道是不是芯片的问题。。。。。
我程序当中设定的是定时保存一些历史数据,同时保存一些系统配置(这些系统配置就存在AT24C02当中),每次开机会先重新读取系统配置(就是做所谓的掉电记忆功能),再根据读回来的数据做一些相应的初始化等等
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-1-16 11:29:57 | 显示全部楼层
回复【3楼】zhp:
---------------------------------
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-1-16 11:31:50 | 显示全部楼层
回复【4楼】Badu_Space:
---------------------------------
我的这个http://www.openedv.com/posts/list/23380.htm
在24c02中调试通过,还没用到项目当中,不过在操作24C32时有问题,呵呵,还没找到问题
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
660
金钱
660
注册时间
2013-11-22
在线时间
131 小时
 楼主| 发表于 2014-1-16 11:52:36 | 显示全部楼层
回复【5楼】Badu_Space:
回复【4楼】Badu_Space: --------------------------------- 我的这个http://www.openedv.com/posts/list/23380.htm 在24c02中调试通过,还没用到项目当中,不过在操作24C32时有问题,呵呵,还没找到问题
---------------------------------

其实我不想说“突然”就好了,但事实是它真的好了,现在掉电后能够读取之前的数据,要说改了什么东西,就改了下面这句,
请问这种写法:
SYSCFG.FLASH_WRPageIndex =(u16)SYSCFG_RCODE[1]*256+SYSCFG_RCODE[2];//改之后
跟下面这种写法:
SYSCFG.FLASH_WRPageIndex =((u16)SYSCFG_RCODE[1])<<8+SYSCFG_RCODE[2];//改之前
不是一个意思么?
其中SYSCFG.FLASH_WRPageIndex是一个u16型的变量,SYSCFG_RCODE是u8型的变量,它是开机后从AT24C02读回来的数据
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-1-16 12:07:37 | 显示全部楼层
回复【6楼】zhp:
---------------------------------
应该是这样
SYSCFG.FLASH_WRPageIndex =((u16)SYSCFG_RCODE[1])*256+SYSCFG_RCODE[2];//改之后 

你少了一个括号,知道为什么了么?
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
660
金钱
660
注册时间
2013-11-22
在线时间
131 小时
 楼主| 发表于 2014-1-16 12:30:13 | 显示全部楼层
回复【7楼】Badu_Space:
回复【6楼】zhp: --------------------------------- 应该是这样 SYSCFG.FLASH_WRPageIndex =((u16)SYSCFG_RCODE[1])*256+SYSCFG_RCODE[2];//改之后  你少了一个括号,知道为什么了么?
---------------------------------

加括号和不加的运算结果有什么区别吗?不是一样的吗?能分析下么?
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-1-16 13:57:13 | 显示全部楼层
回复【8楼】zhp:
---------------------------------
SYSCFG_RCODE[1]这个数组是u8类型的吧,你将这个u8类型的数据 * 256之后的到的数据是0x00,在强制性转换位u16类型的得到的数据还是0x0000,在加上后面的SYSCFG_RCODE[2],得到的数据就是SYSCFG_RCODE[2]的数值
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
660
金钱
660
注册时间
2013-11-22
在线时间
131 小时
 楼主| 发表于 2014-1-16 14:44:46 | 显示全部楼层
强制类型转换是和最近的右边的数据,运算级别低于括号,但是高于乘除、加减、赋值符等
也就是说
SYSCFG.FLASH_WRPageIndex =(u16)SYSCFG_RCODE[1]*256+SYSCFG_RCODE[2];//(1)
SYSCFG.FLASH_WRPageIndex =((u16)SYSCFG_RCODE[1])*256+SYSCFG_RCODE[2];//(2)
SYSCFG.FLASH_WRPageIndex =(u16)(SYSCFG_RCODE[1]*256)+SYSCFG_RCODE[2];//(3)
(1)和(2)是一样的意思,你说的是第(3)种吧?
回复 支持 反对

使用道具 举报

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
660
金钱
660
注册时间
2013-11-22
在线时间
131 小时
 楼主| 发表于 2014-1-16 14:47:22 | 显示全部楼层
其实问题就变成了:是强制类型转换的优先级高还是乘法运算的优先级高?
回复 支持 反对

使用道具 举报

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
发表于 2014-1-16 21:46:59 | 显示全部楼层
你的本意是想先乘再转换还是先转换再乘?建议勤打括号!记优先级有时候真的容易搞错,而且写成到处都是优先级判断的表达式也不易读。
回复 支持 反对

使用道具 举报

44

主题

225

帖子

0

精华

高级会员

Rank: 4

积分
660
金钱
660
注册时间
2013-11-22
在线时间
131 小时
 楼主| 发表于 2014-1-17 08:53:40 | 显示全部楼层
回复【12楼】hechao3225:
你的本意是想先乘再转换还是先转换再乘?建议勤打括号!记优先级有时候真的容易搞错,而且写成到处都是优先级判断的表达式也不易读。
---------------------------------
恩,好的,谢谢提醒!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 02:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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