OpenEdv-开源电子网

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

IIC的读函数,不解,求大神。

[复制链接]

56

主题

520

帖子

0

精华

高级会员

Rank: 4

积分
964
金钱
964
注册时间
2014-11-18
在线时间
160 小时
发表于 2016-2-23 11:40:24 | 显示全部楼层 |阅读模式
20金钱
根据IIC的理论,应该是SCLK拉低的时候,紧接着传输数据,然后再拉高稳定数据。   根据这一理论查看的IIC写函数确实是这样的。附上图片:






但是在看到读函数的时候确实这样的。附上图片:


看看大神是怎么解释的 ,给个完美的解释。
我的IIC写.png

IIC读函数

IIC读函数

最佳答案

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

因果关系有问题。。。 因为时钟线高时改变数据线会被视为起始和停止信号,所以只能在时钟线低时改变数据线。 不是时钟线低的时候读写数据,低的时候是改变数据线。读写包含高电平和低电平整个过程。 既然只能低电平改变数据,也就是写的一方只能在低电平去动数据线。那么读的一方就等写完再读。时钟线低时,写方是有可能随时改变数据线的,所以读方实在没必要非要在不确定写完没写完的状态下去读。 iic强制规定: 1 ...
自己选择的路,成家前走完。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2016-2-23 11:40:25 | 显示全部楼层
aiyeba 发表于 2016-2-23 16:58
写函数就是在SCL=0;的时候进行的  写完以后再拉高电平。难道是写函数和读函数有稍微的差别。
而且我的 ...

因果关系有问题。。。

因为时钟线高时改变数据线会被视为起始和停止信号,所以只能在时钟线低时改变数据线。

不是时钟线低的时候读写数据,低的时候是改变数据线。读写包含高电平和低电平整个过程。

既然只能低电平改变数据,也就是写的一方只能在低电平去动数据线。那么读的一方就等写完再读。时钟线低时,写方是有可能随时改变数据线的,所以读方实在没必要非要在不确定写完没写完的状态下去读。

iic强制规定:
1.主机我写,从机你读时,我拉低时钟线,我写。然后我把时钟线拉高表示我写完了,不改了,你放心读你的,你抓紧时间在时钟线高期间读取。时间到了我又拉低时钟线写第2位。。。
2.主机我读,从机你写时,我拉低时钟线,你在我拉低期间必须给我写最高1位,然后我给你的时间到了后就拉高时钟线,你就不能写了,我可以放心读了。然后再拉低时钟线给你写第2位。。。。。
小小蜗牛
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2016-2-23 15:33:51 | 显示全部楼层
除了start和stop。SDA只能在SCL低电平时改变。

我这样理解:
写的时候,要改变SDA,必须先拉低SCL.
读的时候,SCL拉低时,SDA在改变中。SCL拉高时,SDA是稳定的。那就应该是先把SCL拉低让发送端改变SDA,然后拉高读取发送端给的SDA信号。再拉低重复。
小小蜗牛
回复

使用道具 举报

56

主题

520

帖子

0

精华

高级会员

Rank: 4

积分
964
金钱
964
注册时间
2014-11-18
在线时间
160 小时
 楼主| 发表于 2016-2-23 16:16:54 | 显示全部楼层
本帖最后由 aiyeba 于 2016-2-23 17:25 编辑
jiutianshenjian 发表于 2016-2-23 15:33
除了start和stop。SDA只能在SCL低电平时改变。

我这样理解:

可是从原子哥的IIC来看,他的读取函数是SCL=0;delay();SCL=1;马上就拉高了。然后接着读  数据传输if(SDA_READ)......。   能不能把这个数据传输放到delay()的后面,求解。
自己选择的路,成家前走完。
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2016-2-23 16:50:13 | 显示全部楼层
从字面意思看,是读SDA电平。

SCL高电平时SDA是稳定的。低电平时,延时后应该也稳定了。但是你为什么非要在SDA可能改变的条件下读呢,明明有稳定的条件可以读。
小小蜗牛
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3772
金钱
3772
注册时间
2015-4-26
在线时间
765 小时
发表于 2016-2-23 16:53:00 | 显示全部楼层
aiyeba 发表于 2016-2-23 16:16
可是从原子哥的IIC来看,他的读取函数是SCL=0;delay();SCL=1;马上就拉高了。然后接着写  数据传输if ...

貌似可以,但不符合IIC的协议,你读的时候是针对元件的,需要给时钟信号一个低电平通知元件放出数据,延时后再给一个高电平来完成一个时钟周期。应该是在延时后数据已经稳定了,但IIC的协议是高电平读数据的
我有故事,你有酒吗
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3772
金钱
3772
注册时间
2015-4-26
在线时间
765 小时
发表于 2016-2-23 16:55:05 | 显示全部楼层
aiyeba 发表于 2016-2-23 16:16
可是从原子哥的IIC来看,他的读取函数是SCL=0;delay();SCL=1;马上就拉高了。然后接着写  数据传输if ...

另外你这句话不是  “写数据传输”!!!是读,是CPU在读
我有故事,你有酒吗
回复

使用道具 举报

56

主题

520

帖子

0

精华

高级会员

Rank: 4

积分
964
金钱
964
注册时间
2014-11-18
在线时间
160 小时
 楼主| 发表于 2016-2-23 16:58:29 | 显示全部楼层
jiutianshenjian 发表于 2016-2-23 16:50
从字面意思看,是读SDA电平。

SCL高电平时SDA是稳定的。低电平时,延时后应该也稳定了。但是你为什么非 ...

写函数就是在SCL=0;的时候进行的  写完以后再拉高电平。难道是写函数和读函数有稍微的差别。
而且我的理解是:时钟信号低电平的时候是开始读写数据,这个时候读写确实是不稳定,所以读写完后的数据需要保证他的稳定,这个时候我们只需把时钟信号拉高,就能把数据稳稳地锁住。
自己选择的路,成家前走完。
回复

使用道具 举报

56

主题

520

帖子

0

精华

高级会员

Rank: 4

积分
964
金钱
964
注册时间
2014-11-18
在线时间
160 小时
 楼主| 发表于 2016-2-23 17:24:08 | 显示全部楼层
本帖最后由 aiyeba 于 2016-2-23 17:26 编辑
来俩不甜的 发表于 2016-2-23 16:55
另外你这句话不是  “写数据传输”!!!是读,是CPU在读

我是想说读函数,不好意思。     写函数是拉低    然后开始数据写入 然后再拉高啊。

至于你说的高电平读写数据,我不是很理解,我所看到的都是低电平开始读写,是开始,开始,
高电平保持。就是你低电平读取的数据(0或者1)还需要高电平来稳住他。
自己选择的路,成家前走完。
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2016-2-23 21:13:42 | 显示全部楼层
其实不是强制规定的,是我自己猜的
小小蜗牛
回复

使用道具 举报

56

主题

520

帖子

0

精华

高级会员

Rank: 4

积分
964
金钱
964
注册时间
2014-11-18
在线时间
160 小时
 楼主| 发表于 2016-2-24 13:33:44 | 显示全部楼层
jiutianshenjian 发表于 2016-2-23 21:13
其实不是强制规定的,是我自己猜的

我的天,蜗牛哥你这理解太精辟了。  我要拜你为师。
自己选择的路,成家前走完。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 02:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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