OpenEdv-开源电子网

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

纠正原子STM32例程中IIC的一处错误

[复制链接]

1

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2014-4-16
在线时间
7 小时
发表于 2015-6-20 19:10:49 | 显示全部楼层 |阅读模式
最近做一个STM32项目时移植了原子STM32例程中的模拟IIC驱动程序,调试时发现错误经简单排查发现一处错误,先分享出来避免其他人遇到同样问题,也希望原子更正程序源码(因为我目前所有开发板都有这出错误)

原子源代码

首先看读数据的


1、椭圆框内有一个等待ACK应答  IF语句结束后又一个等待ACK应答  当定义器件大于AT24C16时 就会连续执行两个等待ACK造成 读数失败。
2、方框内 当器件小于等于AT24C16 执行IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));   我觉得这个0XA0+((WriteAddr/256)<<1)完全没必要,我们来分析下  当器件小于等于AT24C16 时 地址范围是0-0xff 那么WriteAddr/256=0   0<<1=0 在加上0xa0还是0xa0 那么执行这个是什么作用的,而且这里是发送的器件地址,一般硬件确定了地址就确定了,及时想做地址可变的也不应该跟数据地址做关联,而是应该跟硬件上的A0 A1 A2 通过IO读取地址做关联,对此表示十分疑惑,所以 直接IIC_Send_Byte(0XA0); 可以了 ,
3、读字节
内同样有IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));  问题同2.

另外通过删除IF内的ACK后AT
24C512工作正常,再此也算帮原子测试AT24C512了。

更多内容回复后可查看
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

18

主题

139

帖子

0

精华

高级会员

Rank: 4

积分
560
金钱
560
注册时间
2014-10-29
在线时间
228 小时
发表于 2015-6-20 20:48:10 | 显示全部楼层
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-6-20 23:19:01 | 显示全部楼层
谢谢分享,这个bug已经修正了,最新例程都已经修改了
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2014-4-16
在线时间
7 小时
 楼主| 发表于 2015-6-29 21:03:58 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
^_^
回复 支持 反对

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2015-1-23
在线时间
0 小时
发表于 2015-6-30 16:19:46 | 显示全部楼层
...好东东谢谢分享
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2015-8-31
在线时间
9 小时
发表于 2015-9-16 14:56:07 | 显示全部楼层
学习了。。。。。
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2016-8-10
在线时间
16 小时
发表于 2016-8-14 11:14:31 | 显示全部楼层
那如果AT24C04那种寻址能到512的怎么办   他写的这个不就是为了能扩大寻址范围嘛?? 如果只发送0xa0  那么不就是只有器件地址了
回复 支持 反对

使用道具 举报

2

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2015-10-9
在线时间
10 小时
发表于 2016-8-19 14:34:10 | 显示全部楼层
"当器件小于等于AT24C16 时 地址范围是0-0xff"这句怎么理解的?小于等于AT24C16时候寻址空间为0~2047啊,地址范围怎么是0~0xff的?
回复 支持 反对

使用道具 举报

12

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2016-6-26
在线时间
29 小时
发表于 2016-8-21 16:34:20 | 显示全部楼层
厉害!!!专业
回复 支持 反对

使用道具 举报

12

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2016-6-26
在线时间
29 小时
发表于 2016-8-21 16:35:25 | 显示全部楼层
请教你一个问题。

IIC_Send_Byte(ReadAddr%256);   //发送低地址


为什么发送低地址,要用求余啊!!!想不明白。

能给简单说一下吗,谢谢。

360反馈意见截图16390410569484.jpg
回复 支持 反对

使用道具 举报

3

主题

18

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2016-7-28
在线时间
4 小时
发表于 2016-8-24 08:47:06 | 显示全部楼层
好。。。。。。
回复 支持 反对

使用道具 举报

12

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
288
金钱
288
注册时间
2016-7-20
在线时间
33 小时
发表于 2016-8-24 09:33:15 | 显示全部楼层
zzsj1990 发表于 2016-8-21 16:35
请教你一个问题。

IIC_Send_Byte(ReadAddr%256);   //发送低地址

2的8次方正好是256,而低8位最大只能有255,所以对256取余就等于只取第八位,相当于
Addr&0x0f
回复 支持 反对

使用道具 举报

9

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
372
金钱
372
注册时间
2016-8-15
在线时间
55 小时
发表于 2016-8-24 09:36:50 | 显示全部楼层
回复 支持 反对

使用道具 举报

12

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2016-6-26
在线时间
29 小时
发表于 2016-8-26 09:29:51 | 显示全部楼层
空心杯 发表于 2016-8-24 09:33
2的8次方正好是256,而低8位最大只能有255,所以对256取余就等于只取第八位,相当于
Addr&0x0f

哦,醍醐灌顶,终于明白其本质了,高于8位的全是256的倍数,舍去。。。。。。

厉害
回复 支持 反对

使用道具 举报

5

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
368
金钱
368
注册时间
2015-9-7
在线时间
82 小时
发表于 2016-9-5 15:32:22 | 显示全部楼层
顶!d=====( ̄▽ ̄*)b
回复 支持 反对

使用道具 举报

10

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
454
金钱
454
注册时间
2016-4-22
在线时间
82 小时
发表于 2016-9-16 15:59:18 | 显示全部楼层
同样遇到这个问题
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2014-2-22
在线时间
3 小时
发表于 2016-9-20 14:42:08 | 显示全部楼层
好资料,我也看看。
回复 支持 反对

使用道具 举报

3

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2016-6-22
在线时间
56 小时
发表于 2016-9-28 15:32:45 | 显示全部楼层
正点原子 发表于 2015-6-20 23:19
谢谢分享,这个bug已经修正了,最新例程都已经修改了

怎么我论坛上下载的还是没有修改的
回复 支持 反对

使用道具 举报

8

主题

45

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2016-9-14
在线时间
56 小时
发表于 2016-9-29 17:25:20 | 显示全部楼层
厉害!
回复 支持 反对

使用道具 举报

12

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
275
金钱
275
注册时间
2014-7-2
在线时间
41 小时
发表于 2016-10-10 14:40:26 | 显示全部楼层
IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));  这句 我也很疑惑 不晓得  ((WriteAddr/256)<<1)是干嘛用的  这是发送器件地址直接A0不就行了
回复 支持 反对

使用道具 举报

7

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2016-10-10
在线时间
16 小时
发表于 2016-10-10 15:22:41 | 显示全部楼层
大神!!!!!!
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2012-11-17
在线时间
10 小时
发表于 2016-11-5 19:36:06 | 显示全部楼层
顶!!!!!!
回复 支持 反对

使用道具 举报

9

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
191
金钱
191
注册时间
2016-10-11
在线时间
32 小时
发表于 2016-11-13 17:17:52 | 显示全部楼层
可以可以!
回复 支持 反对

使用道具 举报

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
金钱
302
注册时间
2016-10-1
在线时间
77 小时
发表于 2016-11-27 23:07:42 | 显示全部楼层
有道理
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 13:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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